目录
4.6.1 Transition bins creation:sequence
4.6.2 Transition bins creation ; default sequence
4.6.3 Transition bins creation:set of transition
4.6.4 Transition bins creation:consecutive repetion
4.6.5 Transition bins creation:range of repetition
4.6.6 Transition bins creation ;repetition with nonconseutive
5.1 Auto cross coverage points
5.2 User defined cross coverage points
引言:
传统的验证质量是借助代码覆盖工具来度量的。代码覆盖率反映了HDL代码的执行程度。代码覆盖工具通常通过插件来跟踪代码执行。代码覆盖工具提供的特性集通常包括行/块覆盖、状态机覆盖、表达式覆盖、事件覆盖和翻转覆盖。
- 传统覆盖对于下面的方面有局限性:
- 验证non-implemented 特性(Overlooking non-implemented features.);
- 验证多个模块的交互性(The inability to measure the interaction between multiple modules.);
- 验证同时发生的时间和时间序列能力(The ability to measure simultaneous events or sequences of events);
- SV的功能覆盖的特性:
- 变量和表达式的覆盖,以及他们之间的交叉覆盖;
- 自动和用户自定的覆盖bins;
- 联合bins可以包含一组值、转换或交叉乘积;
- 多级过滤条件;
- 事件和序列自动触发覆盖抽样;
- 程序激活以及查询覆盖(Procedural activation and query of coverage.);
- 控制和规范覆盖范围。
1. Functional coverage types
- 通常当我们在测试计划文档 中记录测试用例时,我们也开始记录功能覆盖计划;
- 在验证环境中有四个地方可以对功能覆盖点进行编码;
- (F1)随机化(randomization)(是否能将随机对象发送到DUT);
- (F2)DUT输入接口的采样;
- (F3)DUT内部状态的采样(基本上这一块大部分都被SVA断言覆盖);
- (F4)DUT输出接口的采样

