Skip to content

Commit d147813

Browse files
committed
Verilog: procedural continuous assignments
This gives a separate id to procedural continuous assignments, to avoid confusion with continuous assignments. These are on path to deprecation, and we do not have synthesis support for them.
1 parent 2fc1c2d commit d147813

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
@@ -736,6 +736,9 @@ void verilog_typecheckt::collect_symbols(const verilog_statementt &statement)
736736
{
737737
collect_symbols(to_verilog_label_statement(statement).statement());
738738
}
739+
else if(statement.id() == ID_procedural_continuous_assign)
740+
{
741+
}
739742
else
740743
DATA_INVARIANT(false, "unexpected statement: " + statement.id_string());
741744
}

src/verilog/verilog_expr.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,22 +1378,23 @@ inline verilog_repeatt &to_verilog_repeat(exprt &expr)
13781378
class verilog_procedural_continuous_assignt:public verilog_statementt
13791379
{
13801380
public:
1381-
verilog_procedural_continuous_assignt():verilog_statementt(ID_continuous_assign)
1381+
verilog_procedural_continuous_assignt()
1382+
: verilog_statementt(ID_procedural_continuous_assign)
13821383
{
13831384
}
13841385
};
13851386

13861387
inline const verilog_procedural_continuous_assignt &
13871388
to_verilog_procedural_continuous_assign(const exprt &expr)
13881389
{
1389-
PRECONDITION(expr.id() == ID_continuous_assign);
1390+
PRECONDITION(expr.id() == ID_procedural_continuous_assign);
13901391
return static_cast<const verilog_procedural_continuous_assignt &>(expr);
13911392
}
13921393

13931394
inline verilog_procedural_continuous_assignt &
13941395
to_verilog_procedural_continuous_assign(exprt &expr)
13951396
{
1396-
PRECONDITION(expr.id() == ID_continuous_assign);
1397+
PRECONDITION(expr.id() == ID_procedural_continuous_assign);
13971398
return static_cast<verilog_procedural_continuous_assignt &>(expr);
13981399
}
13991400

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
@@ -725,7 +725,17 @@ void verilog_typecheckt::check_lhs(
725725
<< to_string(symbol.type) << " on line " << symbol.location.get_line()
726726
<< '.';
727727
}
728+
break;
728729

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

764791
/*******************************************************************\
@@ -1419,7 +1446,7 @@ void verilog_typecheckt::convert_statement(
14191446
convert_case(to_verilog_case_base(statement));
14201447
else if(statement.id()==ID_blocking_assign)
14211448
convert_assign(to_verilog_assign(statement), true);
1422-
else if(statement.id()==ID_continuous_assign)
1449+
else if(statement.id() == ID_procedural_continuous_assign)
14231450
convert_procedural_continuous_assign(
14241451
to_verilog_procedural_continuous_assign(statement));
14251452
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)