如何在断言中使用 SystemVerilog 序列属性?

How can I use SystemVerilog sequence properties in asserts?

我想说"if there are an unlimited number of inputs, eventually I get an output",我该怎么办?

在脚本的其他部分,我想假设输入的供应有限,所以我不能只写 "assume there are an unlimited number of inputs" 并在全球范围内保持这种状态。

到目前为止我写了属性:

property always_another_valid_input;
   @(posedge clock) ##[1:$] valid_input;
endproperty

property foo;
    @(posedge clock) always_another_valid_input |-> ##[0:$] bar == 1;
endproperty

assert property (foo);

但是当我 运行 这个时我得到一个错误:property instance always_another_valid_input is not allowed in sequence expression.

如果我用非序列 属性 替换 |-> 的任一侧,那么我仍然会收到错误消息。仅当双方都是非序列属性时才有效。

有解决这个问题的好方法吗?

参考IEEE Std 1800-2012§16.12声明属性,更具体地说是§16.12.6含义,您将看到|-> 语法用法描述为:

property_expr ::=
    ...
    sequence_expr |-> property_expr
    sequence_expr |=> property_expr

左边必须是序列或序列表达式。它不能是 属性,即使 属性 只包含一个序列表达式。

如果您将 always_another_valid_input 声明为 sequence 而不是 property,您的代码将编译

<b>sequence</b> always_another_valid_input;
   @(posedge clock) ##[1:$] valid_input;
<b>endsequence</b>