如果出现序列,则在System-Verilog断言中会在其中发生子序列

时间:2016-12-09 16:30:04

标签: system-verilog system-verilog-assertions

我想说: "如果序列A出现,则序列B出现在该序列中#34;。我怎么能这样做?

我原本以为我可以使用断言:

assert property (@(posedge clk) (A |-> (B within A));

但这似乎不适用于我的例子。

我已经读过:

  

如果第一个布尔表达式在第一个时钟周期评估为真,则第二个布尔表达式在第二个时钟周期评估为真时,线性序列被称为沿着连续时钟周期的有限区间匹配,等等,向上,向上包括最后一个布尔表达式,在最后一个时钟周期评估为真。

但我怀疑当我希望它成为第一个时钟时,时钟滴答传递到|->最后一个时钟滴答的其他位置。

我的特殊例子是一个累加器,如果我添加足够的正数,我希望它会溢出,所以我想要A = (input == 1)[*MAX_SIZE]B = (output == 0),所以这里B是一个长度为1的序列,我不知道这是否会导致问题。

我对system-verilog非常陌生,所以可能是我的代码的其他部分出了问题,但我还没有看到这个例子在任何地方都有过。

1 个答案:

答案 0 :(得分:2)

|->运算符中的结果在A匹配后启动是正确的。你想要的是回顾过去:"一旦我看到A,我看到了B within A?"。

您可以使用序列的triggered属性来执行此操作:

sequence b_within_a;
  @(posedge clk)
    B within A;
endsequence

assert property (@(posedge clk) A |-> b_within_a.triggered);

b_within_a序列将在A的末尾完全匹配,当然,如果B也发生了,那么triggered属性将评估为{{ 1}}。

请注意,1序列具有专门定义的时钟。这是LRM的要求,否则您将无法在其上拨打b_within_a