返回介绍

17.7.7 first_match操作

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

对于操作数序列的一次计算尝试的多个可能的匹配,first_match操作符仅仅匹配其中的第一个。这就使得所有后续的匹配都不会被考虑。特别地,当一个序列是一个更大的序列的子序列的时候,first_match操作符对于封闭序列的计算具有明显的效果。

sequence_expr ::=      // 引用自附录A.2.10
    ...
  | first_match (sequence_expr{, sequence_match_item})

语法17-9 — first_match操作符语法(摘录自附录A)

first_match(seq)的每一次计算尝试均会产生一次起始于相同的时钟标记的针对操作数seq的计算尝试。如果seq的计算尝试没有产生匹配,那么first_match(seq)的计算尝试也不会产生匹配。否则,具有最早结束时钟标记的seq的匹配是first_match(seq)的匹配。如果seq在相同的结束时钟标记上具有多个最早的匹配,那么所有的这些匹配都是first_match(seq)的匹配。

下面的例子显示了一个可变延时的说明:

sequence t1;
    te1 ## [2:5] te2;
endsequence

sequence ts1;
    first_match(te1 ## [2:5] te2);
endsequence

在这个例子中,te1te2均为表达式。序列t1的每一次计算尝试均可能产生多达四个下列序列的匹配:

te1 ##2 te2
te1 ##3 te2
te1 ##4 te2
te1 ##5 te2

然而,序列ts1仅能为上述四个匹配中的一个产生匹配。上述四个序列中最先结束的那一个就是序列ts1的匹配。

另外一个例子:

sequence t2;
    (a ##[2:3] b) or (c ##[1:2] d);
endsequence

sequence ts2;
    first_match(t2);
endsequence

序列t2的每一次计算尝试均可能产生多达四个下列序列的匹配:

a ##2 b
a ##3 b
c ##1 d
c ##2 d

序列ts2仅仅匹配这些序列中最早结束的匹配。如果abcd均为表达式,那么可能存在两个在同一时间结束的匹配。

a ##2 b
c ##2 d

如果这些序列都是匹配的,并且(c ##1 d)没有匹配,那么ts2的计算会产生这样的两个匹配。

序列匹配条目可以被附加到first_match操作符的操作数序列。序列条目被放置在与包围操作数的括号相同的括号集内。因此,例如,局部变量赋值x = e可以通过下述的方式被附加到seq的first_match操作符:

first_match(seq, x = e)

上面的例子等价于:

first_match((seq, x = e))

参见17.8节和17.9节中有关序列匹配条目的讨论。

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

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

发布评论

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