单片机新手小王
从验证工程师的角度,SVA最实用的就是抓那些“不该发生”的事情。书上例子太理想,我说几个接地气的。
比如检查中断行为:当中断信号intr被置起后,必须等到软件写特定清零寄存器才能拉低,中间不能自己掉下去。property p_intr_hold; @(posedge clk) $rose(intr) |-> intr until (reg_clear == 1‘b1); endproperty。 这种检查用传统写testbench的方式很啰嗦,用SVA一行断言,仿真自动报错,效率高。
再比如检查配置锁存:当配置使能信号cfg_en高时,配置数据cfg_data必须稳定,不能变。用$stable(cfg_data)配合cfg_en很容易写。
平衡覆盖率和性能,我的原则是:对关键协议路径(比如握手、仲裁、错误响应)必须用SVA断言,这是第一道防线。对于数据路径的复杂关系(比如一个数据包进来,经过处理,出来的结果要符合某种算法),更适合在scoreboard或参考模型里检查,因为SVA描述这种多周期、多变量的数据变换会很吃力,仿真开销大。
另外,多利用SVA的cover property来覆盖时序场景,比如“awvalid拉高后,在awready拉高之前,awaddr是否稳定”可以作为一个cover point,这样断言不仅是检查器,也是覆盖率收集器。
