Skip to content

Commit 79ac04e

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 79ac04e

9 files changed

+63
-11
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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,22 +1378,22 @@ 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():verilog_statementt(ID_procedural_continuous_assign)
13821382
{
13831383
}
13841384
};
13851385

13861386
inline const verilog_procedural_continuous_assignt &
13871387
to_verilog_procedural_continuous_assign(const exprt &expr)
13881388
{
1389-
PRECONDITION(expr.id() == ID_continuous_assign);
1389+
PRECONDITION(expr.id() == ID_procedural_continuous_assign);
13901390
return static_cast<const verilog_procedural_continuous_assignt &>(expr);
13911391
}
13921392

13931393
inline verilog_procedural_continuous_assignt &
13941394
to_verilog_procedural_continuous_assign(exprt &expr)
13951395
{
1396-
PRECONDITION(expr.id() == ID_continuous_assign);
1396+
PRECONDITION(expr.id() == ID_procedural_continuous_assign);
13971397
return static_cast<verilog_procedural_continuous_assignt &>(expr);
13981398
}
13991399

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: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,18 @@ 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 &&
732+
!symbol.is_lvalue)
733+
{
734+
throw errort().with_location(lhs.source_location())
735+
<< "procedural continuous assignment to a net\n"
736+
<< "Identifier " << symbol.display_name() << " is declared as "
737+
<< to_string(symbol.type) << " on line " << symbol.location.get_line()
738+
<< '.';
739+
}
729740
break;
730741
}
731742
}
@@ -755,10 +766,27 @@ Function: verilog_typecheckt::convert_procedural_continuous_assign
755766
void verilog_typecheckt::convert_procedural_continuous_assign(
756767
verilog_procedural_continuous_assignt &statement)
757768
{
758-
// down and up again
759-
convert_continuous_assign(
760-
static_cast<verilog_continuous_assignt &>(
761-
static_cast<exprt &>(statement)));
769+
// On path to deprecation.
770+
for(auto &assignment : statement.operands())
771+
{
772+
if(assignment.id()!=ID_equal || assignment.operands().size()!=2)
773+
{
774+
throw errort().with_location(assignment.source_location())
775+
<< "malformed procedural continuous assignment";
776+
}
777+
778+
assignment.type()=bool_typet();
779+
780+
exprt &lhs = to_binary_expr(assignment).lhs();
781+
exprt &rhs = to_binary_expr(assignment).rhs();
782+
783+
convert_expr(lhs);
784+
convert_expr(rhs);
785+
786+
propagate_type(rhs, lhs.type());
787+
788+
check_lhs(lhs, A_PROCEDURAL_CONTINUOUS);
789+
}
762790
}
763791

764792
/*******************************************************************\
@@ -1419,7 +1447,7 @@ void verilog_typecheckt::convert_statement(
14191447
convert_case(to_verilog_case_base(statement));
14201448
else if(statement.id()==ID_blocking_assign)
14211449
convert_assign(to_verilog_assign(statement), true);
1422-
else if(statement.id()==ID_continuous_assign)
1450+
else if(statement.id()==ID_procedural_continuous_assign)
14231451
convert_procedural_continuous_assign(
14241452
to_verilog_procedural_continuous_assign(statement));
14251453
else if(

src/verilog/verilog_typecheck.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class verilog_typecheckt:
127127

128128
// type checking
129129

130-
typedef enum { A_CONTINUOUS, A_BLOCKING, A_NON_BLOCKING } vassignt;
130+
typedef enum { A_CONTINUOUS, A_BLOCKING, A_NON_BLOCKING, A_PROCEDURAL_CONTINUOUS } vassignt;
131131

132132
// statements
133133
void convert_statement(class verilog_statementt &);

0 commit comments

Comments
 (0)