返回介绍

17.7.2 序列中的复制

发布于 2020-09-09 22:55:53 字数 4336 浏览 994 评论 0 收藏 0

下面是序列复制的语法:

sequence_expr ::=           // 引用自附录A.2.10
    ...
  | expression_or_dist [boolean_abbrev]
  | (expression_or_dist{, sequence_match_item}) [boolean_abbrev]
  | sequence_instance [sequence_abbrev]
  | (sequence_expr{, sequence_match_item}) [sequence_abbrev]
    ...

boolean_abbrev ::=
    consecutive_repetition
  | non_consecutive_repetition
  | goto_repetition

sequence_abbrev ::= consecutive_repetition

consecutive_repetition ::= [* const_or_range_expression]

non_consecutive_repetition ::= [= const_or_range_expression]

goto_repetition ::= [-> const_or_range_expression]

const_or_range_expression ::=
    constant_expression
  | cycle_delay_const_range_expression

cycle_delay_const_range_expression ::=
    constant_expression : constant_expression
  | constant_expression : $

语法17-5 — 序列复制语法(摘录自附录A)

一个复制需要迭代的数目既可以通过一个准确的数值来指定,也可以被要求位于一个有限的范围之内。如果指定了一个准确的数值,那么迭代的数目通过一个非负的整数常量表达式来定义。如果它被要求位于一个有限的范围之内,那么迭代的最小数目通过一个非负的整数常量表达式来定义,迭代的最大数目既可以是一个非负的整数常量表达式也可以是$(它指示一个有限的但无边界的最大值)。

如果迭代的最小数目和最大数目都通过非负的整数常量表达式来定义,那么迭代的最小数目必须小于或等于其最大数目。

SystemVerilog提供了三种类型的复制:

  • 连续复制([*):连续复制说明了操作数序列的有限多的迭代匹配,它在一个匹配的结束到下一个匹配的开始之间具有一个时钟标记的延时。整个复制序列在操作数的最后一个迭代匹配的结束处匹配。
  • 跳转复制( [->):跳转复制指定了操作数布尔表达式的有限多的迭代匹配,在操作数的一次匹配到后续匹配之间具有一个或多个时钟标记的延时并且之间没有操作数的严格匹配。整个复制序列在操作数的最后一次迭代匹配处匹配。
  • 非连续复制([=):非连续复制制定了操作数布尔表达式的有限多的迭代匹配,它在操作数的一次匹配到后续匹配之间具有一个或多个时钟标记的延时,并且之间没有操作数的严格匹配。整个复制序列在操作数最后一次迭代匹配的时候或之后但在操作数的任何后来匹配之前匹配。

一个序列内的一个子序列的连续复制的效果可以通过显式地迭代子序列来获得,例如:

a ##1 b ##1 b ##1 b ##1 c

通过使用连续复制操作符[*3],它指示了3次迭代,这个有序的行为能够以更加简洁的方式说明:

a ##1 b [*3] ##1 c

一个连续复制指出操作数序列必须匹配指定数目的次数。连续复制操作符[*N]指出操作数序列必须连续地匹配N次。例如:

a [*3]

意味着

a ##1 a ##1 a

使用0作为复制数目会产生一个空的序列,例如:

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)

例如:

b ##1 (a[*0] ##0 c)

不会产生序列的匹配。

b ##1 a[*0:1] ##2 c

等价于

(b ##2 c) or (b ##1 a ##2 c)

语法允许在同一个序列中组合一个延时和复制。下列的例子都是被允许的:

‘true ##3 (a [*3]) // 意味着`true ##1 `true ##1 `true ##1 a ##1 a ##1 a
(‘true ##2 a) [*3] // 意味着(‘true ##2 a) ##1 (‘true ##2 a) ##1
                   // (‘true ##2 a),进一步意味着‘true ##1 ‘true ##1
                   // a ##1 ‘true ##1 ‘true ##1 a ##1 ‘true ##1 ‘true ##1 a

一个序列可以按如下方式重复:

(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]来表达。

例如:

(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)

类似地:

(a[*0:3] ##1 b ##1 c)

等价于:

(b ##1 c)
or (a ##1 b ##1 c)
or (a ##1 a ##1 b ##1 c)
or (a ##1 a ##1 a ##1 b ##1 c)

为了指定一个有限的但无边界数目的迭代,我们可以使用一个$符号。例如,下面的复制:

a ##1 b [*1:$] ##1 c

在上面的例子中,如果a在第一个时钟标记处为“真”,c在最后一个时钟标记处为“真”,并且b在第一个和最后一个时钟标记之间的每一个时钟标记都为“真”,那么这个序列在三个或更多个时钟标记的间隔上匹配。

通过准确数目来指定一个复制迭代的数目等价于指定一个最小复制数目等于最大复制数目的范围。换句话说, seq[*n]等价于seq[*n:n]。

跳转复制(非连续准确的复制)将一个布尔表达式而不是一个序列作为操作数。它指定了在没必要连续并且在最后一个迭代匹配上结束的时钟标记上的布尔表达式的迭代匹配。例如:

a ##1 b [->2:10] ##1 c

在上面的例子中,如果a在第一个时钟标记处为“真”,c在最后一个时钟标记上为“真”,b在倒数第二个时钟标记处为“真”,并且在第一个和最后一个b为“真”之间不一定为连续的时钟标记上具有至少2个(包括倒数第二个时钟标记)、最多10个b为“真”,那么例子中的序列在连续的时钟标记的间隔上匹配。它等价于下面的例子:

a ##1 ((!b[*0:$] ##1 b) [*2:10]) ##1 c

除了一个匹配不必在操作数布尔表达式的最后一个迭代匹配结束之外,非连续复制类似于跳转复制。如果布尔表达式在所有的时钟标记上为“假”,那么使用非连续复制而不是跳转复制使得匹配被扩展了任意多的时钟标记。例如:

a ##1 b [=2:10] ##1 c

如果a在第一个时钟标记处为“真”,c在最后一个时钟标记处为“真”,并且在b为“真”的第一个和最后一个匹配之间至少两个至多10个不必连续的时钟标记上匹配,那么这个序列匹配。这个序列等价于:

a ##1 ((!b [*0:$] ##1 b) [*2:10]) ##1 !b[*0:$] ##1 c

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文