2025年systemverilog中@和wait的区别

systemverilog中@和wait的区别在 SystemVerilo 中 用来触发事件时 使用 gt 用来等待事件使用 或者 wait 那么 和 wait 有什么区别呢 首先总结区别 事件阻塞 wait 和事件触发 gt 同时发生时 wait 阻塞可以正常等到事件触发 而

大家好,我是讯享网,很高兴认识大家。

在SystemVerilog中,用来触发事件时,使用->用来等待事件使用@或者wait。那么@和wait有什么区别呢?

首先总结区别:

事件阻塞@/wait()和事件触发->同时发生时,wait()阻塞可以正常等到事件触发,而@阻塞与事件触发产生竞争,有可能等到也有可能等不到触发而一直阻塞。

        Verilog事件可以实现线程的同步。就像在打电话时一个人等待另一个人的呼叫,在Verilog中,一个线程总是要等待一个带@操作符的事件。这个操作符是边沿敏感的,所以它总是阻塞着,等待事件的变化。其他的线程可以通过一>操作符来触发事件,解除对第一个线程的阻塞。
        SystemVerilog从几个方面对Verilog 事件做了增强。事件现在成为了同步对象的句柄,可以传递给子程序。这个特点允许你在对象间共享事件,而不用把事件定义成全局的。最常见的方式是把事件传递到一个对象的构造器(即new()函数)中。
        在Verilog中,当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争的可能性便出现了。如果触发线程先于阻塞线程执行,则触发无效(触发是一个零宽度的脉冲)。SystemVerilog引人triggered()函数,可用于查询某个事件是否已被触发,包括在当前时刻。线程可以等待这个函数的结果,而不用在@操作符上阻塞。

1. @会阻塞一个进程,直到@的事件被触发(->)后,该进程才会unblock。如果事件触发(->event)在@event先执行,则@event的进程会一直被阻塞住。如果->event和@event发生在同一个time step,就会造成竞争冒险,因为无法确认他们哪一个先执行。


讯享网

2. event的triggered属性的持续时间是一个time step, 因此它解决了触发事件和等待事件在同一个time step时的竞争冒险问题。只要wait(event.triggered)在->event之前执行,或者在同一个time step执行,都能正确地等到事件。

`timescale 1ns/10fs module event_test(); event a; //使用关键字event来声明一个事件a initial begin #50ns; ->a; end initial begin #50ns; @a; //第一个进程在50ns后触发了事件a,第二个进程在50ns的时候等待a,有可能等的到,有可能等不到,产生竞争 end endmodule 

讯享网

一、解决方法:
Systemverilog 引入了triggered()函数,用于检测某个事件是否已被触发过,包括正在触发。线程可以等待这个结果,而不用在@操作符上阻塞。

讯享网module event_test(); event a; //使用关键字event来声明一个事件a initial begin #50; ->a; $display("Event a is being triggered!"); end initial begin #20; wait(a.triggered); //使用wait来等待事件a,这种方式是一定可以等到a的 $display("#20 a.triggered!"); end initial begin #50; wait(a.triggered); //使用wait来等待事件a,这种方式是一定可以等到a的,这是和使用@来等待的区别 $display("#50 a.triggered!"); end initial begin #60; wait(a.triggered); //使用wait来等待事件a,a会被trigger一次,并且发生在wait前,永远等不到 $display("#60 a.triggered!"); //不会被打印 end endmodule 
forever begin wait(handshake.triggered); //注意不要写成wait(handshake.triggered()),会有编译错误,因为triggered不是一个function $display("get nexr event ..."); process_in_zero_time(); end 
讯享网forever begin wait(handshake.triggered); $display("get nexr event ..."); process_in_zero_time(); @clk; end 

2、将wait(handshake.triggered)换成@handshake,可以避免零延时循环。

forever begin @handshake; $display("get nexr event ..."); process_in_zero_time(); end 
小讯
上一篇 2025-02-13 12:27
下一篇 2025-02-10 14:48

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/66662.html