[SV]Systemverilog中@和wait區別及應用案例分析

前言:在SystemVerilog中,用来触发事件时,使用->;用来等待事件使用@或者wait。那么@和wait有什么区别呢?在Verilog中当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争就出现了。如果触发线程先于阻塞线程,则触发无效(触发是一个零宽度的脉冲)。

一、解决方法:

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

1.1、使用@等待某個Event產生競爭

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

1.2、使用wait(event_a.triggered)等待Event

module event_test();event a;    //使用关键字event来声明一个事件ainitial begin#50;->a;$display("Event a is being triggered!");endinitial begin#20;wait(a.triggered); //使用wait来等待事件a,这种方式是一定可以等到a的$display("#20 a.triggered!");endinitial begin#50;wait(a.triggered); //使用wait来等待事件a,这种方式是一定可以等到a的,这是和使用@来等待的区别$display("#50 a.triggered!");endinitial begin#60;wait(a.triggered); //使用wait来等待事件a,a會被trigger一次,並且並且發生在wait之前,永遠等不到$display("#60 a.triggered!");  //不會被打印endendmodule

二、Event: @/triggered()

在多线程通信中,可以使用event实现线程的同步,即一个线程等待/触发另一个线程。

2.1、使用方法

  • Thread 1(触发线程):  -> event;

  • Thread 2(等待线程):@event / wait(event.triggered);

使用上述方法,Thread2就会blocking在 @event / wait(event.triggered); 处,只有Thread1执行完 -> event; 后,Thread2才会向下执行。按上述方法使用是没问题的,那么有下面几个问题:

2.2、典型问题

  • Q1: 如里Thread2等待的语句在Thread1触发后执行,会是什么样的结果呢?

  • A: 如果Thread1触发操作只有一次,那么Thread2将永远blocking在等待语句@event / wait(event.triggered())处。

  • 結論:等待线程的等待语句必须发生在触发线程之前執行。

  • Q2: @event与wait(event.triggered)的区别

  • A: 若触发线程和等待线程在同一时刻发生,则使用wait(event.triggered)的线程会被触发,结束blocking,而使用@event的线程则会永远blocking在这,无法结束。看下面的两个例子:

module event_test();event a;    //使用关键字event来声明一个事件ainitial begin#1;->a;$display("Event a is being triggered!");endinitial begin#1;@a; //第一个进程在1ns后触发了事件a,那么第二个进程在1ns的时候等待a,有可能等的到,有可能等不到,产生竞争$display("wait event a");endinitial begin#1;wait(a.triggered); //第一个进程在1ns后触发了事件a,那么第二个进程在1ns的时候等待a,一定能等到$display("wait a.triggered");endendmodule
  • Q3: 从上面的例子可以看出,在该类应用中,使用wait(event.triggered)要优于使用@event的方法,但wait(event.triggered)的方法在任何时候都会优于@event吗?

  • A: 答案是否定的。看下面这个例子:

forever beginwait(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 beginwait(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
(0)

相关推荐

  • 同步调用和异步调用

    前言:本文没什么创见,只是把有关内容做一个概括,希望能对新手有些用,也欢迎大家补充更正. 操作系统发展到今天已经十分精巧,线程就是其中一个杰作.操作系统把 CPU 处理时间划分成许多短暂时间片,在时间 ...

  • 第54天:Python 多线程 Event

    Event(事件) Event 是一个事务处理的机制,用于通知多个异步任务某个事件已经发生了.比如在交通红绿灯中多辆在行驶中的汽车可以表示成程序中的多个异步任务,红绿灯的亮起可以表示成一个通知,红灯通 ...

  • python提醒事件

    定时任务是业务中很常见的一个需求.本文作者通过某公众号任务提醒的项目,介绍了如何实现用户定时提醒. 文 | 喵叔 原文:https://blog.betacat.io/post/how-wecron- ...

  • 工程建设中渗漏问题,如何避免?对照案例分析原因(地下部分)

    减少工程建设中渗漏问题的发生,这篇对地下部分常见的渗漏类质量通病,通过图片的方式进行了展示说明,并对其产生原因进行了综合分析,同时提供了应对措施和推荐做法. 地下部分常见的5大渗漏原因 1.止水钢板设 ...

  • 散粮运输中货损货差及人身伤亡事故案例分析

    摘要:以问题为导向,围绕散粮运输零事故.整个过程不出险情.有效保障船东经济利益等目标,通过案例分析,找出出现问题的原因,供业界参考. 一.引言 国际贸易中以散装形式装运的粮食类货物统称为散粮,主要有大 ...

  • SystemVerilog中根据系统时间产生随机数的函数

    基本原理: 1.通过在SystemVerilog中调用$system系统函数 2.执行shell终端命令date +%N > tmp,将date +%N命令的结果写入文件tmp中 3.打开并读取 ...

  • 艾灸和烤肉的區別

    你是在艾灸,还是在烤肉? 经常有人问到这样的问题:艾灸好烫,根本坚持不了多久,怎么办? 觉得烫就赶紧调整好角度或者距离,一秒都不要忍着,艾灸温度要让自己舒服为准,真正灸进去了,灸的地方不仅不烫,还会很 ...

  • 投資房地產和其他的投資方式有什麼區別?

    投资英国房地产 一直以来都是热门的投资方式之一,但大多数的投资者会仍然偏向投资股票市场,股票虽然是一个具知名度的投资方式,但很多人并不知道购买房地产也是投资的好选择,在对的状况房地产可获得更高的回报, ...

  • 陳四軒:揖、拱及其區別

    陳四軒:"揖"與"拱"及其區別 <說文解字>:"手著胸曰揖." <周禮·秋官·司儀>:"土揖庶姓.時揖異姓 ...

  • 朱木通 臨床病例(241)小兒腸炎、四逆湯與白頭翁湯之區別

    小兒腸炎.四逆湯與白頭翁湯之區別 年齡性別 男,9個月. 發病情形 當六個月時,患急性腸炎,發熱下痢,日夜十餘行,歷經各小兒科醫生,大抵以氯黴素.鹽水注射而已.然而下痢不稍差.但荏苒三月餘,熱已退,下 ...

  • 林志縈李宗駒尤惜陰等玄空風水區別在哪裡?

    玄空六法概論 玄空風水學派,一般而言最為大眾所知者,即章仲山.沈竹礽一派,其法以元運之數入中宮,分山.向兩盤,依陰陽順逆並按洛書九宮之循行路線排列九星之數,看坐山和向首所飛臨之星為生旺或衰死,再配合巒 ...

  • 美标中、低温压力容器用钢板SA516Gr70性能分析

    美标中、低温压力容器用钢板SA516Gr70性能分析