3.3 SEQUENCES, PROPERTIES, AND CONCURRENT ASSERTIONS
3.3.1 SEQUENCE SYNTAX AND EXAMPLES
一个序列是在一段时间内发生的一组值的规范。构建序列所使用的基本操作是延迟规范器,形式为##n(表示特定数量的时钟)或##[a:b](表示在a和b个时钟之间的可变延迟)。特殊符号$可用于序列的上界,指定可能无限数量的周期。当序列的指定值全部发生时,称该序列被匹配。具有可变延迟的序列在任何执行跟踪过程中可能有多个重叠的匹配。下图展示了一些简单的sequence例子:
另一个常见的序列操作是重复运算符[m:n]。这表示一个子序列将被重复一定次数。同样,上界可以是$,表示可能会有无限次重复。下图展示了使用该运算符的一些示例:
序列可以使用and、or或者操作符进行逻辑组合。(注意,这些与SystemVerilog中提供的||和&&操作符是不同的,后者用于布尔表达式的逻辑与或运算。)使用and操作符时,表示两个序列同时开始,尽管它们的结束点可能不匹配。对于or操作符而言,两个序列中必须有一个匹配。此外,throughout操作符非常有用,它检查某个布尔表达式在整个序列的执行过程中始终为真;within操作符也很有用,它检查一个序列是否发生在另一个序列的执行过程中。下图展示了使用这些操作符的一些示例:
通常有用的最后一组序列操作符是跳转重复操作符[- > n]和[ = n]。它们表示某个值在序列中恰好出现n次,尽管这些出现可能是不连续的,并且在它们之间可能有任意其他活动。简单的跳转[- > n]在该值的最后一次出现时匹配,而非连续的跳转[ = n]允许在最后一次出现之后有任意的其他活动。下图显示了一些示例:
除非作为断言语句的一部分,否则序列是没有用的;上面的简单示例在技术上是代码片段,而不是有用的语句。将序列作为断言或假设是没有意义的,但序列在构建覆盖属性方面非常有用。下面是一些可能在仲裁器示例中有用的覆盖断言语句的示例:
转自:芯片验证笔记