返回介绍

17.7.10 一个序列结束点的检测和使用

发布于 2020-09-09 22:55:54 字数 1538 浏览 899 评论 0 收藏 0

SystemVerilog中提供了两种方法将一个复杂序列分解成较为简单的子序列。

一种方法是通过引用名字来实例化一个命名序列。这样一个引用的计算要求命名序列从包围序列的计算期间引用被到达的时钟标记上开始匹配。例如:

sequence s;
    a ##1 b ##1 c;
endsequence

sequence rule;
    @(posedge sysclk)
        trans ##1 start_trans ##1 s ##1 end_trans;
endsequence

序列s从序列rule中的start_trans被计算的一个时钟标记之后开始计算。

使用一个序列的另外一个方法是在另外一个序列中检测它的结束点。只要一个序列匹配的结束时钟标记到达,这个序列的结束点就到达,而不管匹配的起始时钟标记如何。通过使用ended方法,任何序列中结束点的到达都可以被检测到。

ended方法的语法如下:

sequence_instance.ended

ended是一个作用于一个序列的方法。这个方法的操作结果或者为“真”,或者为“假”。当ended方法在一个表达式中被计算的时候,它检测其操作数序列在特定的时间点上是否到达了它的结束点。

ended的结果并不依赖于其操作书序列匹配的起始点。这样的一个例子如下所示:

sequence e1;
    @(posedge sysclk) $rose(ready) ##1 proc1 ##1 proc2;
endsequence

sequence rule;
    @(posedge sysclk) reset ##1 inst ##1 e1.ended ##1 branch_back;
endsequence

在这个例子中,序列e1必须在inst之后的一个时钟标记匹配。如果使用e1的一个实例来替代ended方法,e1的一个匹配必须在inst之后的一个时钟标记开始。注意:ended方法仅仅检测e1的结束点,并且对e1的起始点没有意义。ended方法可以用于具有形式参数的序列。例如下面的声明:

sequence e2(a,b,c);
    @(posedge sysclk) $rose(a) ##1 b ##1 c;
endsequence

sequence rule2;
    @(posedge sysclk) reset ##1 inst ##1 e2(ready,proc1,proc2).ended
        ##1 branch_back;
endsequence

rule2等价于下面的rule2a

sequence e2_instantiated;
    e2(ready, proc1, proc2);
endsequence

sequence rule2a;
    @(posedge sysclk) reset ##1 inst ##1 e2_instantiated.ended ##1 branch_back;
endsequence

在将局部变量传递到一个应用了ended方法的序列实例的时候存在一些其它的限制。参见17.8节。

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

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

发布评论

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