SVA(SV断言手段)
SVA是一种强大的验证手段,本文将介绍一些工作中实用的方式。
验证寄存一拍
之前接触过一个DUT,子模块的部分输入打两拍后输出给下一级子模块。如果使用UVM,专门写一个monitor,一个scoreboard会表现出一种杀鸡焉用牛刀的感觉。其实,这种和时序密切相关的输出,可以直接使用SVA:
1 | Title: UVM大哥和SVA小老弟 |
1 | property cmd_wrdata_check; |
Explain:断言中的信号值实际上是时钟沿到来之前的值。所以,对于非阻塞复制:b<=a逻辑的断言应该是:“@ (posedge clk) (1,tmp=a) |=> (b==tmp);”。上例多延时一拍”##1“,从而实现了寄存两拍的效果。
调用function
SVA还可以对保存的数据做简单的处理。这个类似于写一个reference model,并且实现每个cycle级别的检查。
1 | Title: DUT大哥和SVA小老弟 |
1 | property wren_check; |
Explain:例2使用了断言可以调用function,从而检查了相邻bit位不能出现01,10的情况。结合例1,聪明的你是否也发现,SVA还可以利用function的结果作为下一级的判断条件呢?
实现循环检查
验证小伙儿又犯难了,这次要让他验证一个clock gating。这个gating被总共例划了的12份。所有都一样,只是hierarchy中行列号不同。写12个断言吧,不是不行,只是显得冗余。
1 | Title: 重复和SVA小老弟 |
1 | property clock_gate_check(signal1, signal2); |
Explain:例3显示利用property生成一个模板,然后使用generate语句重复调用这个模板,从而实现了对12个clock gating的验证。
FIFO空满检验
断言在验证FIFO的空满标志时也非常实用。
1 | Title: FIFO和SVA小老弟 |
1 | //counter |
Explain:例4验证的是一个深度为32的FIFO,通过利用读写两个counter去记录目前为止。一旦满了,cnt=32,full应该立即拉高。一旦为空,cnt=0,empty应该立即拉高。
references
- Mehta A B. SystemVerilog Assertions and Functional Coverage[M]. Springer., 2014.
- http://blog.sina.com.cn/s/blog_4c270c730101f6mw.html