断言stable
$stable是SVA提供的3个内嵌函数之一,用于检查信号的边沿变化,当信号/表达式的最低位不发生变化时返回真值。
stable_a用于检查信号a不变的情况,它只在“a在当前时钟周期为一个电平,在前一个时钟周期也为同样电平”的情况下成功
sequence stable_s;
@(posedge clk) $stable(a);
endsequence
stable_a: assert property(stable_s);
注意时序,我在这点上犯了一个错误
举例,
property ahb_hold_when_nready;
@(posedge clk) disable iff(!rst_n)
(hready===1'b0) |=> $stable({hwdata,haddr,hwrite});
endproperty
assert_ahb_hold_hold_when_nready:
assert property(ahb_hold_when_nready)
else
`uvm_err("","haddr & hwdata & hwrite signals not hold when unready")
上面标红的符号应选择交叠蕴含操作符,即“如果先行算子符合条件,后序算子在下一周期开始计算”,则计算当前时钟沿和下一个时钟沿的信号是否保持。
如果选择“|->”非交叠蕴含操作符,则检测是否stable的时期是上一个时钟沿和当前时钟沿是否一致。