Skip to content

Commit 622f08b

Browse files
committed
Verilog: parse covergroup declarations
This adds grammar rules for SystemVerilog covergroup declarations.
1 parent 132151e commit 622f08b

File tree

8 files changed

+99
-1
lines changed

8 files changed

+99
-1
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
covergroup1.sv
3+
4+
^no properties$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module main;
2+
3+
wire clk, some_signal;
4+
5+
covergroup cg @(posedge clk);
6+
coverpoint some_signal;
7+
endgroup
8+
9+
endmodule

src/hw_cbmc_irep_ids.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ IREP_ID_ONE(wait)
7373
IREP_ID_ONE(verilog_assert_property)
7474
IREP_ID_ONE(verilog_assume_property)
7575
IREP_ID_ONE(verilog_cover_property)
76+
IREP_ID_ONE(verilog_covergroup)
7677
IREP_ID_ONE(verilog_smv_assert)
7778
IREP_ID_ONE(verilog_smv_assume)
7879
IREP_ID_ONE(verilog_always)

src/verilog/parser.y

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ class_item:
882882
// | attribute_instance_brace class_method
883883
// | attribute_instance_brace class_constraint
884884
attribute_instance_brace class_declaration
885-
// | attribute_instance_brace covergroup_declaration
885+
| attribute_instance_brace covergroup_declaration
886886
| local_parameter_declaration ';'
887887
| parameter_declaration ';'
888888
| ';'
@@ -1018,6 +1018,7 @@ package_or_generate_item_declaration:
10181018
that let constructs may be declared in a
10191019
module/interface/program/checker etc. */
10201020
| let_declaration
1021+
| covergroup_declaration
10211022
| ';'
10221023
{ init($$, ID_verilog_empty_item); }
10231024
;
@@ -1249,6 +1250,9 @@ enum_name_declaration_list:
12491250
{ $$=$1; mts($$, $3); }
12501251
;
12511252

1253+
class_scope: class_type TOK_COLONCOLON
1254+
;
1255+
12521256
integer_type:
12531257
integer_vector_type
12541258
| integer_atom_type
@@ -1828,6 +1832,13 @@ task_declaration:
18281832
task_prototype: TOK_TASK task_identifier
18291833
;
18301834

1835+
tf_port_list_paren_opt:
1836+
/* Optional */
1837+
{ init($$); }
1838+
| '(' tf_port_list_opt ')'
1839+
{ $$ = $2; }
1840+
;
1841+
18311842
tf_port_list_opt:
18321843
/* Optional */
18331844
{ init($$); }
@@ -2002,6 +2013,55 @@ expression_or_dist:
20022013
expression
20032014
;
20042015

2016+
// System Verilog standard 1800-2017
2017+
// A.2.11 Covergroup declarations
2018+
2019+
covergroup_declaration:
2020+
TOK_COVERGROUP new_identifier tf_port_list_paren_opt coverage_event_opt ';'
2021+
coverage_spec_or_option_brace TOK_ENDGROUP
2022+
{ init($$, ID_verilog_covergroup); }
2023+
;
2024+
2025+
coverage_spec_or_option_brace:
2026+
/* Optional */
2027+
| coverage_spec_or_option_brace coverage_spec_or_option
2028+
;
2029+
2030+
coverage_spec_or_option:
2031+
attribute_instance_brace coverage_spec
2032+
;
2033+
2034+
coverage_spec:
2035+
cover_point
2036+
;
2037+
2038+
coverage_event_opt:
2039+
/* Optional */
2040+
| coverage_event
2041+
;
2042+
2043+
coverage_event:
2044+
clocking_event
2045+
;
2046+
2047+
block_event_expression:
2048+
block_event_expression TOK_OR block_event_expression
2049+
| TOK_BEGIN hierarchical_btf_identifier
2050+
| TOK_END hierarchical_btf_identifier
2051+
;
2052+
2053+
hierarchical_btf_identifier:
2054+
hierarchical_tf_identifier
2055+
| hierarchical_block_identifier
2056+
| method_identifier
2057+
| hierarchical_identifier '.' method_identifier
2058+
| class_scope method_identifier
2059+
;
2060+
2061+
cover_point:
2062+
TOK_COVERPOINT expression ';'
2063+
;
2064+
20052065
// System Verilog standard 1800-2017
20062066
// A.2.12 Let declarations
20072067

@@ -2845,6 +2905,11 @@ procedural_timing_control:
28452905
// System Verilog standard 1800-2017
28462906
// A.6.11 Clocking block
28472907

2908+
clocking_event:
2909+
'@' identifier
2910+
| '@' '(' event_expression ')'
2911+
;
2912+
28482913
cycle_delay:
28492914
"##" number
28502915
{ init($$, ID_verilog_cycle_delay); mto($$, $2); }
@@ -3329,6 +3394,8 @@ ps_covergroup_identifier:
33293394
33303395
memory_identifier: identifier;
33313396
3397+
method_identifier: identifier;
3398+
33323399
type_identifier: TOK_TYPE_IDENTIFIER
33333400
{
33343401
init($$, ID_typedef_type);
@@ -3362,6 +3429,8 @@ function_identifier: hierarchical_identifier
33623429
33633430
hierarchical_event_identifier: event_identifier;
33643431
3432+
hierarchical_block_identifier: hierarchical_identifier;
3433+
33653434
hierarchical_identifier:
33663435
identifier
33673436
| hierarchical_identifier '.' identifier

src/verilog/verilog_elaborate.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,9 @@ void verilog_typecheckt::collect_symbols(
760760
else if(module_item.id() == ID_verilog_empty_item)
761761
{
762762
}
763+
else if(module_item.id() == ID_verilog_covergroup)
764+
{
765+
}
763766
else
764767
DATA_INVARIANT(false, "unexpected module item: " + module_item.id_string());
765768
}

src/verilog/verilog_interfaces.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ void verilog_typecheckt::interface_module_item(
287287
else if(module_item.id() == ID_verilog_empty_item)
288288
{
289289
}
290+
else if(module_item.id() == ID_verilog_covergroup)
291+
{
292+
}
290293
else
291294
{
292295
DATA_INVARIANT(false, "unexpected module item: " + module_item.id_string());

src/verilog/verilog_synthesis.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2740,6 +2740,9 @@ void verilog_synthesist::synth_module_item(
27402740
else if(module_item.id() == ID_verilog_empty_item)
27412741
{
27422742
}
2743+
else if(module_item.id() == ID_verilog_covergroup)
2744+
{
2745+
}
27432746
else
27442747
{
27452748
throw errort().with_location(module_item.source_location())

src/verilog/verilog_typecheck.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,9 @@ void verilog_typecheckt::convert_module_item(
15751575
else if(module_item.id() == ID_verilog_empty_item)
15761576
{
15771577
}
1578+
else if(module_item.id() == ID_verilog_covergroup)
1579+
{
1580+
}
15781581
else
15791582
{
15801583
throw errort().with_location(module_item.source_location())

0 commit comments

Comments
 (0)