Skip to content

Commit ff06c23

Browse files
authored
Merge pull request #1343 from diffblue/cover_sequence_statement
SVA: add cover sequence
2 parents 7cb6ef1 + 63c3436 commit ff06c23

19 files changed

+181
-39
lines changed

CHANGELOG

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# EBMC 5.8
22

3+
* SystemVerilog: cover sequence
4+
35
# EBMC 5.7
46

57
* Verilog: --initial-zero changes the default value from nondet to zero

regression/verilog/SVA/cover_sequence1.sv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ module main(input clk);
77
x++;
88

99
// expected to pass
10-
p0: cover property (x==2 ##1 x==3 ##1 x==4);
10+
p0: cover sequence (x==2 ##1 x==3 ##1 x==4);
1111

1212
// expected to fail
13-
p1: cover property (x==2 ##1 x==3 ##1 x==5);
13+
p1: cover sequence (x==2 ##1 x==3 ##1 x==5);
1414

1515
endmodule

regression/verilog/SVA/cover_sequence2.sv

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ module main(input clk);
77
x++;
88

99
// expected to fail
10-
p0: cover property (x==2 ##1 x==3 ##1 x==100);
10+
p0: cover sequence (x==2 ##1 x==3 ##1 x==100);
1111

1212
// expected to fail until x reaches 100
13-
p1: cover property (x==98 ##1 x==99 ##1 x==100);
13+
p1: cover sequence (x==98 ##1 x==99 ##1 x==100);
1414

1515
// expected to pass once x reaches 5
16-
p2: cover property (x==3 ##1 x==4 ##1 x==5);
16+
p2: cover sequence (x==3 ##1 x==4 ##1 x==5);
1717

1818
// expected to pass once x reaches 6
19-
p3: cover property (x==4 ##1 x==5 ##1 x==6);
19+
p3: cover sequence (x==4 ##1 x==5 ##1 x==6);
2020

2121
endmodule

regression/verilog/SVA/cover_sequence3.sv

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ module main(input clk);
77
x++;
88

99
// passes with bound >=9
10-
p0: cover property (1[*10]);
10+
p0: cover sequence (1[*10]);
1111

1212
// passes with bound >=3
13-
p1: cover property (1[*4:10]);
13+
p1: cover sequence (1[*4:10]);
1414

1515
// passes with bound >=4
16-
p2: cover property (1[*5:10]);
16+
p2: cover sequence (1[*5:10]);
1717

1818
endmodule

regression/verilog/SVA/cover_sequence4.sv

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ module main(input clk);
77
x++;
88

99
// passes with bound >=9
10-
p0: cover property (1[=10]);
10+
p0: cover sequence (1[=10]);
1111

1212
// passes with bound >=3
13-
p1: cover property (1[=4:10]);
13+
p1: cover sequence (1[=4:10]);
1414

1515
// passes with bound >=4
16-
p2: cover property (1[=5:10]);
16+
p2: cover sequence (1[=5:10]);
1717

1818
endmodule

src/hw_cbmc_irep_ids.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ IREP_ID_ONE(sva_cycle_delay)
6969
IREP_ID_ONE(sva_cycle_delay_star)
7070
IREP_ID_ONE(sva_cycle_delay_plus)
7171
IREP_ID_ONE(sva_disable_iff)
72+
IREP_ID_ONE(sva_sequence_disable_iff)
7273
IREP_ID_ONE(sva_sequence_first_match)
7374
IREP_ID_ONE(sva_sequence_goto_repetition)
7475
IREP_ID_ONE(sva_sequence_intersect)
@@ -210,6 +211,7 @@ IREP_ID_ONE(verilog_immediate_cover)
210211
IREP_ID_ONE(verilog_assert_property)
211212
IREP_ID_ONE(verilog_assume_property)
212213
IREP_ID_ONE(verilog_cover_property)
214+
IREP_ID_ONE(verilog_cover_sequence)
213215
IREP_ID_ONE(verilog_covergroup)
214216
IREP_ID_ONE(verilog_restrict_property)
215217
IREP_ID_ONE(verilog_expect_property)

src/temporal-logic/temporal_logic.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ bool is_SVA_sequence_operator(const exprt &expr)
112112
id == ID_sva_sequence_goto_repetition ||
113113
id == ID_sva_sequence_non_consecutive_repetition ||
114114
id == ID_sva_sequence_repetition_star ||
115-
id == ID_sva_sequence_repetition_plus || id == ID_sva_boolean;
115+
id == ID_sva_sequence_repetition_plus || id == ID_sva_boolean ||
116+
id == ID_sva_sequence_disable_iff;
116117
}
117118

118119
bool is_SVA_operator(const exprt &expr)

src/temporal-logic/trivial_sva.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ exprt trivial_sva(exprt expr)
110110
auto &disable_iff_expr = to_sva_disable_iff_expr(expr);
111111
expr = or_exprt{disable_iff_expr.lhs(), disable_iff_expr.rhs()};
112112
}
113+
else if(expr.id() == ID_sva_sequence_disable_iff)
114+
{
115+
auto &disable_iff_expr = to_sva_sequence_disable_iff_expr(expr);
116+
expr = sva_or_exprt{
117+
sva_boolean_exprt{disable_iff_expr.lhs(), verilog_sva_sequence_typet{}},
118+
disable_iff_expr.rhs(),
119+
verilog_sva_sequence_typet{}};
120+
}
113121
else if(expr.id() == ID_sva_accept_on || expr.id() == ID_sva_sync_accept_on)
114122
{
115123
auto &sva_abort_expr = to_sva_abort_expr(expr);

src/verilog/expr2verilog.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -680,10 +680,10 @@ Function: expr2verilogt::convert_sva_abort
680680

681681
expr2verilogt::resultt expr2verilogt::convert_sva_abort(
682682
const std::string &text,
683-
const sva_abort_exprt &expr)
683+
const binary_exprt &expr)
684684
{
685-
auto op0 = convert_rec(expr.condition());
686-
auto op1 = convert_rec(expr.property());
685+
auto op0 = convert_rec(expr.op0());
686+
auto op1 = convert_rec(expr.op1());
687687

688688
return {verilog_precedencet::MIN, text + " (" + op0.s + ") " + op1.s};
689689
}
@@ -1937,6 +1937,11 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
19371937
return precedence = verilog_precedencet::MIN,
19381938
convert_sva_abort("disable iff", to_sva_abort_expr(src));
19391939

1940+
else if(src.id() == ID_sva_sequence_disable_iff)
1941+
return precedence = verilog_precedencet::MIN,
1942+
convert_sva_abort(
1943+
"disable iff", to_sva_sequence_disable_iff_expr(src));
1944+
19401945
else if(src.id()==ID_sva_eventually)
19411946
{
19421947
return precedence = verilog_precedencet::MIN,

src/verilog/expr2verilog_class.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ Author: Daniel Kroening, kroening@kroening.com
1212
#include <util/bitvector_expr.h>
1313
#include <util/std_expr.h>
1414

15-
class sva_abort_exprt;
1615
class sva_case_exprt;
1716
class sva_if_exprt;
1817
class sva_ranged_predicate_exprt;
@@ -145,7 +144,7 @@ class expr2verilogt
145144
const std::string &name,
146145
const sva_sequence_repetition_exprt &);
147146

148-
resultt convert_sva_abort(const std::string &name, const sva_abort_exprt &);
147+
resultt convert_sva_abort(const std::string &name, const binary_exprt &);
149148

150149
resultt
151150
convert_sva_indexed_binary(const std::string &name, const binary_exprt &);

0 commit comments

Comments
 (0)