Functional Coverage

SungchulCHA·2024년 8월 30일
0

System Verilog

목록 보기
6/6
  1. Combination Logic
  2. State Transition
  3. Cross Correlation : Router 같은거
  • 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]

Attributes

  • option, type_option 키워드를 이용하여 attribute 사용가능.
  • 전체 coverage group 또는 individual coverpoint에 적용가능.
  • at_least(1) : Minimum hits for a bin to be considred covered
  • weight (1) : multiplier for coverage bins
  • 나머지는 찾아보자

Measuring Coverage

  • Without auto-binning
    # of bins covered(have at_least hits)# of total bins\frac{\#\ of\ bins\ covered(have\ at\_least\ hits)}{\#\ of\ total\ bins}

  • With auto-binning
    # of bins covered(have at_least hits)min(possible values for data type  auto_bin_max)\frac{\#\ of\ bins\ covered(have\ at\_least\ hits)}{min(possible\ values\ for\ data\ type\ |\ auto\_bin\_max)}

Example

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%
VarBin#Hit
saauto[0:7]1
daauto[8:15]1
---------
saauto[0:7]1
saauto[8:15]1
daauto[8:15]2
---------
saauto[0:7]2
saauto[8:15]1
daauto[0:7]1
daauto[8:15]2

State and Transition Bin

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

Cross Coverage 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]};
}

모르겠음

Wildcard Bins

사용가능한데 ? 는 피하자(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

Event Timing 특정

정리할것

Parameterized Sample

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 

Coverage Progress

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

Control and Query of Covergroups

MethodFunction
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
profile
Myongji UNIV. B.S. in Electronic Engineering

0개의 댓글