coverage

1,验证的一般过程:通过技术指标(Design Specification)设计验证计划(Verification  Plan),由验证计划开展验证工作。2,覆盖率一般分为两种表示:一种是显式的(Explicit),主要通过SV环境进行验证,验证手段是CRT(Constrained Random Tests),覆盖率要在验证通过后主动进行分析。一种是隐式的(Implicit),主要通过Directed  Tests来完成测试,覆盖率可以自己得出。3,完成覆盖率分析的步骤:1)运行一个带多个种子(Seeds)的测试,通过改变不同的种子(seed),可以对一个约束(Constrain)运行多次。2)检查运行结果,fail则表示发现Bug,这时得到的覆盖率数据必须丢弃掉。3)如果对某一个目标区域(targeted areas)的约束的测试覆盖率还未达到100%,但是一直在增加,可以运行更多的种子,来建立测试。如果覆盖率已经很难增加,则必须修改约束条件或者改用Directed  Test。     4,代码覆盖率(Code Coverage),一般可以通过工具自己完成,还可以细分为行覆盖率(Line  Coverage),路径覆盖率(Path  Coverage),翻转覆盖率(Toggle  Coverage),状态机覆盖率(FSM  Coverage)。代码覆盖率无法检查错误,主要针对设计指标(Design  Specification),观察验证范围是有多彻底,而不是根据验证计划(Verification Plan)来实现验证的。     5,功能覆盖率(Functional  Coverage),又叫做设计覆盖(Design  Coverage),指标覆盖(Specification  Coverage),主要指针对验证计划(Verification  Plan)来进行实现。     6,漏洞率(Bug  Rate),一种观察覆盖率的间接方法。只作为一种指标,并不需要调试为零,当漏洞率下降时,一般进行Corner  case验证,来使得验证更加充分。     7,断言覆盖率(Assertion  Coverage),用于核对两个设计信号之间关系的声明性代码(Declarative  Code),断言可以拥有局部变量(local  variables),可以进行简单的数据检查(Data  Checking)。     8,功能覆盖率策略(Function  Coverage  Strategies),在编写测试代码之前,你需要了解关键特性(The Key Design Features),边界情形(corner  cases),可能的故障模式(Failure  Modes)。明确要收集到的是功能实现信息,而不是数据,否则编译产生的数据量与你需要进行的分析量都将很大。还可以通过仿真器供应商(Simulation  Vendor)提供的选项(Switches)进行选择性编译来控制覆盖率数据是自己需要的。     9,测试的完备性(Measuring  Completeness),主要考虑三方面,代码覆盖率,功能覆盖率,漏洞率。代码覆盖率较低应该检查硬件设计指标,更新验证计划,增加更多的功能覆盖点(Functional  Coverage  Point)。功能覆盖率较低,如果验证实现了具体功能(Specified Functional )但是无法测试到,可能需要一些形式验证的工具来建立合适的激励(stimulus)。下面是一些语法上的例程。1,coverage的简单定义与构造:      covergroup   cg;            …          endgroup      cg   cg_inst = new;在covergroup定义了一系列参数时,它的例化必须通过new,这样一些实际的非默认的参数值才能被真正的赋予covergroup。2,一个covergroup除了可以定义多个coverpoint外,还可以定义多个cross coverage。例程中@()表示cover的触发条件,类似的表达还有wait(),coverpoint前的Hue等是coverpoint的label,默认可以省略,那么coverpoint的名称便代表这个point。enum { red, green, blue } color;bit [3:0] pixel_adr, pixel_offset, pixel_hue;covergroup  g2  @ (posedge clk);     Hue:     coverpoint  pixel_hue;     Offset:  coverpoint  pixel_offset;     AxC:      cross  color, pixel_adr;     All:        cross  color, Hue, Offset;endgroup3,在定义coverpoint时,可以使用关键字"iff"来进行选择触发条件,功能类似于if。例程表示在reset信号为false时,s0才会被cover。covergroup  g4 ;      coverpoint  s0   iff( !reset )endgroup4,coverpoint的定义中,关键字"bins"的作用可以描述为:对coverpoint所指变量的值进行细分,从而在最后的Coverage Report中,关于覆盖率的描述可以更贴近程序员的要求。如例程中已"a"为例,只有当a为[0:63]或65时,SV才会认为这个值被cover掉了,而且每个值得weigh都一样,最终生成在Coverage Report中。其中的"KaTeX parse error: Expected '}', got 'EOF' at end of input: … d   = { [1000:] };       bins   others[] = default;    }5,在bins中还可以定义转换列表(trans_list)来扩大cover的范围。default sequence的作用与default类似。定义的方式有:   value1 => value2      value1 => value3 => value4 => value5                                range_list1 => range-list2        trans_item [ * repeat_range ]                            3 [ 5 ] = 3 =>3=>3 =>3=>3      3 [ 3:5] 3组变化bit [4:1] v_a;covergroup  cg  @ ( posedge clk );coverpoint  v_a    {         bins  sa = ( 4 =>5 =>6), ( [7:9], 10 =>11,12);         bins  sb = ( 4 =>5 =>6), ( [7:9], 10 =>11,12);         bins  allother = default sequence;   }6,当bins没有被显性定义出来时,SV将进行自动的bins的分配。分配的规则是对于enum型的变量,enum中的每一个变量都被分到一个bins,对于非enum型的变量,分到的bins的数量N是,2的M的幂次方和auto_bin_max中的最小值,M是coverpoint的位数。对于N=3,M=3时,将会是3个bins分8个Values的情况,此时得到的结果是0:1,2:3,4:7。多余的值都会放在最后一个bins中。7,当coverpoint中的值可能会出现4-state时,可以在bins前加关键字"wildcard",则bins后出现的x,z,?将会按0和1来进行处理。例程中g12_16会cover的值有:1100,1101,1110,1111。wildcard   bins   g12_16 = { 4’b11?? };8,与bins相对应的还有两个关键字"ignore_bins",“illegal_bins"分别表示可以忽略的bins和违反规则的bins。covergroup cg23;coverpoint   a{       ignore_bins  ignore_vals = { 7,8 };      illegal_bins   bad_vals = {1,2,3};}endgroup9,covergroup中可以进行变量的传递。covergroup   gc  (ref int ra, int low, int high) @ ( posedge clk )    coverpoint  ra      {            bins  good = { [low : high] };            bins  bad[] = default;      }endgroupcg  c1 = new ( va, 0 ,50);cg  c2 = new ( vb, 120, 600);10,covergroup中cross相当于对两个coverpoint的变量的值进行维数上的扩展。在定义cross时,可以直接定义变量而不一定必须是coverpoint但是此时SV会自行将它定义为coverpoint,但是对于expression不可以这么做,必须先定义covergroup。例程中aXb仍然为label,a和b被SV隐性定义为covergroup。bit   [ 3:0 ] a,b ;covergroup  cov  @ ( posedge clk );     aXb:      cross  a,b;endgroup11,cross定义中bins的一些定义,如例程中含有关键字"binsof"表示coverpoint中bins的选值,“intersect"表示此时bins的再次约束。c1表示不取a中在[100:200]的值,但是其余的a的值都在bins  c1中,而b的值均不在bins  c1中,c2表示必须取a.a2或b.b2所以共有7对值。(a的结构与b类似)。此外也有类似的ignore_bins和illegal_bins两种关键字的定义。b:  coverpoint v_b                            {               bins  b1 = { 0 };         bins  b2 = { [1:84] };         bins  b3 = { [85:169] };         bins  b4 = { [170:255] };}c:   cross  v_a, v_b{       bins  c1 = !binsof(a)  intersect { [100:200] };       bins  c2 = binsof(a.a2)  ||  binsof(b.b2);}12,coverage中的option包括三个层次;covergroup,coverpoint,cross。其中只能在covergroup定义的有name和per_instance,主要用在多次例化中来keep trace。covergroup  CoverLength;    coverpoint   tr.length;    option.per_instance = 1;    option.comment = $psprintf(”%m”);endgroupoption.weigh表示权重,option.goal表示最终希望的覆盖率的目标,一般是100。option.comment表示注释的字符串。option.at_leat表示希望击中bins的最小次数。option.auto.bin.max(option.cross_auto_bin_max)表示SV自己分配bins时的最大值,option.cross_num_print_missing表示希望将没有覆盖掉的bins保存在数据库中。13,Predefined coverage methods其中定义的有: void sample(),触发covergroup来进行采样,只能操作在covergroup一级。 real get_coverage(),计算type coverage的值,0…100之间,  real get_inst_coverage(),计算coverage的值,0…100之间。后两者都可以在covergroup,coverpoint,cross来触发。14,各个覆盖点的权重:通过option.weight  =  value ,来表示。一个group的总体覆盖率是基于所有简单覆盖点(Simple  Cover  Points)和交叉覆盖点(Cross  Coverage)的,可以对两者分别赋予不同的权重。

你可能感兴趣的:(sh)