文章目录
断言简介
断言用于check设计,可以说断言check是最原始的check,最基础的check;只有满足所以断言都通过了,也就是符合设计者本身的了,才可以交给验证工程师进行进一步的功能验证;可以说断言可以保证基础的原则;一个之前在项目里比较经典的断言就是在fifo中加入空读满写断言,因为这是个公共的ip,很多地方都会调用到,所以某些设计者就可能没有注意到这个,自检可能也不会check到这种FIFO场景。加入这个断言之后后续要是验证发现了问题通过断言打印信息也能快速的定位问题,如果没有这个断言你进行DEBUG的时候可能只知道数据少了,但是不知道在哪个环节少的,加了这个断言就可以很好的定位到这个问题;可以说断言使得设计更加透明,跟像一个白盒;
sequnce语法
sequence s1;
a ##1 b ##1c;
endsequence
其实sequence和property之间的语法类似,主要的区别在于用法;一般来说sequence的更基础,property可以将sequence的东西拿来整合;
property语法
property a1;
@(posedge clk) fifo_full |-> (fifo_wr==1‘b0);
endproperty
如上就是很简单的一个例子,每个时钟上升沿进行check,如果fifo_full并且(fifo_wr == 1’b0)不满足,则断言失败,就是满写了;需要注意的是这里的property并不会调用,需要写明assert才会真实的起作用;关于 |-> 后面再讲;
assert property(a1);
可以根据自己需要diy打印东西;
assert property(a1) begin
$display("");
end
else begin
$display("");
end
assert/cover/assume
前面所说的property没有真的起到作用,需要一句assert方可生效,另外如果要覆盖的话,将assert语句改为cover即可;
可以理解为assert在每一拍都进行检测,而cover在序列出现后就实现了覆盖,在覆盖率文件中就可以得到体现;这里注意下命名;
bind关键字的使用
对于对应数字的说明:
1:qma可以认为是一个verilog代码写的module,这个是它的模块名,不是例化名;
2: qma_sva是你单独写的一个断言module,这也是模块名;
3: qma_sva_inst是你例化这个断言模块所使用的例化名;
4.: (.)括号里面的意思是例化的时候直接将相同名字的连起来(.a(a),.b(b)),像这样;
这句话实现的是在你原先写的qma模块里面例化了一个名字为qma_sva_inst的qma_sva模块;后面的(.),如果你名字不一样应该是要自己手动写一遍的,名字一样就可以这样,所以命名的时候可以注意下;
在qma_sva模块中实现断言操作如下:
“|->” 与 "|=>"含义与区别
property a2;
@(posedge clk) a |-> b;
endproperty
以上的意思就是在a成立的同一拍进行b的检测,可以认为a成立b成立才断言成功;如果a成立b不成立则断言失败;如果a不成立,此时断言不会进行(认为“伪成功”);所以 |-> 可以认为是否判断条件,只有在a成立才会有后续;
|=> 与 |-> 类似,差别是前者在下一拍再进行check;
常见函数
函数名 | 作用 |
---|---|
$rose(a) | 信号的上升沿,上一时钟沿为低,这一时钟为高,则认为成功 注意的是0->z/x也会成功 |
$fell(a) | 信号的下降沿,上一时钟沿为高,这一时钟为低,则认为成功 注意的是z/x -> 0也会认为成功 |
$stable(a) | 信号保持不变 |
** seq1 intersect seq2 ** | 序列同时开始,同时结束,并且都要成功,才会成功 |
seq1 within seq2 | seq1 发生在seq2之后,并且结束在seq2之前,并且二者都有成功 |
seq1 throughout seq2 | 在seq1匹配期间seq肯定匹配 |
$past(a,2) | 获取a信号2个周期之前的值 |
$onehot(a[11:0]) | a一位为高,否则false |
$onehot0(a[11:0]) | a位高的位数小于等于1 |
$isunknown(a) | 若a中存在z/x则返回成功 |
$countones(a) | 统计a中有几个位数为高 |
$countbits(a,'1) | 统计中a中1的位数,同$countones(a), 还可以统计z/x/0的个数如 $countbits(a,'0,'1,'z,'x);同时统计四态 |
not(a) | 对括号内的内容进行取反 |
常用语法
语法 | 用途 |
---|---|
##n | 延时,如a ##1 b 代表a后一个周期b为高,则断言成功 |
##[m:n] | 延时m-n个时钟周期发生,即可 |
[*n] | 重复,如 a[*3],同 a ##1 a ##1 a ##1;这里注意需要连续 |
[*n:m] | 重复,同上,重复次数在n到m |
[=m] | 如 b[=m] ##1 c 表示b进行m次,间隔不连续个采样时钟周期,c在b最后一次发生后最小间隔一个时钟后发生,如m次b发生完后c还未发生,并且要发生m+1次b则报错 |
[=m:n] | 同上,但次数在m到n的范围内 |
[->m] | 同[=m],区别是[=m]后续的匹配可以延后直到匹配,而[->m]后续的匹配必须在下一拍匹配上 |
[->m:n] | 同上 |
disable iff的用法
格式:
property a;
@(posedge clk)
disable iff(reset) //如果复位信号为高,则停止检查
a |-> b;
endproperty