systemverilog中关于事件的那些事

  说道systemverilog中的线程间通信,不得不说一下事件(event),事件也就两种:边沿阻塞(@ e)和电平阻塞(wait(e.triggered ()))。

  1.事件通过-> 操作符来触发事件,通过@或者wait等待事件的触发。

  2.@相当于Verilog中的边沿触发,@一定要先于->,@只在触发的那一瞬间有效 ,@而triggered是Verilog中的电平触发,只要事件触发后,triggered一直有效,triggered相当于事件的一个函数,使用方法:wait(e.triggered());

  eg:

   `timescale 1ns/1ns

   event e;

    initial

     begin

        fork

          #10 -> e ;

         # 20 @ e;

     join

    $dispaly("done");

 end

该程序会阻塞在20ns时刻,不回输出“done”,因为触发信号只在10ns处有效。

 initial

  begin

        fork

          #10 @ e ;

         # 20 -> e;

     join

  $dispaly("done");

  end

该程序会在20ns处结束fork进程,并打印“done”。

initial

  begin

        fork

          #10 -> e ;

         # 20 wait (e.triggered());

     join

  $dispaly("done");

  end

会打印“done”。

3.在循环中使用事件

在循环中使用wait一定小心,容易导致零延时死循环。如:

  forever begin

   wait(e.triggered())   //零延时循环    因为triggered是电平触发,一旦事件触发,会一直有效

end

但是用边沿触发就没事了,如:

  forever begin 

  @e ;

end


申明:有些词是用我自己思维写出来的,不是官方的,如果表达不准确,请纠正也请原谅

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值