1 //+++++++++++++++++++++++++++++++++++++++++++++++++
2 // DUT With Coverage
3 //+++++++++++++++++++++++++++++++++++++++++++++++++
4 module simple_coverage();
5
6 logic [7:0] addr;
7 logic [7:0] data;
8 logic par;
9 logic rw;
10 logic en;
11 //=================================================
12 // Coverage Group
13 //=================================================
14 covergroup memory @ (posedge en);
15 address : coverpoint addr {
16 bins low = {0,50};
17 bins med = {51,150};
18 bins high = {151,255};
19 }
20 parity : coverpoint par {
21 bins even = {0};
22 bins odd = {1};
23 }
24 read_write : coverpoint rw {
25 bins read = {0};
26 bins write = {1};
27 }
28 endgroup
29 //=================================================
30 // Instance of covergroup memory
31 //=================================================
32 memory mem = new();
33 //=================================================
34 // Task to drive values
35 //=================================================
36 task drive (input [7:0] a, input [7:0] d, input r);
37 #5 en <= 1;
38 addr <= a;
39 rw <= r;
40 data <= d;
41 par <= ^d;
42 $display ("@%2tns Address :%d data %x, rw %x, parity %x",
43 $time,a,d,r, ^d);
44 #5 en <= 0;
45 rw <= 0;
46 data <= 0;
47 par <= 0;
48 addr <= 0;
49 rw <= 0;
50 endtask
51 //=================================================
52 // Testvector generation
53 //=================================================
54 initial begin
55 en = 0;
56 repeat (10) begin
57 drive ($random,$random,$random);
58 end
59 #10 $finish;
60 end
61
62 endmodule
63
64 //compile result
65 @ 5ns Address : 36 data 81, rw 1, parity 0
66 @15ns Address : 99 data 0d, rw 1, parity 1
67 @25ns Address :101 data 12, rw 1, parity 0
68 @35ns Address : 13 data 76, rw 1, parity 1
69 @45ns Address :237 data 8c, rw 1, parity 1
70 @55ns Address :198 data c5, rw 0, parity 0
71 @65ns Address :229 data 77, rw 0, parity 0
72 @75ns Address :143 data f2, rw 0, parity 1
73 @85ns Address :232 data c5, rw 0, parity 0
74 @95ns Address :189 data 2d, rw 1, parity 0
2. Covergroup
- covergroup是一个用户定义的类型,定义一次;
- 可以在package、module、program、interface、class中定义该类型的多个实例;
- covergroup可以包含以下内容:
- 时钟事件:定义覆盖率采样的事件,如果被忽略,用户必须按程序触发覆盖率抽样,这是通过内置的sample方法完成的;
- 覆盖点:覆盖点可以是变量也可以是表达式;
- 交叉覆盖:覆盖组还可以指定两个或多个覆盖点或变量之间的交叉覆盖;
- 覆盖选项:用于控制covergroup的行为;
- 可选的形式参数:创建covergroup实例时传递的参数;
- covergroup可以指定一个或者多个选项来控制盒规范覆盖率数据的结构和收集方式;
- 覆盖率选项可以为整个覆盖率组指定也可以为覆盖率组中的特定项目指定;
- 一个covergroup可以包含一个或多个覆盖点,每个覆盖点包含一组与其抽样值或值转换相关联的bins;
1 //+++++++++++++++++++++++++++++++++++++++++++++++++
2 // Define the interface with coverage
3 //+++++++++++++++++++++++++++++++++++++++++++++++++
4 interface mem_if (input wire clk);
5 logic reset;
6 logic we;
7 logic ce;
8 logic [7:0] datai;
9 logic [7:0] datao;
10 logic [7:0] addr;
11 //=================================================
12 // Clocking block for testbench
13 //=================================================
14 clocking cb @ (posedge clk);
15 output reset, we, ce, datai,addr;
16 input datao;
17 endclocking
18 //=================================================
19 // Coverage Group in interface
20 //=================================================
21 covergroup memory @ (posedge ce);
22 address : coverpoint addr {
23 bins low = {0,50};
24 bins med = {51,150};
25 bins high = {151,255};
26 }
27 data_in : coverpoint datai {
28 bins low = {0,50};
29 bins med = {51,150};
30 bins high = {151,255};
31 }
32 data_out : coverpoint datao {
33 bins low = {0,50};
34 bins med = {51,150};
35 bins high = {151,255};
36 }
37 read_write : coverpoint we {
38 bins read = {0};
39 bins write = {1};
40 }
41 endgroup
42 //=================================================
43 // Instance of covergroup
44 //=================================================
45 memory mem = new();
46
47 endinterface
48 //+++++++++++++++++++++++++++++++++++++++++++++++++
49 // DUT With interface
50 //+++++++++++++++++++++++++++++++++++++++++++++++++
51 module simple_if (mem_if mif);
52 // Memory array
53 logic [7:0] mem [0:255];
54
55 //=================================================
56 // Read logic
57 //=================================================
58 always @ (posedge mif.clk)
59 if (mif.reset) mif.datao <= 0;
60 else if (mif.ce && !mif.we) mif.datao <= mem[mif.addr];
61
62 //=================================================
63 // Write Logic
64 //=================================================
65 always @ (posedge mif.clk)
66 if (mif.ce && mif.we) mem[mif.addr] <= mif.datai;
67
68 endmodule
69
70 //+++++++++++++++++++++++++++++++++++++++++++++++++
71 // Testbench
72 //+++++++++++++++++++++++++++++++++++++++++++++++++
73 module coverage_covergroup();
74
75 logic clk = 0;
76 always #10 clk++;
77 //=================================================
78 // Instianciate Interface and DUT
79 //=================================================
80 mem_if miff(clk);
81 simple_if U_dut(miff);
82 //=================================================
83 // Default clocking
84 //=================================================
85 default clocking dclk @ (posedge clk);
86
87 endclocking
88 //=================================================
89 // Test Vector generation
90 //=================================================
91 initial begin
92 miff.reset <= 1;
93 miff.ce <= 1'b0;
94 miff.we <= 1'b0;
95 miff.addr <= 0;
96 miff.datai <= 0;
97 ##1 miff.reset <= 0;
98 for (int i = 0; i < 3; i ++ ) begin
99 ##1 miff.ce <= 1'b1;
100 miff.we <= 1'b1;
101 miff.addr <= i;
102 miff.datai <= $random;
103 ##3 miff.ce <= 1'b0;
104 $display ("@%0dns Write access address %x, data %x",
105 $time,miff.addr,miff.datai);
106 end
107 for (int i = 0; i < 3; i ++ ) begin
108 ##1 miff.ce <= 1'b1;
109 miff.we <= 1'b0;
110 miff.addr <= i;
111 ##3 miff.ce <= 1'b0;
112 $display ("@%0dns Read access address %x, data %x",
113 $time,miff.addr,miff.datao);
114 end
115 #10 $finish;
116 end
117
118 endmodule
119
120 //coverage report
121
122 Variables for Group coverage_covergroup.miff::memory
123
124 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
125 address 3 2 1 33.33 100 1
126 data_in 3 3 0 0.00 100 1
127 data_out 3 2 1 33.33 100 1
128 read_write 2 0 2 100.00 100 1
3. Covergroup inside a class
module 中的covergroup 与类中的covergroup的区别在于:
- class中的covergroup的实例时可选的,因为这是自动的,即covergroup是隐式的;
- 嵌入式的covergroup可以为protected和loca类属性定义覆盖模型,而无需对类数据封装进行任何更改;
- 类成员可以成为覆盖点,或者在 其他覆盖构造中使用,例如:条件保护或选项初始化;
- 一个类可以有多个covergroup
1 //+++++++++++++++++++++++++++++++++++++++++++++++++
2 // Define the interface with coverage
3 //+++++++++++++++++++++++++++++++++++++++++++++++++
4 interface mem_if (input wire clk);
5 logic reset;
6 logic we;
7 logic ce;
8 logic [7:0] datai;
9 logic [7:0] datao;
10 logic [7:0] addr;
11 //=================================================
12 // Clocking block for testbench
13 //=================================================
14 clocking cb @ (posedge clk);
15 inout reset, we, ce, datai,addr;
16 input datao;
17 endclocking
18 //=================================================
19 // Modport for testbench
20 //=================================================
21 modport tb (clocking cb, input clk);
22
23 endinterface
24 //+++++++++++++++++++++++++++++++++++++++++++++++++
25 // DUT With interface
26 //+++++++++++++++++++++++++++++++++++++++++++++++++
27 module simple_if (mem_if mif);
28 // Memory array
29 logic [7:0] mem [0:255];
30
31 //=================================================
32 // Read logic
33 //=================================================
34 always @ (posedge mif.clk)
35 if (mif.reset) mif.datao <= 0;
36 else if (mif.ce && !mif.we) mif.datao <= mem[mif.addr];
37
38 //=================================================
39 // Write Logic
40 //=================================================
41 always @ (posedge mif.clk)
42 if (mif.ce && mif.we) mem[mif.addr] <= mif.datai;
43
44 endmodule
45
46 //+++++++++++++++++++++++++++++++++++++++++++++++++
47 // Testbench
48 //+++++++++++++++++++++++++++++++++++++++++++++++++
49 module coverage_class();
50
51 logic clk = 0;
52 always #10 clk++;
53 //=================================================
54 // Instianciate Interface and DUT
55 //=================================================
56 mem_if miff(clk);
57 simple_if U_dut(miff);
58 //=================================================
59 // Default clocking
60 //=================================================
61 default clocking dclk @ (posedge clk);
62
63 endclocking
64
65 //=================================================
66 // Test Vector generation
67 //=================================================
68 class mem_driver;
69 virtual mem_if.tb cif;
70
71 //=================================================
72 // Coverage Group in class
73 //=================================================
74 covergroup memory @ (negedge cif.cb.ce);
75 address : coverpoint cif.cb.addr {
76 bins low = {0,50};
77 bins med = {51,150};
78 bins high = {151,255};
79 }
80 endgroup
81
82 covergroup datac @ (negedge cif.cb.ce);
83 data_in : coverpoint cif.cb.datai {
84 bins low = {0,50};
85 bins med = {51,150};
86 bins high = {151,255};
87 }
88 data_out : coverpoint cif.cb.datao {
89 bins low = {0,50};
90 bins med = {51,150};
91 bins high = {151,255};
92 }
93 read_write : coverpoint cif.cb.we {
94 bins read = {0};
95 bins write = {1};
96 }
97 endgroup
98
99 function new (virtual mem_if.tb cif);
100 this.cif = cif;
101 this.datac = new();
102 this.memory = new();
103 endfunction
104
105 task automatic drive ();
106 cif.cb.reset <= 1;
107 cif.cb.ce <= 1'b0;
108 cif.cb.we <= 1'b0;
109 cif.cb.addr <= 0;
110 cif.cb.datai <= 0;
111 @ (cif.cb) cif.cb.reset <= 0;
112 for (int i = 0; i < 3; i ++ ) begin
113 ##1 cif.cb.ce <= 1'b1;
114 cif.cb.we <= 1'b1;
115 cif.cb.addr <= i;
116 cif.cb.datai <= $random;
117 repeat (3) @ (cif.cb) cif.cb.ce <= 1'b0;
118 $display ("@%0dns Write access address %0x, data %x",
119 $time,i,cif.cb.datai);
120 end
121 for (int i = 0; i < 3; i ++ ) begin
122 @ (cif.cb) cif.cb.ce <= 1'b1;
123 cif.cb.we <= 1'b0;
124 cif.cb.addr <= i;
125 repeat (4) @ (cif.cb) cif.cb.ce <= 1'b0;
126 $display ("@%0dns Read access address %0x, data %x",
127 $time,i,cif.cb.datao);
128 end
129 endtask
130
131 endclass
132
133 mem_driver driver = new(miff);
134
135 initial begin
136 driver.drive();
137 #10 $finish;
138 end
139
140 endmodule
141
142 //simulation
143 @90ns Write access address 0, data 24
144 @170ns Write access address 1, data 81
145 @250ns Write access address 2, data 09
146 @350ns Read access address 0, data 24
147 @450ns Read access address 1, data 81
148 @550ns Read access address 2, data 09
149
150 //cover report
151
152 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
153 address 3 2 1 33.33 100 1
154
155 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
156 data_in 3 2 1 33.33 100 1
157 data_out 3 3 0 0.00 100 1
158 read_write 2 0 2 100.00 100 1
4. Coverage points
- 一个covergroup可以包含 多个coverpoint,
- 每个coverpoint可以是一个变量或者表达式;每个coverpoint包含一组与其相关的bins;
- 每个bins可以由用户显式定义,也可以由系统自动创建;
- coverpoint创建了一个分层的域,可以被选择性的被签标记,如果标签被指定,那么相应的覆盖点也就被指定;利用这个标签可以访问覆盖点或者将对应的覆盖点包含 到另一个覆盖点中实现交叉覆盖;
- 如果省略标签,而且 coverpoint与单个变量相关联,则变量名就成为coverpoint的名称,否则的话只能任由系统在生成覆盖率报告的时候自定义名字,该名字也无法在语言中使用。
- coverpoint可以用 iff 禁用覆盖集合;
- 自动创建的bins可以用auto_bin_max选项来控制;
- 用bins[*]为创建一定数量的bins,open_range_list指定与bins相关联的值集;
- bins在指定容量的bins中是平均分布的;
- bin定义的末尾可以 加入iff(条件表达式),如果表达式在采样点 是 false,则容器的计数不会增加;
1 //+++++++++++++++++++++++++++++++++++++++++++++++++
2 // Define the interface with coverage
3 //+++++++++++++++++++++++++++++++++++++++++++++++++
4 interface mem_if (input wire clk);
5 logic reset;
6 logic we;
7 logic ce;
8 logic [7:0] datai;
9 logic [7:0] datao;
10 logic [7:0] addr;
11 //=================================================
12 // Clocking block for testbench
13 //=================================================
14 clocking cb @ (posedge clk);
15 output reset, we, ce, datai,addr;
16 input datao;
17 endclocking
18 //=================================================
19 // Coverage Group in interface
20 //=================================================
21 covergroup memory @ (posedge ce);
22 address : coverpoint addr {
23 bins low = {0,50};
24 bins med = {51,150};
25 bins high = {151,255};
26 }
27 data_in : coverpoint datai {
28 bins low = {0,50};
29 bins med = {51,150};
30 bins high = {151,255};
31 }
32 data_out : coverpoint datao {
33 bins low = {0,50};
34 bins med = {51,150};
35 bins high = {151,255};
36 }
37 read_write : coverpoint we {
38 bins read = {0};
39 bins write = {1};
40 }
41 endgroup
42 //=================================================
43 // Instance of covergroup
44 //=================================================
45 memory mem = new();
46
47 endinterface
48 //+++++++++++++++++++++++++++++++++++++++++++++++++
49 // DUT With interface
50 //+++++++++++++++++++++++++++++++++++++++++++++++++
51 module simple_if (mem_if mif);
52 // Memory array
53 logic [7:0] mem [0:255];
54
55 //=================================================
56 // Read logic
57 //=================================================
58 always @ (posedge mif.clk)
59 if (mif.reset) mif.datao <= 0;
60 else if (mif.ce && !mif.we) mif.datao <= mem[mif.addr];
61
62 //=================================================
63 // Write Logic
64 //=================================================
65 always @ (posedge mif.clk)
66 if (mif.ce && mif.we) mem[mif.addr] <= mif.datai;
67
68 endmodule
69
70 //+++++++++++++++++++++++++++++++++++++++++++++++++
71 // Testbench
72 //+++++++++++++++++++++++++++++++++++++++++++++++++
73 module coverage_covergroup();
74
75 logic clk = 0;
76 always #10 clk++;
77 //=================================================
78 // Instianciate Interface and DUT
79 //=================================================
80 mem_if miff(clk);
81 simple_if U_dut(miff);
82 //=================================================
83 // Default clocking
84 //=================================================
85 default clocking dclk @ (posedge clk);
86
87 endclocking
88 //=================================================
89 // Test Vector generation
90 //=================================================
91 initial begin
92 miff.reset <= 1;
93 miff.ce <= 1'b0;
94 miff.we <= 1'b0;
95 miff.addr <= 0;
96 miff.datai <= 0;
97 ##1 miff.reset <= 0;
98 for (int i = 0; i < 3; i ++ ) begin
99 ##1 miff.ce <= 1'b1;
100 miff.we <= 1'b1;
101 miff.addr <= i;
102 miff.datai <= $random;
103 ##3 miff.ce <= 1'b0;
104 $display ("@%0dns Write access address %x, data %x",
105 $time,miff.addr,miff.datai);
106 end
107 for (int i = 0; i < 3; i ++ ) begin
108 ##1 miff.ce <= 1'b1;
109 miff.we <= 1'b0;
110 miff.addr <= i;
111 ##3 miff.ce <= 1'b0;
112 $display ("@%0dns Read access address %x, data %x",
113 $time,miff.addr,miff.datao);
114 end
115 #10 $finish;
116 end
117
118 endmodule
119
120 //simulation
121 @90ns Write access address 00, data 24
122 @170ns Write access address 01, data 81
123 @250ns Write access address 02, data 09
124 @330ns Read access address 00, data 24
125 @410ns Read access address 01, data 81
126 @490ns Read access address 02, data 09
4.1 Generic coverage group
- 通常情况下,covergroup是根据已知的变量进行编码的,如地址、数据或响应;
- 有时,我们不希望covergroup是通用的,这样同一个covergroup就可以实例化多次,并且每一个实例都在他自己的变量集上起作用;
- 通用covergroup是通过传递变量特征作为参数来创建的,就像task和function一样;
1 //+++++++++++++++++++++++++++++++++++++++++++++++++
2 // Define the interface with coverage
3 //+++++++++++++++++++++++++++++++++++++++++++++++++
4 interface mem_if (input wire clk);
5 logic reset;
6 logic we;
7 logic ce;
8 logic [7:0] datai;
9 logic [7:0] datao;
10 logic [7:0] addr;
11 //=================================================
12 // Clocking block for testbench
13 //=================================================
14 clocking cb @ (posedge clk);
15 output reset, we, ce, datai,addr;
16 input datao;
17 endclocking
18 //=================================================
19 // Coverage Group in interface
20 //=================================================
21 covergroup address_cov (ref logic [7:0] address,
22 input int low, int high) @ (posedge ce);
23 ADDRESS : coverpoint address {
24 bins low = {0,low};
25 bins med = {low,high};
26 }
27 endgroup
28 //=================================================
29 // Instance of covergroup
30 //=================================================
31 address_cov acov_low = new(addr,0,10);
32 address_cov acov_med = new(addr,11,20);
33 address_cov acov_high = new(addr,21,30);
34
35 endinterface
36 //+++++++++++++++++++++++++++++++++++++++++++++++++
37 // DUT With interface
38 //+++++++++++++++++++++++++++++++++++++++++++++++++
39 module simple_if (mem_if mif);
40 // Memory array
41 logic [7:0] mem [0:255];
42
43 //=================================================
44 // Read logic
45 //=================================================
46 always @ (posedge mif.clk)
47 if (mif.reset) mif.datao <= 0;
48 else if (mif.ce && !mif.we) mif.datao <= mem[mif.addr];
49
50 //=================================================
51 // Write Logic
52 //=================================================
53 always @ (posedge mif.clk)
54 if (mif.ce && mif.we) mem[mif.addr] <= mif.datai;
55
56 endmodule
57
58 //+++++++++++++++++++++++++++++++++++++++++++++++++
59 // Testbench
60 //+++++++++++++++++++++++++++++++++++++++++++++++++
61 module coverage_covergroup();
62
63 logic clk = 0;
64 always #10 clk++;
65 //=================================================
66 // Instianciate Interface and DUT
67 //=================================================
68 mem_if miff(clk);
69 simple_if U_dut(miff);
70 //=================================================
71 // Default clocking
72 //=================================================
73 default clocking dclk @ (posedge clk);
74
75 endclocking
76 //=================================================
77 // Test Vector generation
78 //=================================================
79 initial begin
80 miff.reset <= 1;
81 miff.ce <= 1'b0;
82 miff.we <= 1'b0;
83 miff.addr <= 0;
84 miff.datai <= 0;
85 ##1 miff.reset <= 0;
86 for (int i = 0; i < 3; i ++ ) begin
87 ##1 miff.ce <= 1'b1;
88 miff.we <= 1'b1;
89 miff.addr <= i;
90 miff.datai <= $random;
91 ##3 miff.ce <= 1'b0;
92 $display ("@%0dns Write access address %x, data %x",
93 $time,miff.addr,miff.datai);
94 end
95 for (int i = 0; i < 3; i ++ ) begin
96 ##1 miff.ce <= 1'b1;
97 miff.we <= 1'b0;
98 miff.addr <= i;
99 ##3 miff.ce <= 1'b0;
100 $display ("@%0dns Read access address %x, data %x",
101 $time,miff.addr,miff.datao);
102 end
103 #10 $finish;
104 end
105
106 endmodule
107
108 //simulaion
109
110 @90ns Write access address 00, data 24
111 @170ns Write access address 01, data 81
112 @250ns Write access address 02, data 09
113 @330ns Read access address 00, data 24
114 @410ns Read access address 01, data 81
115 @490ns Read access address 02, data 09
116
117 //report
118 ===========================================================
119 Group : coverage_covergroup.miff::address_cov
120 ===========================================================
121 SCORE WEIGHT GOAL
122 100.00 1 100
123 -----------------------------------------------------------
124 Summary for Group coverage_covergroup.miff::address_cov
125 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
126 Variables 2 0 2 100.00
127
128 Variables for Group coverage_covergroup.miff::address_cov
129
130 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
131 ADDRESS 2 0 2 100.00 100 1
132 -----------------------------------------------------------
133 Summary for Variable ADDRESS
134
135 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
136 User Defined Bins 2 0 2 100.00
137
138 User Defined Bins for ADDRESS
139 Bins
140
141 NAME COUNT AT LEAST
142 med 2 1
143 low 6 1
4.2 Implicit bins creation
- 在任何covergroup中,都需要定义bins,在没有定义bins时,模拟器会自动创建隐式bins,
1 module test();
2
3 logic [7:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 // Set this option to limit number of auto bins created
9 option.auto_bin_max = 10;
10 // See no bins are declared here, Not a good idea
11 }
12 endgroup
13
14 address_cov my_cov = new();
15
16 initial begin
17 ce <= 0;
18 addr <= 0;
19 $monitor("ce %b addr 8'h%x",ce,addr);
20 repeat (10) begin
21 addr = $random();
22 ce <= 1;
23 #10;
24 ce <= 0;
25 #10;
26 end
27 end
28
29 endmodule
30
31 //simulation
32
33 ce 1 addr 8'h00
34 ce 0 addr 8'h00
35 ce 1 addr 8'h81
36 ce 0 addr 8'h81
37 ce 1 addr 8'h09
38 ce 0 addr 8'h09
39 ce 1 addr 8'h63
40 ce 0 addr 8'h63
41 ce 1 addr 8'h0d
42 ce 0 addr 8'h0d
43 ce 1 addr 8'h8d
44 ce 0 addr 8'h8d
45 ce 1 addr 8'h65
46 ce 0 addr 8'h65
47 ce 1 addr 8'h12
48 ce 0 addr 8'h12
49 ce 1 addr 8'h01
50 ce 0 addr 8'h01
51 ce 1 addr 8'h0d
52 ce 0 addr 8'h0d
53
54 //report
55 Group : test::address_cov
56 ===========================================================
57 Group : test::address_cov
58 ===========================================================
59 SCORE WEIGHT GOAL
60 40.00 1 100
61 -----------------------------------------------------------
62 Summary for Group test::address_cov
63
64 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
65 Variables 10 6 4 40.00
66
67 Variables for Group test::address_cov
68
69 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
70 ADDRESS 10 6 4 40.00 100 1
71 -----------------------------------------------------------
72 Summary for Variable ADDRESS
73
74 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
75 Automatically Generated Bins 10 6 4 40.00
76
77 Automatically Generated Bins for ADDRESS
78
79 Uncovered bins
80
81 NAME COUNT AT LEAST NUMBER
82 [auto[25:49] - auto[50:74]] -- -- 2
83 [auto[150:174] - auto[225:255]] -- -- 4
84
85 Covered bins
86 NAME COUNT AT LEAST
87 auto[0:24] 6 1
88 auto[75:99] 1 1
89 auto[100:124] 1 1
90 auto[125:149] 2 1
4.3 Expelicity bins creation
显式定义bins是一个不错的选择;
1 module test();
2
3 logic [7:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 // Bins are explicity declared, This is prefered way
9 bins low = {0,10};
10 bins med = {11,20};
11 bins value_255 = {255};
12 }
13 endgroup
14
15 address_cov my_cov = new();
16
17 initial begin
18 ce <= 0;
19 addr <= 0;
20 $monitor("ce %b addr 8'h%x",ce,addr);
21 repeat (10) begin
22 addr = $random();
23 ce <= 1;
24 #10;
25 ce <= 0;
26 #10;
27 end
28 end
29
30 endmodule
31
32 //simulation
33
34 ce 1 addr 8'h00
35 ce 0 addr 8'h00
36 ce 1 addr 8'h81
37 ce 0 addr 8'h81
38 ce 1 addr 8'h09
39 ce 0 addr 8'h09
40 ce 1 addr 8'h63
41 ce 0 addr 8'h63
42 ce 1 addr 8'h0d
43 ce 0 addr 8'h0d
44 ce 1 addr 8'h8d
45 ce 0 addr 8'h8d
46 ce 1 addr 8'h65
47 ce 0 addr 8'h65
48 ce 1 addr 8'h12
49 ce 0 addr 8'h12
50 ce 1 addr 8'h01
51 ce 0 addr 8'h01
52 ce 1 addr 8'h0d
53 ce 0 addr 8'h0d
54
55 //report
56
57 ===========================================================
58 Group : test::address_cov
59 ===========================================================
60 SCORE WEIGHT GOAL
61 33.33 1 100
62 -----------------------------------------------------------
63 Summary for Group test::address_cov
64
65 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
66 Variables 3 2 1 33.33
67
68 Variables for Group test::address_cov
69
70 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
71 ADDRESS 3 2 1 33.33 100 1
72 -----------------------------------------------------------
73 Summary for Variable ADDRESS
74
75 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
76 User Defined Bins 3 2 1 33.33
77
78 User Defined Bins for ADDRESS
79
80 Uncovered bins
81
82 NAME COUNT AT LEAST NUMBER
83 value_255 0 1 1
84 med 0 1 1
85
86 Covered bins
87
88 NAME COUNT AT LEAST
89 low 1 1
4.4 Array of bins creation
可以让模拟器隐式创建bins数组,用户显式创建数组的值;
1 module test();
2
3 logic [7:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 // This should create 11 bins
9 bins low[] = {[0:10]};
10 // This should create 10 bins
11 bins med[] = {[11:20]};
12 }
13 endgroup
14
15 address_cov my_cov = new();
16
17 initial begin
18 ce <= 0;
19 addr <= 0;
20 $monitor("ce %b addr 8'h%x",ce,addr);
21 repeat (10) begin
22 addr = $random();
23 ce <= 1;
24 #10;
25 ce <= 0;
26 #10;
27 end
28 end
29
30 endmodule
31
32 //simulation
33
34 ce 1 addr 8'h00
35 ce 0 addr 8'h00
36 ce 1 addr 8'h81
37 ce 0 addr 8'h81
38 ce 1 addr 8'h09
39 ce 0 addr 8'h09
40 ce 1 addr 8'h63
41 ce 0 addr 8'h63
42 ce 1 addr 8'h0d
43 ce 0 addr 8'h0d
44 ce 1 addr 8'h8d
45 ce 0 addr 8'h8d
46 ce 1 addr 8'h65
47 ce 0 addr 8'h65
48 ce 1 addr 8'h12
49 ce 0 addr 8'h12
50 ce 1 addr 8'h01
51 ce 0 addr 8'h01
52 ce 1 addr 8'h0d
53 ce 0 addr 8'h0d
54
55 //report
56
57 ===========================================================
58 Group : test::address_cov
59 ===========================================================
60 SCORE WEIGHT GOAL
61 23.81 1 100
62 -----------------------------------------------------------
63 Summary for Group test::address_cov
64
65 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
66 Variables 21 16 5 23.81
67
68 Variables for Group test::address_cov
69
70 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
71 ADDRESS 21 16 5 23.81 100 1
72 -----------------------------------------------------------
73 Summary for Variable ADDRESS
74
75 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
76 User Defined Bins 21 16 5 23.81
77
78 User Defined Bins for ADDRESS
79
80 Uncovered bins
81
82 NAME COUNT AT LEAST NUMBER
83 med_0b 0 1 1
84 med_0c 0 1 1
85 med_0e 0 1 1
86 med_0f 0 1 1
87 med_10 0 1 1
88 med_11 0 1 1
89 med_13 0 1 1
90 med_14 0 1 1
91 low_02 0 1 1
92 low_03 0 1 1
93 low_04 0 1 1
94 low_05 0 1 1
95 low_06 0 1 1
96 low_07 0 1 1
97 low_08 0 1 1
98 low_0a 0 1 1
99
100 Covered bins
101
102 NAME COUNT AT LEAST
103 med_0d 2 1
104 med_12 1 1
105 low_00 1 1
106 low_01 1 1
107 low_09 1 1
4.5 Deault bins creation
- default bins 捕获隐式bin定义中没有覆盖的所有值,在报告覆盖率时,在default中的不会考虑在覆盖率中;
1 module test();
2
3 logic [7:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 bins low = {0,10};
9 // All other values are not counted in coverage calculation
10 bins lazy = default;
11 }
12 endgroup
13
14 address_cov my_cov = new();
15
16 initial begin
17 ce <= 0;
18 addr <= 0;
19 $monitor("ce %b addr 8'h%x",ce,addr);
20 repeat (10) begin
21 addr = $random();
22 ce <= 1;
23 #10;
24 ce <= 0;
25 #10;
26 end
27 end
28
29 endmodule
30
31 //simulation
32
33 ce 1 addr 8'h00
34 ce 0 addr 8'h00
35 ce 1 addr 8'h81
36 ce 0 addr 8'h81
37 ce 1 addr 8'h09
38 ce 0 addr 8'h09
39 ce 1 addr 8'h63
40 ce 0 addr 8'h63
41 ce 1 addr 8'h0d
42 ce 0 addr 8'h0d
43 ce 1 addr 8'h8d
44 ce 0 addr 8'h8d
45 ce 1 addr 8'h65
46 ce 0 addr 8'h65
47 ce 1 addr 8'h12
48 ce 0 addr 8'h12
49 ce 1 addr 8'h01
50 ce 0 addr 8'h01
51 ce 1 addr 8'h0d
52 ce 0 addr 8'h0d
53
54 //report
55 ===========================================================
56 Group : test::address_cov
57 ===========================================================
58 SCORE WEIGHT GOAL
59 100.00 1 100
60 -----------------------------------------------------------
61 Summary for Group test::address_cov
62
63 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
64 Variables 1 0 1 100.00
65
66 Variables for Group test::address_cov
67
68 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
69 ADDRESS 1 0 1 100.00 100 1
70 -----------------------------------------------------------
71 Summary for Variable ADDRESS
72
73 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
74 User Defined Bins 1 0 1 100.00
75
76 User Defined Bins for ADDRESS
77
78 Excluded/Illegal bins
79
80 NAME COUNT
81 lazy 9 Excluded
82
83 Covered bins
84
85 NAME COUNT AT LEAST
86 low 1 1
4.6 Transition bins creation
- 转换覆盖率用来检测是否发生了所需的转换,也用于检查是否发生了合法/非法的 转换;
- 在任何覆盖计划中transition coverage是一个很重要的测试内容;
- 一些 transition coverage 的典型的例子:
- 读跟随写到同一个内存地址;
- CPU的零标志测试后跳转到指令执行;
- 高优先级帧和低优先值帧;
- cache控制器的先miss后hit
4.6.1 Transition bins creation:sequence
一个值到另一个值的转换:
WRITE => READ;
WRITE => READ => WRITE;
1 module test();
2
3 logic [7:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 // simple transition bin
9 bins adr_0_to_1 = (0=>1);
10 bins adr_1_to_0 = (1=>0);
11 bins adr_1_to_2 = (1=>2);
12 bins adr_2_to_1 = (1=>0);
13 bins adr_0_1_2_3 = (0=>1=>2=>3);
14 bins adr_1_4_7 = (1=>4=>7);
15 }
16 endgroup
17
18 address_cov my_cov = new();
19
20 initial begin
21 ce <= 0;
22 addr <= 0;
23 $monitor("ce %b addr 8'h%x",ce,addr);
24 repeat (10) begin
25 ce <= 1;
26 #10;
27 ce <= 0;
28 addr ++;
29 #10;
30 end
31 end
32
33 endmodule
34
35 //simulation
36
37 ce 1 addr 8'h00
38 ce 0 addr 8'h01
39 ce 1 addr 8'h01
40 ce 0 addr 8'h02
41 ce 1 addr 8'h02
42 ce 0 addr 8'h03
43 ce 1 addr 8'h03
44 ce 0 addr 8'h04
45 ce 1 addr 8'h04
46 ce 0 addr 8'h05
47 ce 1 addr 8'h05
48 ce 0 addr 8'h06
49 ce 1 addr 8'h06
50 ce 0 addr 8'h07
51 ce 1 addr 8'h07
52 ce 0 addr 8'h08
53 ce 1 addr 8'h08
54 ce 0 addr 8'h09
55 ce 1 addr 8'h09
56 ce 0 addr 8'h0a
57
58 //report
59 ===========================================================
60 Group : test::address_cov
61 ===========================================================
62 SCORE WEIGHT GOAL
63 50.00 1 100
64 -----------------------------------------------------------
65 Summary for Group test::address_cov
66
67 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
68 Variables 6 3 3 50.00
69
70 Variables for Group test::address_cov
71
72 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
73 ADDRESS 6 3 3 50.00 100 1
74 -----------------------------------------------------------
75 Summary for Variable ADDRESS
76
77 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
78 User Defined Bins 6 3 3 50.00
79
80 User Defined Bins for ADDRESS
81
82 Uncovered bins
83
84 NAME COUNT AT LEAST NUMBER
85 adr_1_4_7 0 1 1
86 adr_2_to_1 0 1 1
87 adr_1_to_0 0 1 1
88
89 Covered bins
90
91 NAME COUNT AT LEAST
92 adr_0_1_2_3 1 1
93 adr_1_to_2 1 1
94 adr_0_to_1 1 1
4.6.2 Transition bins creation ; default sequence
在default中的coverpoint不会考虑在覆盖率中;
1 module test();
2
3 logic [7:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 // simple transition bin
9 bins adr_0_to_1 = (0=>1);
10 bins adr_1_to_0 = (1=>0);
11 bins adr_1_to_2 = (1=>2);
12 bins adr_2_to_1 = (1=>0);
13 bins allother = default sequence;
14 }
15 endgroup
16
17 address_cov my_cov = new();
18
19 initial begin
20 ce <= 0;
21 addr <= 0;
22 $monitor("ce %b addr 8'h%x",ce,addr);
23 repeat (10) begin
24 ce <= 1;
25 #10;
26 ce <= 0;
27 addr ++;
28 #10;
29 end
30 end
31
32 endmodule
33
34 //simulation
35
36 ce 1 addr 8'h00
37 ce 0 addr 8'h01
38 ce 1 addr 8'h01
39 ce 0 addr 8'h02
40 ce 1 addr 8'h02
41 ce 0 addr 8'h03
42 ce 1 addr 8'h03
43 ce 0 addr 8'h04
44 ce 1 addr 8'h04
45 ce 0 addr 8'h05
46 ce 1 addr 8'h05
47 ce 0 addr 8'h06
48 ce 1 addr 8'h06
49 ce 0 addr 8'h07
50 ce 1 addr 8'h07
51 ce 0 addr 8'h08
52 ce 1 addr 8'h08
53 ce 0 addr 8'h09
54 ce 1 addr 8'h09
55 ce 0 addr 8'h0a
56
57 //report
58 ===========================================================
59 Group : test::address_cov
60 ===========================================================
61 SCORE WEIGHT GOAL
62 50.00 1 100
63 -----------------------------------------------------------
64 Summary for Group test::address_cov
65
66 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
67 Variables 4 2 2 50.00
68
69 Variables for Group test::address_cov
70
71 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
72 ADDRESS 4 2 2 50.00 100 1
73 -----------------------------------------------------------
74 Summary for Variable ADDRESS
75
76 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
77 User Defined Bins 4 2 2 50.00
78
79 User Defined Bins for ADDRESS
80
81 Uncovered bins
82
83 NAME COUNT AT LEAST NUMBER
84 adr_2_to_1 0 1 1
85 adr_1_to_0 0 1 1
86
87 Covered bins
88
89 NAME COUNT AT LEAST
90 adr_1_to_2 1 1
91 adr_0_to_1 1 1
4.6.3 Transition bins creation:set of transition
set of transition : 过渡集,是一种转换行为的数组;
1 module test();
2
3 logic [2:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 // simple transition bin
9 bins adr_low[] = (0,1=>2,3);
10 bins adr_med[] = (1,2=>3,4);
11 bins adr_high[] = (3,4=>5,6);
12 }
13 endgroup
14
15 address_cov my_cov = new();
16
17 initial begin
18 ce <= 0;
19 addr <= 0;
20 $monitor("ce %b addr 8'h%x",ce,addr);
21 repeat (10) begin
22 ce <= 1;
23 addr <= $random;
24 #10;
25 ce <= 0;
26 #10;
27 end
28 end
29
30 endmodule
31
32 //simulation
33
34 ce 1 addr 8'h4
35 ce 0 addr 8'h4
36 ce 1 addr 8'h1
37 ce 0 addr 8'h1
38 ce 1 addr 8'h1
39 ce 0 addr 8'h1
40 ce 1 addr 8'h3
41 ce 0 addr 8'h3
42 ce 1 addr 8'h5
43 ce 0 addr 8'h5
44 ce 1 addr 8'h5
45 ce 0 addr 8'h5
46 ce 1 addr 8'h5
47 ce 0 addr 8'h5
48 ce 1 addr 8'h2
49 ce 0 addr 8'h2
50 ce 1 addr 8'h1
51 ce 0 addr 8'h1
52 ce 1 addr 8'h5
53 ce 0 addr 8'h5
54
55 //report
56 ===========================================================
57 Group : test::address_cov
58 ===========================================================
59 SCORE WEIGHT GOAL
60 25.00 1 100
61 -----------------------------------------------------------
62 Summary for Group test::address_cov
63
64 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
65 Variables 12 9 3 25.00
66
67 Variables for Group test::address_cov
68
69 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
70 ADDRESS 12 9 3 25.00 100 1
71 -----------------------------------------------------------
72 Summary for Variable ADDRESS
73
74 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
75 User Defined Bins 12 9 3 25.00
76
77 User Defined Bins for ADDRESS
78
79 Uncovered bins
80
81 NAME COUNT AT LEAST NUMBER
82 adr_high:3->6 0 1 1
83 adr_high:4->5 0 1 1
84 adr_high:4->6 0 1 1
85 adr_med:1->4 0 1 1
86 adr_med:2->3 0 1 1
87 adr_med:2->4 0 1 1
88 adr_low:0->2 0 1 1
89 adr_low:0->3 0 1 1
90 adr_low:1->2 0 1 1
91
92 Covered bins
93
94 NAME COUNT AT LEAST
95 adr_high:3->5 1 1
96 adr_med:1->3 1 1
97 adr_low:1->3 1 1
4.6.4 Transition bins creation:consecutive repetion
- 检查相同的值重复次数,次数少可以通过下面的方法手动输入:
WRITE =>WRITE =>WRITE =>WRITE =>;
- 较长序列可以通过下面方式实现:
10[*WRITE]
1 module test();
2
3 logic [2:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 bins adr_0_2times = (0[*2]);
9 bins adr_1_3times = (1[*3]);
10 bins adr_2_4times = (2[*4]);
11 }
12 endgroup
13
14 address_cov my_cov = new();
15
16 initial begin
17 ce <= 0;
18 addr <= 2;
19 $monitor("ce %b addr 8'h%x",ce,addr);
20 repeat (10) begin
21 ce <= 1;
22 #10;
23 ce <= 0;
24 #10;
25 end
26 end
27
28 endmodule
29
30 //simulation
31
32 ce 1 addr 8'h2
33 ce 0 addr 8'h2
34 ce 1 addr 8'h2
35 ce 0 addr 8'h2
36 ce 1 addr 8'h2
37 ce 0 addr 8'h2
38 ce 1 addr 8'h2
39 ce 0 addr 8'h2
40 ce 1 addr 8'h2
41 ce 0 addr 8'h2
42 ce 1 addr 8'h2
43 ce 0 addr 8'h2
44 ce 1 addr 8'h2
45 ce 0 addr 8'h2
46 ce 1 addr 8'h2
47 ce 0 addr 8'h2
48 ce 1 addr 8'h2
49 ce 0 addr 8'h2
50 ce 1 addr 8'h2
51 ce 0 addr 8'h2
52
53 //report
54 ===========================================================
55 Group : test::address_cov
56 ===========================================================
57 SCORE WEIGHT GOAL
58 33.33 1 100
59 -----------------------------------------------------------
60 Summary for Group test::address_cov
61
62 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
63 Variables 3 2 1 33.33
64
65 Variables for Group test::address_cov
66
67 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
68 ADDRESS 3 2 1 33.33 100 1
69 -----------------------------------------------------------
70 Summary for Variable ADDRESS
71
72 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
73 User Defined Bins 3 2 1 33.33
74
75 User Defined Bins for ADDRESS
76
77 Uncovered bins
78
79 NAME COUNT AT LEAST NUMBER
80 adr_1_3times 0 1 1
81 adr_0_2times 0 1 1
82
83 Covered bins
84
85 NAME COUNT AT LEAST
86 adr_2_4times 7 1
4.6.5 Transition bins creation:range of repetition
覆盖一定范围中的重复:
(WRITE[*2:5]);
1 module test();
2
3 logic [2:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 bins adr0[] = (0[*1:4]);
9 bins adr1[] = (1[*1:2]);
10 }
11 endgroup
12
13 address_cov my_cov = new();
14
15 initial begin
16 ce <= 0;
17 $monitor("ce %b addr 8'h%x",ce,addr);
18 repeat (10) begin
19 ce <= 1;
20 addr <= $urandom_range(0,1);
21 #10;
22 ce <= 0;
23 #10;
24 end
25 end
26
27 endmodule
28
29 //simulation
30
31 ce 1 addr 8'h0
32 ce 0 addr 8'h0
33 ce 1 addr 8'h0
34 ce 0 addr 8'h0
35 ce 1 addr 8'h1
36 ce 0 addr 8'h1
37 ce 1 addr 8'h0
38 ce 0 addr 8'h0
39 ce 1 addr 8'h1
40 ce 0 addr 8'h1
41 ce 1 addr 8'h1
42 ce 0 addr 8'h1
43 ce 1 addr 8'h0
44 ce 0 addr 8'h0
45 ce 1 addr 8'h1
46 ce 0 addr 8'h1
47 ce 1 addr 8'h0
48 ce 0 addr 8'h0
49 ce 1 addr 8'h1
50 ce 0 addr 8'h1
51
52 //report
53 =====================================================================
54 Group : test::address_cov
55 =====================================================================
56 SCORE WEIGHT GOAL
57 100.00 1 100
58 ---------------------------------------------------------------------
59 Summary for Group test::address_cov
60
61 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
62 Variables 2 0 2 100.00
63
64 Variables for Group test::address_cov
65
66 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
67 ADDRESS 2 0 2 100.00 100 1
68 ---------------------------------------------------------------------
69 Summary for Variable ADDRESS
70
71 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
72 User Defined Bins 2 0 2 100.00
73
74 User Defined Bins for ADDRESS
75
76 Bins
77
78 NAME COUNT AT LEAST
79 adr1:1[*[1:2]] 5 1
80 adr0:0[*[1:4]] 5 1
4.6.6 Transition bins creation ;repetition with nonconseutive
非连续的重复; 2[->WRITE];
重复操作符可以混合使用;
1 module test();
2
3 logic [2:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 bins adr = (0=>2[->2]=>1);
9 }
10 endgroup
11
12 address_cov my_cov = new();
13
14 initial begin
15 ce <= 0;
16 $monitor("ce %b addr 8'h%x",ce,addr);
17 repeat (10) begin
18 ce <= 1;
19 addr <= $urandom_range(0,2);
20 #10;
21 ce <= 0;
22 #10;
23 end
24 end
25
26 endmodule
27
28 //simulation
29
30 ce 1 addr 8'h2
31 ce 0 addr 8'h2
32 ce 1 addr 8'h2
33 ce 0 addr 8'h2
34 ce 1 addr 8'h1
35 ce 0 addr 8'h1
36 ce 1 addr 8'h0
37 ce 0 addr 8'h0
38 ce 1 addr 8'h1
39 ce 0 addr 8'h1
40 ce 1 addr 8'h2
41 ce 0 addr 8'h2
42 ce 1 addr 8'h1
43 ce 0 addr 8'h1
44 ce 1 addr 8'h0
45 ce 0 addr 8'h0
46 ce 1 addr 8'h0
47 ce 0 addr 8'h0
48 ce 1 addr 8'h2
49 ce 0 addr 8'h2
50
51 //report
52
53 ===========================================================
54 Group : test::address_cov
55 ===========================================================
56 SCORE WEIGHT GOAL
57 0.00 1 100
58 -----------------------------------------------------------
59 Summary for Group test::address_cov
60
61 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
62 Variables 1 1 0 0.00
63
64 Variables for Group test::address_cov
65
66 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
67 ADDRESS 1 1 0 0.00 100 1
68 -------------------------------------------------------------------------------
69 Summary for Variable ADDRESS
70
71 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
72 User Defined Bins 1 1 0 0.00
73
74 User Defined Bins for ADDRESS
75
76 Uncovered bins
77
78 NAME COUNT AT LEAST NUMBER
79 adr 0 1 1
4.6.7 Wildcard bin creation
- 通配符定义下只有x,z或者?作为1或者0的通配处理;
-
1 wildcard bins abc = {2'b1?};
这代表abc可以匹配 2'b10 或者 2'b11;
1 module test();
2
3 logic [2:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 // Normal transition bibs
9 wildcard bins adr0 = {3'b11?};
10 // We can use wildcard in transition bins also
11 wildcard bins adr1 = (3'b1x0 => 3'bx00);
12 wildcard bins adr2 = (3'b1?0 => 3'b?00);
13 }
14 endgroup
15
16 address_cov my_cov = new();
17
18 initial begin
19 ce <= 0;
20 $monitor("ce %b addr 8'h%x",ce,addr);
21 repeat (10) begin
22 ce <= 1;
23 addr <= $urandom_range(0,2);
24 #10;
25 ce <= 0;
26 #10;
27 end
28 end
29
30 endmodule
31 //simualation
32
33 ce 1 addr 8'h2
34 ce 0 addr 8'h2
35 ce 1 addr 8'h2
36 ce 0 addr 8'h2
37 ce 1 addr 8'h1
38 ce 0 addr 8'h1
39 ce 1 addr 8'h0
40 ce 0 addr 8'h0
41 ce 1 addr 8'h1
42 ce 0 addr 8'h1
43 ce 1 addr 8'h2
44 ce 0 addr 8'h2
45 ce 1 addr 8'h1
46 ce 0 addr 8'h1
47 ce 1 addr 8'h0
48 ce 0 addr 8'h0
49 ce 1 addr 8'h0
50 ce 0 addr 8'h0
51 ce 1 addr 8'h2
52 ce 0 addr 8'h2
53
54 //report
55
56 ===========================================================
57 Group : test::address_cov
58 ===========================================================
59 SCORE WEIGHT GOAL
60 0.00 1 100
61 -----------------------------------------------------------
62 Summary for Group test::address_cov
63
64 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
65 Variables 3 3 0 0.00
66
67 Variables for Group test::address_cov
68
69 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
70 ADDRESS 3 3 0 0.00 100 1
71 -----------------------------------------------------------
72 Summary for Variable ADDRESS
73
74 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
75 User Defined Bins 3 3 0 0.00
76
77 User Defined Bins for ADDRESS
78
79 Uncovered bins
80
81 NAME COUNT AT LEAST NUMBER
82 adr0 0 1 1
83 adr2 0 1 1
84 adr1 0 1 1
4.6.8 Ignore bin
- 与coverpoint相关的一组值换转换可以通过将其指定为ignore_bins显式地排除在覆盖率收集之外;
- ignore_bins 语法用于动态禁用覆盖率bin,也可用于建模VERA的覆盖率形状语法。
1 module test();
2
3 logic [2:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 ignore_bins ignore_tran = (0=>2=>1);
9 ignore_bins ignore_vals = {0,1,2,3};
10 }
11 endgroup
12
13 address_cov my_cov = new();
14
15 initial begin
16 ce <= 0;
17 $monitor("ce %b addr 8'h%x",ce,addr);
18 repeat (10) begin
19 ce <= 1;
20 addr <= $urandom_range(0,7);
21 #10;
22 ce <= 0;
23 #10;
24 end
25 end
26
27 endmodule
28
29 //simulation
30 ce 1 addr 8'h6
31 ce 0 addr 8'h6
32 ce 1 addr 8'h4
33 ce 0 addr 8'h4
34 ce 1 addr 8'h5
35 ce 0 addr 8'h5
36 ce 1 addr 8'h2
37 ce 0 addr 8'h2
38 ce 1 addr 8'h3
39 ce 0 addr 8'h3
40 ce 1 addr 8'h7
41 ce 0 addr 8'h7
42 ce 1 addr 8'h0
43 ce 0 addr 8'h0
44 ce 1 addr 8'h7
45 ce 0 addr 8'h7
46 ce 1 addr 8'h6
47 ce 0 addr 8'h6
48 ce 1 addr 8'h3
49 ce 0 addr 8'h3
50
51 //report
52 ===========================================================
53 Group : test::address_cov
54 ===========================================================
55 SCORE WEIGHT GOAL
56 100.00 1 100
57 -----------------------------------------------------------
58 Summary for Group test::address_cov
59
60 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
61 Variables 4 -3 7 100.00
62
63 Variables for Group test::address_cov
64
65 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
66 ADDRESS 4 -3 7 100.00 100 1
67 -----------------------------------------------------------
68 Summary for Variable ADDRESS
69
70 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
71 Automatically Generated Bins 4 -3 7 100.00
72
73 Automatically Generated Bins for ADDRESS
74
75 Excluded/Illegal bins
76
77 NAME COUNT
78 ignore_tran 0 Excluded
79 ignore_vals 0 Excluded
80 [auto[0] - auto[3]] -- Excluded (4 bins)
81
82 Covered bins
83
84 NAME COUNT AT LEAST
85 auto[0] 1 1
86 auto[2] 1 1
87 auto[3] 2 1
88 auto[4] 1 1
89 auto[5] 1 1
90 auto[6] 2 1
91 auto[7] 2 1
4.6.9 Illegal bin creation
- 与覆盖点相关的一组值或者转换可以通过指定为illegal_bins来标记为非法;
- 击中一个非法的bins会导致模拟器终止模拟,结束模拟行为;
- 通常情况下,illegal bin的语法会在DUT内部变量的覆盖点或者DUT输出端口上使用。在testbench激励上使用illegal语法可以防止错误输入;
1 module test();
2
3 logic [2:0] addr;
4 reg ce;
5
6 covergroup address_cov () @ (posedge ce);
7 ADDRESS : coverpoint addr {
8 ignore_bins ignore_tran = (0=>2=>1);
9 ignore_bins ignore_vals = {0,1,2,3};
10 illegal_bins ignore = {5};
11 }
12 endgroup
13
14 address_cov my_cov = new();
15
16 initial begin
17 ce <= 0;
18 $monitor("ce %b addr 8'h%x",ce,addr);
19 repeat (10) begin
20 ce <= 1;
21 addr <= $urandom_range(0,7);
22 #10;
23 ce <= 0;
24 #10;
25 end
26 end
27
28 endmodule
29
30 //simulation
31
32 ce 1 addr 8'h6
33 ce 0 addr 8'h6
34 ce 1 addr 8'h4
35 ce 0 addr 8'h4
36
37 Error-[FCIBH] Illegal bin hit
38 /code/systemverilog/illegal_bin.sv, 7
39 test, "address_cov"
40 VERIFICATION ERROR (FUNCTIONAL COVERAGE) : Illegal state bin ignore of
41 coverpoint ADDRESS in covergroup address_cov got hit with value 0x5
42 Covergroup Instance: my_cov
43 Design hierarchy: test
44
45 //report
46 ===========================================================
47 Group : test::address_cov
48 ===========================================================
49 SCORE WEIGHT GOAL
50 66.67 1 100
51 -----------------------------------------------------------
52 Summary for Group test::address_cov
53
54 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
55 Variables 3 1 2 66.67
56
57 Variables for Group test::address_cov
58
59 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
60 ADDRESS 3 1 2 66.67 100 1
61 -----------------------------------------------------------
62 Summary for Variable ADDRESS
63
64 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
65 Automatically Generated Bins 3 1 2 66.67
66
67 Automatically Generated Bins for ADDRESS
68
69 Uncovered bins
70
71 NAME COUNT AT LEAST NUMBER
72 [auto[7]] 0 1 1
73
74 Excluded/Illegal bins
75
76 NAME COUNT
77 ignore_tran 0 Excluded
78 ignore_vals 0 Excluded
79 ignore 1 Excluded
80 [auto[0] - auto[3]] -- Excluded (4 bins)
81 [auto[5]] 0 Illegal
82
83 Covered bins
84
85 NAME COUNT AT LEAST
86 auto[4] 1 1
87 auto[6] 1 1
5. Cross coverage
- coverage可以指定两个或多个覆盖以及变量之间的交叉覆盖;
- 交叉覆盖使用cross构造来指定;
- 在 验证复杂系统时,验证功能点的组合是很重要的;
5.1 Auto cross coverage points
典型的交叉覆盖定义为自动的bins;
1 module test();
2
3 logic [2:0] addr;
4 logic [1:0] cmd;
5 reg ce;
6
7 covergroup address_cov () @ (posedge ce);
8 ADDRESS : coverpoint addr {
9 bins addr0 = {0};
10 bins addr1 = {1};
11 bins addr2 = {2};
12 bins addr3 = {3};
13 }
14 CMD : coverpoint cmd {
15 bins READ = {0};
16 bins WRITE = {1};
17 bins IDLE = {2};
18 }
19 CRS_ADDR_CMD : cross ADDRESS, CMD;
20 endgroup
21
22 address_cov my_cov = new();
23
24 initial begin
25 ce <= 0;
26 $monitor("ce %b addr 8'h%x cmd %x",ce,addr,cmd);
27 repeat (10) begin
28 ce <= 1;
29 addr <= $urandom_range(0,5);
30 cmd <= $urandom_range(0,2);
31 #10;
32 ce <= 0;
33 #10;
34 end
35 end
36
37 endmodule
38
39 //simulation
40
41 ce 1 addr 8'h2 cmd 2
42 ce 0 addr 8'h2 cmd 2
43 ce 1 addr 8'h1 cmd 0
44 ce 0 addr 8'h1 cmd 0
45 ce 1 addr 8'h1 cmd 2
46 ce 0 addr 8'h1 cmd 2
47 ce 1 addr 8'h4 cmd 0
48 ce 0 addr 8'h4 cmd 0
49 ce 1 addr 8'h0 cmd 2
50 ce 0 addr 8'h0 cmd 2
51 ce 1 addr 8'h5 cmd 2
52 ce 0 addr 8'h5 cmd 2
53 ce 1 addr 8'h2 cmd 2
54 ce 0 addr 8'h2 cmd 2
55 ce 1 addr 8'h5 cmd 0
56 ce 0 addr 8'h5 cmd 0
57 ce 1 addr 8'h2 cmd 2
58 ce 0 addr 8'h2 cmd 2
59 ce 1 addr 8'h4 cmd 2
60 ce 0 addr 8'h4 cmd 2
61
62 //report
63
64 ===========================================================
65 Group : test::address_cov
66 ===========================================================
67 SCORE WEIGHT GOAL
68 58.33 1 100
69 -----------------------------------------------------------
70 Summary for Group test::address_cov
71
72 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
73 Variables 7 2 5 70.83
74 Crosses 12 8 4 33.33
75
76 Variables for Group test::address_cov
77
78 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
79 ADDRESS 4 1 3 75.00 100 1
80 CMD 3 1 2 66.67 100 1
81
82 Crosses for Group test::address_cov
83
84 CROSS EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
85 CRS_ADDR_CMD 12 8 4 33.33 100 1
86 -----------------------------------------------------------
87 Summary for Variable ADDRESS
88
89 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
90 User Defined Bins 4 1 3 75.00
91
92 User Defined Bins for ADDRESS
93
94 Uncovered bins
95
96 NAME COUNT AT LEAST NUMBER
97 addr3 0 1 1
98
99 Covered bins
100
101 NAME COUNT AT LEAST
102 addr2 3 1
103 addr1 2 1
104 addr0 1 1
105 -----------------------------------------------------------
106 Summary for Variable CMD
107
108 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
109 User Defined Bins 3 1 2 66.67
110
111 User Defined Bins for CMD
112
113 Uncovered bins
114
115 NAME COUNT AT LEAST NUMBER
116 WRITE 0 1 1
117
118 Covered bins
119
120 NAME COUNT AT LEAST
121 IDLE 7 1
122 READ 3 1
123 -----------------------------------------------------------
124 Summary for Cross CRS_ADDR_CMD
125
126 Samples crossed: ADDRESS CMD
127 CATEGORY EXPECTED UNCOVERED COVERED PERCENT MISSING
128 Automatically Generated Cross Bins 12 8 4 33.33 8
129
130 Automatically Generated Cross Bins for CRS_ADDR_CMD
131
132 Element holes
133
134 ADDRESS CMD COUNT AT LEAST NUMBER
135 [addr3] * -- -- 3
136
137 Uncovered bins
138
139 ADDRESS CMD COUNT AT LEAST NUMBER
140 [addr2] [WRITE , READ] -- -- 2
141 [addr1] [WRITE] 0 1 1
142 [addr0] [WRITE , READ] -- -- 2
143
144 Covered bins
145
146 ADDRESS CMD COUNT AT LEAST
147 addr1 IDLE 1 1
148 addr1 READ 1 1
149 addr2 IDLE 3 1
150 addr0 IDLE 1 1
5.2 User defined cross coverage points
- 通常创建自动交叉bin会导致许多覆盖漏洞,并可能导致许多奇特的忽略bin语法;
- 所有有时会使用用户自定义的语法;
- 用户定义的用于交叉覆盖的bin使用binsof和intersect定义。
1 module test();
2
3 logic [2:0] addr;
4 logic [1:0] cmd;
5 reg ce;
6
7 covergroup address_cov () @ (posedge ce);
8 ADDRESS : coverpoint addr {
9 bins addr0 = {0};
10 bins addr1 = {1};
11 }
12 CMD : coverpoint cmd {
13 bins READ = {0};
14 bins WRITE = {1};
15 bins IDLE = {2};
16 }
17 CRS_USER_ADDR_CMD : cross ADDRESS, CMD {
18 bins USER_ADDR0_READ = binsof(CMD) intersect {0};
19 }
20 CRS_AUTO_ADDR_CMD : cross ADDRESS, CMD {
21 ignore_bins AUTO_ADDR_READ = binsof(CMD) intersect {0};
22 ignore_bins AUTO_ADDR_WRITE = binsof(CMD) intersect {1} && binsof(ADDRESS) intersect{0};
23 }
24
25 endgroup
26
27 address_cov my_cov = new();
28
29 initial begin
30 ce <= 0;
31 $monitor("ce %b addr 8'h%x cmd %x",ce,addr,cmd);
32 repeat (10) begin
33 ce <= 1;
34 addr <= $urandom_range(0,5);
35 cmd <= $urandom_range(0,2);
36 #10;
37 ce <= 0;
38 #10;
39 end
40 end
41
42 endmodule
43
44 //simulation
45 ce 1 addr 8'h2 cmd 2
46 ce 0 addr 8'h2 cmd 2
47 ce 1 addr 8'h1 cmd 0
48 ce 0 addr 8'h1 cmd 0
49 ce 1 addr 8'h1 cmd 2
50 ce 0 addr 8'h1 cmd 2
51 ce 1 addr 8'h4 cmd 0
52 ce 0 addr 8'h4 cmd 0
53 ce 1 addr 8'h0 cmd 2
54 ce 0 addr 8'h0 cmd 2
55 ce 1 addr 8'h5 cmd 2
56 ce 0 addr 8'h5 cmd 2
57 ce 1 addr 8'h2 cmd 2
58 ce 0 addr 8'h2 cmd 2
59 ce 1 addr 8'h5 cmd 0
60 ce 0 addr 8'h5 cmd 0
61 ce 1 addr 8'h2 cmd 2
62 ce 0 addr 8'h2 cmd 2
63 ce 1 addr 8'h4 cmd 2
64 ce 0 addr 8'h4 cmd 2
65
66 //report
67 ===============================================================================
68 Group : test::address_cov
69 ===============================================================================
70 SCORE WEIGHT GOAL
71 73.33 1 100
72 -------------------------------------------------------------------------------
73 Summary for Group test::address_cov
74
75 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
76 Variables 5 1 4 83.33
77 Crosses 8 3 5 63.33
78
79 Variables for Group test::address_cov
80
81 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
82 ADDRESS 2 0 2 100.00 100 1
83 CMD 3 1 2 66.67 100 1
84
85 Crosses for Group test::address_cov
86
87 CROSS EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
88 CRS_USER_ADDR_CMD 5 2 3 60.00 100 1
89 CRS_AUTO_ADDR_CMD 3 1 2 66.67 100 1
90 -------------------------------------------------------------------------------
91 Summary for Variable ADDRESS
92
93 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
94 User Defined Bins 2 0 2 100.00
95
96 User Defined Bins for ADDRESS
97
98 Bins
99
100 NAME COUNT AT LEAST
101 addr1 2 1
102 addr0 1 1
103 -------------------------------------------------------------------------------
104 Summary for Variable CMD
105
106 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
107 User Defined Bins 3 1 2 66.67
108
109 User Defined Bins for CMD
110
111 Uncovered bins
112
113 NAME COUNT AT LEAST NUMBER
114 WRITE 0 1 1
115
116 Covered bins
117
118 NAME COUNT AT LEAST
119 IDLE 7 1
120 READ 3 1
121 -------------------------------------------------------------------------------
122 Summary for Cross CRS_USER_ADDR_CMD
123
124 Samples crossed: ADDRESS CMD
125 CATEGORY EXPECTED UNCOVERED COVERED PERCENT MISSING
126 TOTAL 5 2 3 60.00 2
127 Automatically Generated Cross Bins 4 2 2 50.00 2
128 User Defined Cross Bins 1 0 1 100.00
129
130 Automatically Generated Cross Bins for CRS_USER_ADDR_CMD
131
132 Element holes
133 ADDRESS CMD COUNT AT LEAST NUMBER
134 * [WRITE] -- -- 2
135
136 Covered bins
137
138 ADDRESS CMD COUNT AT LEAST
139 addr1 IDLE 1 1
140 addr0 IDLE 1 1
141
142 User Defined Cross Bins for CRS_USER_ADDR_CMD
143
144 Bins
145
146 NAME COUNT AT LEAST
147 USER_ADDR0_READ 1 1
148 -------------------------------------------------------------------------------
149 Summary for Cross CRS_AUTO_ADDR_CMD
150
151 Samples crossed: ADDRESS CMD
152 CATEGORY EXPECTED UNCOVERED COVERED PERCENT MISSING
153 TOTAL 3 1 2 66.67 1
154 Automatically Generated Cross Bins 3 1 2 66.67 1
155 User Defined Cross Bins 0 0 0
156
157 Automatically Generated Cross Bins for CRS_AUTO_ADDR_CMD
158
159 Uncovered bins
160
161 ADDRESS CMD COUNT AT LEAST NUMBER
162 [addr1] [WRITE] 0 1 1
163
164 Covered bins
165
166 ADDRESS CMD COUNT AT LEAST
167 addr1 IDLE 1 1
168 addr0 IDLE 1 1
169
170 User Defined Cross Bins for CRS_AUTO_ADDR_CMD
171
172 Excluded/Illegal bins
173
174 NAME COUNT
175 AUTO_ADDR_READ 0 Excluded
176 AUTO_ADDR_WRITE 0 Excluded
6. Coverage options
- 与VERA一样,SV提供 了一些方法控制covergroup、coverpoint 以及cross的行为;
Options Name | Default | Description |
weight=number | 1 | 权重分配 |
goal=number | 90 | 指定覆盖率目标 |
name=string | unique name | 指定covergroup实例的名称 |
comment=string | 注释指定 | |
at_least=number | 1 | bin的最小击中次数 |
detect_overlap=boolean | 0 | 检测bins的重叠; 当为true时,如果coverpoint的两个 bins的范围列表或者转换 列表有重叠就会发出警告; |
auto_bin_max=number | 64 | 在没有显示指定bins的时候,设定允许自动创建最大bins的数量; |
cross_num_print_missing = number | 0 | 必须保存到覆盖率数据并在覆盖率报告中打印的未覆盖cross bins; |
per_instance=boolean | 0 | 当为true时,会跟踪每个covergroup实例的覆盖率。 |
- 下面的选项可以提高覆盖率的收敛:
- weight = nember
- goal = nember
- al_least = nember
- per_instance = boolean
1 module test();
2
3 logic [2:0] addr;
4 wire [2:0] addr2;
5 reg ce;
6
7 assign addr2 = addr + 1;
8
9 covergroup address_cov () @ (posedge ce);
10 option.name = "address_cov";
11 option.comment = "This is cool";
12 option.per_instance = 1;
13 option.goal = 100;
14 option.weight = 50;
15 ADDRESS : coverpoint addr {
16 option.auto_bin_max = 100;
17 }
18 ADDRESS2 : coverpoint addr2 {
19 option.auto_bin_max = 10;
20 }
21 endgroup
22
23 address_cov my_cov = new();
24
25 initial begin
26 my_cov.ADDRESS.option.at_least = 1;
27 my_cov.ADDRESS2.option.at_least = 2;
28 ce <= 0;
29 $monitor("ce %b addr 8'h%x addr2 8'h%x",ce,addr,addr2);
30 repeat (10) begin
31 ce <= 1;
32 addr <= $urandom_range(0,7);
33 #10;
34 ce <= 0;
35 #10;
36 end
37 end
38
39 endmodule
40
41 //simulation
42
43 ce 1 addr 8'h6 addr2 8'h7
44 ce 0 addr 8'h6 addr2 8'h7
45 ce 1 addr 8'h4 addr2 8'h5
46 ce 0 addr 8'h4 addr2 8'h5
47 ce 1 addr 8'h5 addr2 8'h6
48 ce 0 addr 8'h5 addr2 8'h6
49 ce 1 addr 8'h2 addr2 8'h3
50 ce 0 addr 8'h2 addr2 8'h3
51 ce 1 addr 8'h3 addr2 8'h4
52 ce 0 addr 8'h3 addr2 8'h4
53 ce 1 addr 8'h7 addr2 8'h0
54 ce 0 addr 8'h7 addr2 8'h0
55 ce 1 addr 8'h0 addr2 8'h1
56 ce 0 addr 8'h0 addr2 8'h1
57 ce 1 addr 8'h7 addr2 8'h0
58 ce 0 addr 8'h7 addr2 8'h0
59 ce 1 addr 8'h6 addr2 8'h7
60 ce 0 addr 8'h6 addr2 8'h7
61 ce 1 addr 8'h3 addr2 8'h4
62 ce 0 addr 8'h3 addr2 8'h4
63
64 //report
65 ===========================================================
66 Group : test::address_cov
67 ===========================================================
68 SCORE INSTANCES WEIGHT GOAL
69 87.50 62.50 1 100
70
71 1 Instances:
72
73 SCORE WEIGHT GOAL NAME
74 62.50 50 100 address_cov
75 -----------------------------------------------------------
76 Summary for Group test::address_cov
77
78 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
79 Variables 16 2 14 87.50
80
81 Variables for Group test::address_cov
82
83 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
84 ADDRESS 8 1 7 87.50 100 1
85 ADDRESS2 8 1 7 87.50 100 1
86 -----------------------------------------------------------
87 Summary for Variable ADDRESS
88
89 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
90 Automatically Generated Bins 8 1 7 87.50
91
92 Automatically Generated Bins for ADDRESS
93
94 Uncovered bins
95
96 NAME COUNT AT LEAST NUMBER
97 [auto[1]] 0 1 1
98
99 Covered bins
100
101 NAME COUNT AT LEAST
102 auto[0] 1 1
103 auto[2] 1 1
104 auto[3] 2 1
105 auto[4] 1 1
106 auto[5] 1 1
107 auto[6] 2 1
108 auto[7] 2 1
109 -----------------------------------------------------------
110 Summary for Variable ADDRESS2
111
112 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
113 Automatically Generated Bins 8 1 7 87.50
114
115 Automatically Generated Bins for ADDRESS2
116
117 Uncovered bins
118
119 NAME COUNT AT LEAST NUMBER
120 [auto[2]] 0 1 1
121
122 Covered bins
123
124 NAME COUNT AT LEAST
125 auto[0] 2 1
126 auto[1] 1 1
127 auto[3] 1 1
128 auto[4] 2 1
129 auto[5] 1 1
130 auto[6] 1 1
131 auto[7] 2 1
132 ===========================================================
133 Group Instance : address_cov
134 ===========================================================
135 Comment: This is cool
136 SCORE WEIGHT GOAL
137 62.50 50 100
138
139 Group:
140
141 SCORE INSTANCES WEIGHT GOAL NAME
142 87.50 62.50 1 100 test::address_cov
143 -----------------------------------------------------------
144 Summary for Group Instance address_cov
145
146 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
147 Variables 16 6 10 62.50
148
149 Variables for Group Instance address_cov
150
151 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
152 ADDRESS 8 1 7 87.50 100 1
153 ADDRESS2 8 5 3 37.50 100 1
154 -----------------------------------------------------------
155 Summary for Variable ADDRESS
156
157 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
158 Automatically Generated Bins 8 1 7 87.50
159
160 Automatically Generated Bins for ADDRESS
161
162 Uncovered bins
163
164 NAME COUNT AT LEAST NUMBER
165 [auto[1]] 0 1 1
166
167 Covered bins
168
169 NAME COUNT AT LEAST
170 auto[0] 1 1
171 auto[2] 1 1
172 auto[3] 2 1
173 auto[4] 1 1
174 auto[5] 1 1
175 auto[6] 2 1
176 auto[7] 2 1
177 -----------------------------------------------------------
178 Summary for Variable ADDRESS2
179
180 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
181 Automatically Generated Bins 8 5 3 37.50
182
183 Automatically Generated Bins for ADDRESS2
184
185 Uncovered bins
186
187 NAME COUNT AT LEAST NUMBER
188 [auto[2]] 0 2 1
189 auto[1] 1 2 1
190 auto[3] 1 2 1
191 auto[5] 1 2 1
192 auto[6] 1 2 1
193
194 Covered bins
195
196 NAME COUNT AT LEAST
197 auto[0] 2 2
198 auto[4] 2 2
199 auto[7] 2 2
7. Coverage methods
- void:触发covergroup的采样;
- real get_coverage():计算覆盖率,返回值为0-100;
- void set_inst_name(string):给实例设置名称;
- void start:开始收集覆盖率;
- void stop:结束书记覆盖率
1 module test();
2
3 logic [2:0] addr;
4 wire [2:0] addr2;
5
6 assign addr2 = addr + 1;
7
8 covergroup address_cov;
9 ADDRESS : coverpoint addr {
10 option.auto_bin_max = 10;
11 }
12 ADDRESS2 : coverpoint addr2 {
13 option.auto_bin_max = 10;
14 }
15 endgroup
16
17 address_cov my_cov = new;
18
19 initial begin
20 my_cov.ADDRESS.option.at_least = 1;
21 my_cov.ADDRESS2.option.at_least = 2;
22 // start the coverage collection
23 my_cov.start();
24 // Set the coverage group name
25 my_cov.set_inst_name("ASIC-WORLD");
26 $monitor("addr 8'h%x addr2 8'h%x",addr,addr2);
27 repeat (10) begin
28 addr = $urandom_range(0,7);
29 // Sample the covergroup
30 my_cov.sample();
31 #10;
32 end
33 // Stop the coverage collection
34 my_cov.stop();
35 // Display the coverage
36 $display("Instance coverage is %e",my_cov.get_coverage());
37 end
38
39 endmodule
40
41 //simulation
42
43 addr 8'h6 addr2 8'h7
44 addr 8'h4 addr2 8'h5
45 addr 8'h5 addr2 8'h6
46 addr 8'h2 addr2 8'h3
47 addr 8'h3 addr2 8'h4
48 addr 8'h7 addr2 8'h0
49 addr 8'h0 addr2 8'h1
50 addr 8'h7 addr2 8'h0
51 addr 8'h6 addr2 8'h7
52 addr 8'h3 addr2 8'h4
53 Instance coverage is 8.750000e+01
54
55 //report
56 ===========================================================
57 Group : test::address_cov
58 ===========================================================
59 SCORE WEIGHT GOAL
60 87.50 1 100
61 -----------------------------------------------------------
62 Summary for Group test::address_cov
63
64 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
65 Variables 16 2 14 87.50
66
67 Variables for Group test::address_cov
68
69 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
70 ADDRESS 8 1 7 87.50 100 1
71 ADDRESS2 8 1 7 87.50 100 1
72 -----------------------------------------------------------
73 Summary for Variable ADDRESS
74
75 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
76 Automatically Generated Bins 8 1 7 87.50
77
78 Automatically Generated Bins for ADDRESS
79
80 Uncovered bins
81
82 NAME COUNT AT LEAST NUMBER
83 [auto[1]] 0 1 1
84
85 Covered bins
86
87 NAME COUNT AT LEAST
88 auto[0] 1 1
89 auto[2] 1 1
90 auto[3] 2 1
91 auto[4] 1 1
92 auto[5] 1 1
93 auto[6] 2 1
94 auto[7] 2 1
95 -----------------------------------------------------------
96 Summary for Variable ADDRESS2
97
98 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
99 Automatically Generated Bins 8 1 7 87.50
100
101 Automatically Generated Bins for ADDRESS2
102
103 Uncovered bins
104
105 NAME COUNT AT LEAST NUMBER
106 [auto[2]] 0 1 1
107
108 Covered bins
109
110 NAME COUNT AT LEAST
111 auto[0] 2 1
112 auto[1] 1 1
113 auto[3] 1 1
114 auto[4] 2 1
115 auto[5] 1 1
116 auto[6] 1 1
117 auto[7] 2 1
8. Coverage system task
- $set_coverage_db(name):设置覆盖率数据库的文件名;
- $load_coverage-db(name):从给定的文件名加载所有覆盖组类型的累计覆盖信息 ;
- $get_coverage();返回0-100范围内所有覆盖组类型的总体覆盖率;
1 module test();
2
3 logic [2:0] addr;
4 wire [2:0] addr2;
5
6 assign addr2 = addr + 1;
7
8 covergroup address_cov;
9 ADDRESS : coverpoint addr {
10 option.auto_bin_max = 10;
11 }
12 ADDRESS2 : coverpoint addr2 {
13 option.auto_bin_max = 10;
14 }
15 endgroup
16
17 address_cov my_cov = new;
18
19 initial begin
20 // Set the database name
21 $set_coverage_db_name("asic_world");
22 $monitor("addr 8'h%x addr2 8'h%x",addr,addr2);
23 repeat (10) begin
24 addr = $urandom_range(0,7);
25 my_cov.sample();
26 #10;
27 end
28 // Get the final coverage
29 $display("Total coverage %e",$get_coverage());
30 end
31
32 endmodule
33
34 //simulation
35 module test();
36
37 logic [2:0] addr;
38 wire [2:0] addr2;
39
40 assign addr2 = addr + 1;
41
42 covergroup address_cov;
43 ADDRESS : coverpoint addr {
44 option.auto_bin_max = 10;
45 }
46 ADDRESS2 : coverpoint addr2 {
47 option.auto_bin_max = 10;
48 }
49 endgroup
50
51 address_cov my_cov = new;
52
53 initial begin
54 // Set the database name
55 $set_coverage_db_name("asic_world");
56 $monitor("addr 8'h%x addr2 8'h%x",addr,addr2);
57 repeat (10) begin
58 addr = $urandom_range(0,7);
59 my_cov.sample();
60 #10;
61 end
62 // Get the final coverage
63 $display("Total coverage %e",$get_coverage());
64 end
65
66 endmodule
67
68 //report
69 ===========================================================
70 Group : test::address_cov
71 ===========================================================
72 SCORE WEIGHT GOAL
73 87.50 1 100
74
75 -----------------------------------------------------------
76 Summary for Group test::address_cov
77
78 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
79 Variables 16 2 14 87.50
80
81 Variables for Group test::address_cov
82
83 VARIABLE EXPECTED UNCOVERED COVERED PERCENT GOAL WEIGHT
84 ADDRESS 8 1 7 87.50 100 1
85 ADDRESS2 8 1 7 87.50 100 1
86 -----------------------------------------------------------
87 Summary for Variable ADDRESS
88
89 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
90 Automatically Generated Bins 8 1 7 87.50
91
92 Automatically Generated Bins for ADDRESS
93
94 Uncovered bins
95
96 NAME COUNT AT LEAST NUMBER
97 [auto[1]] 0 1 1
98
99 Covered bins
100
101 NAME COUNT AT LEAST
102 auto[0] 1 1
103 auto[2] 1 1
104 auto[3] 2 1
105 auto[4] 1 1
106 auto[5] 1 1
107 auto[6] 2 1
108 auto[7] 2 1
109 -----------------------------------------------------------
110 Summary for Variable ADDRESS2
111
112 CATEGORY EXPECTED UNCOVERED COVERED PERCENT
113 Automatically Generated Bins 8 1 7 87.50
114
115 Automatically Generated Bins for ADDRESS2
116
117 Uncovered bins
118
119 NAME COUNT AT LEAST NUMBER
120 [auto[2]] 0 1 1
121
122 Covered bins
123
124 NAME COUNT AT LEAST
125 auto[0] 2 1
126 auto[1] 1 1
127 auto[3] 1 1
128 auto[4] 2 1
129 auto[5] 1 1
130 auto[6] 1 1
131 auto[7] 2 1