Skip to content

Commit 87c6f81

Browse files
authored
Merge pull request #426 from diffblue/procedural_continuous_assignment_to_variable
Verilog: procedural continuous assignments
2 parents 27cb88c + d147813 commit 87c6f81

9 files changed

+70
-12
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
procedural_continuous_assignment_to_variable.v
3+
4+
^file .* line 7: synthesis of procedural continuous assignment not supported$
5+
^EXIT=2$
6+
^SIGNAL=0$
7+
--
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module main(input i);
2+
3+
reg some_reg;
4+
5+
// procedural continuous assignment
6+
always @i begin
7+
assign some_reg = i;
8+
end
9+
10+
// should pass
11+
always assert p1: some_reg == i;
12+
13+
endmodule

src/hw_cbmc_irep_ids.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ IREP_ID_ONE(release)
6565
IREP_ID_ONE(force)
6666
IREP_ID_ONE(deassign)
6767
IREP_ID_ONE(continuous_assign)
68+
IREP_ID_ONE(procedural_continuous_assign)
6869
IREP_ID_ONE(wait)
6970
IREP_ID_ONE(verilog_assert_property)
7071
IREP_ID_ONE(verilog_assume_property)

src/verilog/parser.y

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2542,7 +2542,7 @@ nonblocking_assignment:
25422542

25432543
procedural_continuous_assignment:
25442544
TOK_ASSIGN variable_assignment
2545-
{ init($$, ID_continuous_assign); mto($$, $2); }
2545+
{ init($$, ID_procedural_continuous_assign); mto($$, $2); }
25462546
| TOK_DEASSIGN variable_lvalue
25472547
{ init($$, ID_deassign); mto($$, $2); }
25482548
| TOK_FORCE variable_assignment

src/verilog/verilog_elaborate.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,9 @@ void verilog_typecheckt::collect_symbols(const verilog_statementt &statement)
680680
{
681681
collect_symbols(to_verilog_label_statement(statement).statement());
682682
}
683+
else if(statement.id() == ID_procedural_continuous_assign)
684+
{
685+
}
683686
else
684687
DATA_INVARIANT(false, "unexpected statement: " + statement.id_string());
685688
}

src/verilog/verilog_expr.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,22 +1382,23 @@ inline verilog_repeatt &to_verilog_repeat(exprt &expr)
13821382
class verilog_procedural_continuous_assignt:public verilog_statementt
13831383
{
13841384
public:
1385-
verilog_procedural_continuous_assignt():verilog_statementt(ID_continuous_assign)
1385+
verilog_procedural_continuous_assignt()
1386+
: verilog_statementt(ID_procedural_continuous_assign)
13861387
{
13871388
}
13881389
};
13891390

13901391
inline const verilog_procedural_continuous_assignt &
13911392
to_verilog_procedural_continuous_assign(const exprt &expr)
13921393
{
1393-
PRECONDITION(expr.id() == ID_continuous_assign);
1394+
PRECONDITION(expr.id() == ID_procedural_continuous_assign);
13941395
return static_cast<const verilog_procedural_continuous_assignt &>(expr);
13951396
}
13961397

13971398
inline verilog_procedural_continuous_assignt &
13981399
to_verilog_procedural_continuous_assign(exprt &expr)
13991400
{
1400-
PRECONDITION(expr.id() == ID_continuous_assign);
1401+
PRECONDITION(expr.id() == ID_procedural_continuous_assign);
14011402
return static_cast<verilog_procedural_continuous_assignt &>(expr);
14021403
}
14031404

src/verilog/verilog_synthesis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2580,7 +2580,7 @@ void verilog_synthesist::synth_statement(
25802580
synth_case(statement);
25812581
else if(statement.id()==ID_blocking_assign)
25822582
synth_assign(statement, true);
2583-
else if(statement.id()==ID_continuous_assign)
2583+
else if(statement.id() == ID_procedural_continuous_assign)
25842584
{
25852585
throw errort().with_location(statement.source_location())
25862586
<< "synthesis of procedural continuous assignment not supported";

src/verilog/verilog_typecheck.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,17 @@ void verilog_typecheckt::check_lhs(
723723
<< to_string(symbol.type) << " on line " << symbol.location.get_line()
724724
<< '.';
725725
}
726+
break;
726727

728+
case A_PROCEDURAL_CONTINUOUS:
729+
if(!symbol.is_state_var && !symbol.is_lvalue)
730+
{
731+
throw errort().with_location(lhs.source_location())
732+
<< "procedural continuous assignment to a net\n"
733+
<< "Identifier " << symbol.display_name() << " is declared as "
734+
<< to_string(symbol.type) << " on line " << symbol.location.get_line()
735+
<< '.';
736+
}
727737
break;
728738
}
729739
}
@@ -753,10 +763,27 @@ Function: verilog_typecheckt::convert_procedural_continuous_assign
753763
void verilog_typecheckt::convert_procedural_continuous_assign(
754764
verilog_procedural_continuous_assignt &statement)
755765
{
756-
// down and up again
757-
convert_continuous_assign(
758-
static_cast<verilog_continuous_assignt &>(
759-
static_cast<exprt &>(statement)));
766+
// On path to deprecation.
767+
for(auto &assignment : statement.operands())
768+
{
769+
if(assignment.id() != ID_equal || assignment.operands().size() != 2)
770+
{
771+
throw errort().with_location(assignment.source_location())
772+
<< "malformed procedural continuous assignment";
773+
}
774+
775+
assignment.type() = bool_typet();
776+
777+
exprt &lhs = to_binary_expr(assignment).lhs();
778+
exprt &rhs = to_binary_expr(assignment).rhs();
779+
780+
convert_expr(lhs);
781+
convert_expr(rhs);
782+
783+
propagate_type(rhs, lhs.type());
784+
785+
check_lhs(lhs, A_PROCEDURAL_CONTINUOUS);
786+
}
760787
}
761788

762789
/*******************************************************************\
@@ -1417,7 +1444,7 @@ void verilog_typecheckt::convert_statement(
14171444
convert_case(to_verilog_case_base(statement));
14181445
else if(statement.id()==ID_blocking_assign)
14191446
convert_assign(to_verilog_assign(statement), true);
1420-
else if(statement.id()==ID_continuous_assign)
1447+
else if(statement.id() == ID_procedural_continuous_assign)
14211448
convert_procedural_continuous_assign(
14221449
to_verilog_procedural_continuous_assign(statement));
14231450
else if(

src/verilog/verilog_typecheck.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,14 @@ class verilog_typecheckt:
126126
void interface_statement(const class verilog_statementt &);
127127

128128
// type checking
129-
130-
typedef enum { A_CONTINUOUS, A_BLOCKING, A_NON_BLOCKING } vassignt;
129+
130+
typedef enum
131+
{
132+
A_CONTINUOUS,
133+
A_BLOCKING,
134+
A_NON_BLOCKING,
135+
A_PROCEDURAL_CONTINUOUS
136+
} vassignt;
131137

132138
// statements
133139
void convert_statement(class verilog_statementt &);

0 commit comments

Comments
 (0)