在Assertion中规避信号从X态到0形成的engedge
前言:在开发SVA的过程中,我们经常会遇到clock比需要Check的signal后到来的情况。而在仿真器的理解中,仿真的0时刻,所有信号的value都是X,信号value从0 --> 1或者从X --> 1都是一个posedge;从1 --> 0或者X --> 0都是一个negedge。对于一个property块,如果clock比要Check的Signal晚来的话,那必然会导致$rose()和$fell()的误触发。本文重要讨论上述误触发的规避方案。
一、Assertion实例
1.1、现有如下waveform
- 假如Spec要求:在ack拉低时,req必须为0
1.2、SVA描述如下
property ack_fall_chk();
@(posedge clk) disable iff(!rst_n)
$fell(ack) |-> (req === 1'b0);
endproperty
C_ACK_F: assert property(ack_fall_chk()) else $error("ACK FALL CHECK ERROR!\n");
1.3、仿真结果
- 我们会发现:在clock到来的那一刻,C_ACK_F Check Fail
1.4、结果分析
- 当clock到来时,仿真器忍到ack由X态变到了0,于是$fell(ack)被触发了
1.5、 规避措施
- 目的,让仿真器识别下降沿的条件必须是信号value从1变到0
property ack_rose_chk();
@(posedge clk) disable iff(!rst_n)
!isunknown($past(ack, 1, 1)) & $fell(ack) |-> (req === 1'b0);
endproperty
C_ACK_F: assert property(ack_fall_chk()) else $error("ACK FALL CHECK ERROR!\n");
二、推广
- 同理,我们可以规避掉信号从X态变到1所形成的posedge