SVA 断言16.9 Sequence operations序列运算翻译笔记(12)
16.9.1运算优先级
如下所示,优先级从上到下:
16.9.2 序列重复
序列内子序列连续重复的效果,可以通过明确地(显式)迭代子序列来实现:
//例1
a ##1 b ##1 b ##1 b ##1 c
使用连续重复运算符 [*3] ,显示了三次迭代,这种顺序行为被更简洁地指定:
a ##1 b [*3] ##1 c
//例2
a [*3] means a ##1 a ##1 a
a [*0] //表示一个空序列结果
空序列是指匹配零个时钟信号,而不匹配任何正时钟信号的序列,以下规则适用于将序列与空序列串联,空序列表示为empty,序列表示为seq:
(empty ##0 seq) //不会产生匹配
(seq ##0 empty) //不会产生匹配
(empty ##n seq), 其中n大于0, 等价于(##(n-1) seq).
(seq ##n empty), 其中n大于0, 等价于(seq ##(n-1) `true).
//例3
b ##1 ( a[*0] ##0 c)
例3不生成序列的匹配项。
//例4
b ##1 a[*0:1] ##2 c
//等价于
b ##2 c or b ##1 a ##2 c
语法在同一序列允许延迟和重复的组合:
`true ##3 (a [*3]) // means `true ##1 `true ##1 `true ##1 a ##1 a ##1 a
(`true ##2 a) [*3] // means (`true ##2 a) ##1 (`true ##2 a) ##1// (`true ##2 a), which in turn means `true ##1 `true
##1// a ##1 `true ##1 `true ##1 a ##1 `true ##1 `true ##1 a
//例5
(a ##2 b) [*5]
//等价于
(a ##2 b ##1 a ##2 b ##1 a ##2 b ##1 a ##2 b ##1 a ##2 b)
具有最小min和最大max迭代次数范围的重复,能用连续重复运算符[* min:max]表示。
//例6
(a ##2 b)[*1:5]
//等价于
(a ##2 b)
or (a ##2 b ##1 a ##2 b)
or (a ##2 b ##1 a ##2 b ##1 a ##2 b)
or (a ##2 b ##1 a ##2 b ##1 a ##2 b ##1 a ##2 b)
or (a ##2 b ##1 a ##2 b ##1 a ##2 b ##1 a ##2 b ##1 a ##2 b)
同样
//例7
(a[*0:3] ##1 b ##1 c)
//等价于
(b ##1 c) //注意:a重复次数为0,则其后所跟##1 不执行
or (a ##1 b ##1 c)
or (a ##1 a ##1 b ##1 c)
or (a ##1 a ##1 a ##1 b ##1 c)
有限的无限重复的情况:
//例8
a ##1 b [*1:$] ##1 c //a在第一拍为真,c在最后一拍为真,b严格在第一和最后一拍之间为真
通过精确计数指定重复的迭代次数,相当于指定最小重复次数等于最大重复次数的范,即,seq[*n]等同于seq[*n:n]。
非连续精确重复将布尔表达式而不是序列作为操作数,它指定布尔表达式在不一定连续且在最后一次迭代匹配时,结束的时钟点处的迭代匹配:
//例9
a ##1 b [->2:10] ##1 c
在第一拍a为真,在最后一拍c为真,b在倒数第二拍上为真,包括倒数第二拍,在b为真的第一拍和最后一拍之间至少有2个、最多有10个不一定是连续的时钟节拍。
例9等价于
a ##1 ((!b[*0:$] ##1 b) [*2:10]) ##1 c
//例10
a ##1 b [=2:10] ##1 c
//等价于
a ##1 ((!b [*0:$] ##1 b) [*2:10]) ##1 !b[*0:$] ##1 c