返回介绍

16.5 阻塞周期/事件模式下的任务

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

在设计模块内部调用程序任务或函数是非法的并且会导致一个错误。这是因为设计不必敏感于测试平台。SystemVerilog允许程序调用位于其它程序或位于设计模块内部的任务和函数。设计模块内部的函数可以从一个程序中被调用,并且不要求特殊的处理。然而,从一个程序中调用的位于设计模块内部的阻塞任务(一个没有在0仿真时间执行的任务)在从任务返回时却要求显式的同步。也就是说,当阻塞任务返回到程序代码的时候,程序块的执行被自动挂起直到Reacive区域。参数的拷贝发生在任务返回的时候。

在从程序内部调用设计模块中的阻塞任务时需要特别小心。在第一个时序控制上阻塞之前被任务计算的表达式应该使用它们已经被无阻塞赋值更新后的值。相反,如果在时间步值的起始处(在无阻塞赋值被处理之前)从一个模块中调用任务的话,那么那些相同的表达式应该使用它们被无阻塞赋值更新之前的值。

module ...
    task T;
        S1: a = b;     // 可能在Observe区域之前或之后执行
        #5;
        S2: b <= 1'b1; // 总是在Observe区域之前执行
    endtask
endmodule

如果在一个模块中调用上面的任务T,那么语句S1可以在Active区域被处理的时候立即执行,并发生在变量b被一个无阻塞赋值更新之前。如果在一个程序内部调用相同的任务,那么语句S1应该在Reactive区域被处理的时候执行,并在变量b可以已经被无阻塞赋值更新之后。语句S2总是在延时过期之后立即执行;它不会等待Reactive区域,即使它最初从程序块中被调用。

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

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

发布评论

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