返回介绍

13.5.4 稳固的触发:触发特性

发布于 2020-09-09 22:55:52 字数 1109 浏览 851 评论 0 收藏 0

SystemVerilog能够从在整个时间步值期间持续(也就是直到仿真时间继续)的事件触发状态中辨别事件触发器本身(瞬时的)。触发的事件特性允许用户检查这个状态。

触发的特性使用一个类似于方法的语法来调用:

hierarchical_event_identifier.triggered

如果指定的事件在当前的时间步值中已经被触发那么触发的事件特性计算成真,否则计算成假。如果事件标识符为null,那么触发的事件特性计算成假。

触发的事件特性在一个wait结构的关联文中最为有用:

wait (hierarchical_event_identifier.triggered)

使用这种机制,一个事件触发器应该为等待进程解除阻塞,无论它在触发操作之前执行还是在与触发操作相同的仿真时间上执行。因此,当触发和等待同时发生的时候,触发的事件特性能够消除一个普通的竞争条件。根据等待和触发进程的执行顺序,一个阻塞一个事件的进程既可以也能够不解除阻塞。然而,无论等待和触发操作的顺序如何,一个等待触发状态的进程总是解除阻塞。

例子:

event done, blast;     // 声明两个新的事件
event done_too = done; // 将done_too声明成done的别名

task trigger(event ev);
    -> ev;
endtask

...

fork
    @ done_too;       // 通过done_too等待done
    #1 trigger(done); // 通过任务trigger触发done
join

fork
    -> blast;
    wait (blast.triggered);
join

上面例子中的第一条分支语句显示了两个事件标识符(done和done_too)如何引用相同的同步对象,它还显示了一个事件怎样被传递到一个通用的触发这个事件的任务。在这个例子中,一个进程通过done_too等待事件,而真实的触发通过将done作为一个参数传递的trigger任务完成的。

在第二条分支语句中,一个进程可以在另外一个进程(如果fork...jion中的进程以源顺序执行)有机会执行并等待这个事件之前触发事件。尽管如此,第二个进程会解除阻塞并且fork会中止。这是因为进程等待事件的触发状态,它在时间步值的持续期内保持它的触发状态。

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

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

发布评论

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