[SVA]如何在SystemVerilog Assertion中规避信号从X态到0形成的negedge

             在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
原创文章 228 获赞 180 访问量 6万+

猜你喜欢

转载自blog.csdn.net/gsjthxy/article/details/105694228
今日推荐