• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

systemverilog中@和wait的区别

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

在Verilog中当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争就出现了。如果触发线程先于阻塞线程,则触发无效(触发是一个零宽度的脉冲);
例如:verilog中使用@等待某个event产生竞争

`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()函数,用于检测某个事件是否已被触发过,包括正在触发。线程可以等待这个结果,而不用在@操作符上阻塞。

1.2、使用wait(event_a.triggered)等待event
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

从上面可以看出,使用wait(event.triggered)要优于使用@event的方法,但wait(event.triggered)的方法在任何时候都会优于@event吗?
看下面这个例子:

forever begin
  wait(handshake.triggered); //注意不要写成wait(handshake.triggered()),会有编译错误,因为triggered不是一个function
  $display("get nexr event ...");
  process_in_zero_time();
end

如果是在循环中使用wait(event.triggered),并且在下次等待之前没有延时,那么该事件一旦被触发就会反复执行,对上面的例子,如果某一时刻触发了handshake事件,则该Thread就会一直display(导致仿真Hang死),这种结果不是我们想要的,解法有两种:
1、wait(handshake.triggered)之后增加让时间推进的操作,如@(clk)。

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

posted on 2021-10-27 22:18  SOC验证工程师  阅读(6398)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3