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)的,可以对两者分别赋予不同的权重。
coverage
最新推荐文章于 2024-07-16 19:21:06 发布