以下陈述之间的细微差别
a -> b
vs a ##0 b
?
答案 0 :(得分:2)
您必须检查的第一件事是单个蕴涵算子的语法a |-> b
。
在SystemVerilog断言中有两个表达式。
a ##0 b
a |-> b
实际上,它看起来像表达式中的相似。该表达式的第一个是检查a
是否被置位(1)并且在0时钟周期b
被置位(1)之后。第二个表达式是在b
被置位时检查a
是否(on)断言(1)然后在相同的posedge b
上断言(1)或不断言。
现在,实际上,当验证工程师编写这种断言时,他们会处理以下事情。
a ##0 b
:在此表达式中,如果未声明a
,则表示失败。 当a
被置位(1)且同一时间戳b
未被断言时,也会显示失败。
a |-> b
:在此表达式中,如果a
被置位且b
未被断言,那么它将显示失败。 如果未声明a
,则不会检查b
是否已声明。此行为与a ##0 b
不同。
如果你应用不同的输入数据,那么你可以看到表达式a ##0 b
会比a |-> b
给你更多的失败。上面已经解释了相同的原因。
另外需要注意的是"蕴涵构造只能用于属性定义。它不能用于序列。"
谢谢,
Ashutosh说
答案 1 :(得分:1)
您的问题说明了蕴涵运算符(|->
)的重要性。此示例使用蕴涵运算符,非常有用:
a -> b
表示"如果a
为真,则b
应为true
" (有用)。
这不是,通常不是很有用:
a ##0 b
表示" a
和b
应始终为真" (不是很有用)。