covergroup
으로 생성x
, z
안됨program automatic test;
covergroup fcov() @(port_event);
coverpoint sa;
coverpoint da;
endgroup: fcov
bit[3:0] sa, da;
event port_evet;
real coverage = 0.0;
initial while (coverage < 99.5) begin
...
sa = pkt_ref.sa;
da = pkt_ref.da;
->port_event;
coverage = $get_coverage();
end
endprogram: test
bit [3:0] sa, da;
covergroup cov1 @(posedge rtr_io.clock);
coverpoint sa; // 16 bins
coverpoint da; // 16 bins
compare: coverpoint (sa > da); // 2 bins
concat: coverpoint {sa, da} { // 256 bins
option.auto_bin_max = 256;
}
endgroup: cov1
auto_bin_max
attribute로 최대 bin 값 설정 가능
Bin name은auto[value_range]
option
, type_option
키워드를 이용하여 attribute 사용가능.at_least(1)
: Minimum hits for a bin to be considred coveredweight (1)
: multiplier for coverage binsWithout auto-binning
With auto-binning
bit [3:0] sa, da;
covergoup cov_addr @(rtr_io.cb);
coverpoint sa;
coverpoint da;
option.auto_bin_max = 2;
endgroup: cov_addr
cov_addr cov1 = new();
sa = 1; da = 8;
@(rtr_io.cb);
$display("%0d covered", $get_coverage()); // 50%
sa = 9; da = 9;
@(rtr_io.cb);
$display("%0d covered", $get_coverage()); // 75%
sa = 3; da = 5;
@(rtr_io.cb);
$display("%0d covered", $get_coverage()); // 100%
Var Bin #Hit sa auto[0:7] 1 da auto[8:15] 1 --- --- --- sa auto[0:7] 1 sa auto[8:15] 1 da auto[8:15] 2 --- --- --- sa auto[0:7] 2 sa auto[8:15] 1 da auto[0:7] 1 da auto[8:15] 2
covergroup MyCov() @(cov_event);
coverpoint port_number {
bins s0 = { 0 };
bins lo = { [0:7] };
bins hi[] = { [8:15] };
ignore_bins ignore = {16, 20 };
illegal_bins bad = default;
bins t0 = (0 => 8, 9 => 0);
bins t1[] = (8, [0:7] => [8:15]);
bins other_trans = default sequence;
}
endgroup: MyCov
s0
은 0을 가지는 1개의 bin
lo
는 0에서 7까지의 범위를 가지는 1개의 state bin
hi
는 hi_8부터 hi_f까지 8개의 state bin
ignore
는 hit 하면 무시함
bad
는 hit하면 시뮬레이션 종료
t0
는 1개의 transition bin
t1
은 8이랑[0:7]
(8개) 에서[8:15]
(8개) 총 9개에서 8개의 상태로 변하는 72개의 transition bin
other_trans
는 나머지 단일 state transition bin
src: coverpoint sa;
dest: coverpoint da { bins d1 = { 0 }; bins d2 = default; }
cx: cross src, dest {
bins lo = binsof(src) intersect {[0:4]};
bins mid = binsof(src) && binsof(dest.d1);
bins hi = ! binsof(src) intersect{[0:7]};
}
모르겠음
사용가능한데 ? 는 피하자(x, z도 사용 가능)
covergroup myCov() @(cov_event);
coverpoint port_number {
wildcard bins b1 = {4'b01??};
wildcard bins b2[] = {4'b011? => 4'b?000};
wildcard bins w1[2] = {4'b11??}; // w1[4'b1100, 4'b1101], w1[4'b1110, 4'b1111] 생성
}
endgroup: myCov
with
Bin Coverage제한 가능
covergroup cg0;
gfc_cp: coverpoint gfc {
bins lo[] = {[0:8'h0f]} with (item % 2 == 0);
bins med[] = {[8'h10:8'hc0]} with (item % 3 == 0);
}
endgroup
정리할것
covergroup pkt_cg with function sample(Packet pkt);
src: coverpoint pkt.sa;
dst: coverpoint pkt.da;
cross src, dst;
endgroup: pkt_cg
pkt_cg p_cg = new();
function bit Packet::check();
if (actual_pkt.compare(ref_pkt, message)) begin
p_cg.sample(actual_pkt);
...
end
endfunction: check
sample()
함수로 사용 가능
covergroup MyCov(ref reg[3:0] data,
reg reset_l,
input reg[3:0] middle)
coverpoint data {
bins s_lo (0:middle);
bins s_hi[] (middle+1:15) iff (reset_l);
}
endgroup: MyCov
program automatic test(router_io.TB rtr_io);
reg [3:0] mydata; reg reset_l;
MyCov cov1;
initial begin
cov1 = new(mydata, reset_l, 7);
reset_l = 0; mydata = 3;
cov1.sample();
#1 reset_l = 1; cov1.sample();
end
endprogram
covergroup cov1(ref int x, int y) @(rtr_io.cb);
mode1: coverpoint x{
bins S_1[] = { ]34:78], [1:27] }; }
endgrouop: cov1
program automatic Main;
int a;
real cov_percent;
cov1 c_obj1 = new(a, b);
initial forever begin
cov_percent = $get_coverage();
$display("%0d covered\n", cov_percent);
...
end
endprogram: Main
Method | Function |
---|---|
void sample() | Triggers sampling of the covergroup. Only works on covergroup instance |
real get_coverage() | Calculates type coverage number |
real get_inst_coverage() | Calculates the coverage number. muset set option.per_instance = 1; |
void start() | Starts collecting coverage information |
void stop() | Stops collecting coverage information |