我想说:
"如果序列A
出现,则序列B
出现在该序列中#34;。我怎么能这样做?
我原本以为我可以使用断言:
assert property (@(posedge clk) (A |-> (B within A));
但这似乎不适用于我的例子。
我已经读过:
如果第一个布尔表达式在第一个时钟周期评估为真,则第二个布尔表达式在第二个时钟周期评估为真时,线性序列被称为沿着连续时钟周期的有限区间匹配,等等,向上,向上包括最后一个布尔表达式,在最后一个时钟周期评估为真。
但我怀疑当我希望它成为第一个时钟时,时钟滴答传递到|->
最后一个时钟滴答的其他位置。
我的特殊例子是一个累加器,如果我添加足够的正数,我希望它会溢出,所以我想要A = (input == 1)[*MAX_SIZE]
和B = (output == 0)
,所以这里B
是一个长度为1的序列,我不知道这是否会导致问题。
我对system-verilog非常陌生,所以可能是我的代码的其他部分出了问题,但我还没有看到这个例子在任何地方都有过。
答案 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
。