检查SVA过去发生的事件的最佳方法是什么?

时间:2019-07-10 20:27:42

标签: system-verilog assertion system-verilog-assertions

我想在设计中检查一下,当信号b被置为有效时,信号a应该在3至5个周期之前被置为有效。

我正在寻找不同的检查方法。

当前我正在使用以下逻辑

sequence s_test();
##1 $rose(a) ##[3:5] 1;
endsequence

property p_test();
##1 $rose(b) |-> s_test.triggered();

有没有一种方法可以在不使用序列触发机制的情况下检查该属性?我想我也可以使用$ past(a,3)||之类的东西。 ... || $ past(a,5),但这很麻烦。

还有触发序列和匹配机制之间的区别是什么?

3 个答案:

答案 0 :(得分:1)

我们可以在此处采用两种方法:先造成后造成后果由于原因造成后果

然后造成影响的方法

您可以使用基于基于时间的断言来说明,当触发$.ajax({ type: "POST" , url: "serverIP/WebProject/WebContents/view/filename/function name" , data: null , contentType: "application/json; charset=utf-8" , dataType: "json" , async: false , success: function (jSonResult) { }, error: function (xhr, status, error) { console.log(error + "\n" + status + "\n" + xhr.responseText); } }); 时,s_test应该在1-5个时钟周期的时间窗口内变高:

b

效果然后导致方法

或者,如果s_test.triggered |-> ##[1:5] $rose(b); 信号,则可以使用粘合逻辑来监视s_test的5个值。此后,断言检查s_test从0上升到1时s_test的较早值必须至少具有1'b1。

b

here也有类似的讨论,而参考文献here上方。

答案 1 :(得分:1)

您可以使用$past,如下所示。

property test_past;
  @(posedge clk)
    $rose(b) |-> ##[3:5] $past(a);
endproperty

答案 2 :(得分:1)

triggeredmatched方法对于单时钟和多时钟序列有所不同。

这两种方法都显示序列的终点,但是如果操作数序列在特定时间到达其终点,则triggered方法的计算结果为true,否则为false。

matched方法检测多时钟序列引用的序列端点。因此,它提供2个序列之间的同步,并在匹配后评估为true,直到到达目标序列的第一个时钟滴答为止。

序列的

triggered状态在观察区域中设置,并在其余时间段内保持不变。而matched的状态在观察区域中设置,并一直持续到匹配后目标序列的第一个时钟滴答到达的观察区域。