日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

事件触发控制_SystemVerilog线程控制与通信

發(fā)布時(shí)間:2023/12/2 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事件触发控制_SystemVerilog线程控制与通信 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

01

線程控制

1.概述

線程,即獨(dú)立運(yùn)行的程序;

線程需要被觸發(fā)執(zhí)行,可以結(jié)束或者不結(jié)束;

  • 在module中的initial和always,都可以看作獨(dú)立的線程,他們?cè)诜抡?時(shí)刻開始,而選擇結(jié)束或者不結(jié)束;

  • 在硬件模塊中都是always語句塊,所以可以看成是獨(dú)立運(yùn)行的線程,而且會(huì)一直占用仿真資源,因?yàn)樗麄儾粫?huì)結(jié)束;

驗(yàn)證環(huán)境需要initial語句塊,在仿真過程中,驗(yàn)證環(huán)境中的對(duì)象可以創(chuàng)建和銷毀,故驗(yàn)證環(huán)境的資源是動(dòng)態(tài)的;

  • 驗(yàn)證環(huán)境中的initial語句塊有兩種方式:begin……end或者fork……join;

Begin……end中語句順序執(zhí)行,而fork……join中語句并發(fā)執(zhí)行;

與fork……join類似的并行語句有fork……join_any、fork……join_none;

  • 線程的執(zhí)行軌跡是呈樹狀結(jié)構(gòu),即任何線程都應(yīng)該有父線程;

  • 父線程可以開辟若干子線程,父線程可以暫停或者終止子線程;

  • 當(dāng)子線程終止時(shí),父線程可以繼續(xù)執(zhí)行;

  • 當(dāng)父線程終止時(shí),其子線程都終止執(zhí)行;

2.并行線程

fork……join需要所有并行線程都結(jié)束才會(huì)繼續(xù)執(zhí)行;

fork……join_any其中任意一個(gè)線程結(jié)束就繼續(xù)執(zhí)行;

fork……join_none不等待子線程,直接繼續(xù)執(zhí)行;

  • 注意:

Fork……join_any和fork……join_none繼續(xù)執(zhí)行后,其一些未完成的子線程仍將繼續(xù)在后臺(tái)執(zhí)行;

如果要等待或者停止這些子線程,可使用wait?fork?或者disable?fork;

task do_test; fork …… join_any fork …… join_none wait fork;//等待所有子線程結(jié)束endtasktask get_first(output ubt adr); fork …… join_any disable fork;endtask

3.時(shí)序控制

  • SV可以通過延遲控制或者事件(event)等待來完成時(shí)序控制;

延遲控制即通過#來完成;

#100?clk2=clk1;

事件(event)控制即通過@來完成;

@a?clk1=clk2;??//等待事件

@(posedge?clk)a=b;//邊沿觸發(fā)

Wait語句可以與事件或者表達(dá)式結(jié)合使用;

Real?AOR[]; ?

Initial?wait(AOR,size()>0) ?//wait語句完成電平觸發(fā)

02

線程同步

1.概述

測(cè)試平臺(tái)所有線程都需要同步并進(jìn)行交換數(shù)據(jù);

一個(gè)線程等待另一個(gè)線程;

2.事件event

  • 通過event聲明一個(gè)event變量,并且觸發(fā);

  • event變量可以由一端去觸發(fā),再由另一端完成阻塞式的等待,即可以用來控制多個(gè)線程之間的同步;

  • 通過->來觸發(fā)事件;

  • 其他等待該事件的線程可以通過@操作符或者wait()來檢查事件觸發(fā)狀態(tài)來完成等待事件;

event done,blast; //聲明兩個(gè)獨(dú)立的事件event done_too=done; //事件done賦值給done_tootask trigger(event ev); ->ev; //觸發(fā)ev事件endtask……fork @done_too; //等待done_too #1 trigger(done); //觸發(fā)done事件joinfork ->blast; //觸發(fā)blast事件 wait(blast.triggered); //電平觸發(fā)等待join
  • wait_order() 可使得線程保持等待,直到在參數(shù)列表中的事件event按照順序從左往右依次完成;

wait_order(a,b,c);

3.旗語(semaphore)

旗語是一個(gè)互斥體,使用旗語可以實(shí)現(xiàn)對(duì)同一資源的訪問控制;

在創(chuàng)建旗語時(shí),會(huì)為其分配固定的鑰匙數(shù)量;

使用旗語的進(jìn)程必須先獲得鑰匙,才可訪問資源;

旗語的鑰匙數(shù)量可以有多個(gè),等待旗語的進(jìn)程也可以有多個(gè);

旗語的等待隊(duì)列是先進(jìn)先出(FIFO),即先排隊(duì)等待旗語的將優(yōu)先得到鑰匙;

旗語操作

創(chuàng)建旗語

semaphore?sm;//創(chuàng)建一個(gè)旗語

sm=new(1);?//分配一個(gè)鑰匙

創(chuàng)建一個(gè)固定鑰匙數(shù)量的旗語:new

從旗語獲取一個(gè)或多個(gè)鑰匙(阻塞型):get

返回一個(gè)或多個(gè)鑰匙:put

獲取一個(gè)或多個(gè)鑰匙而不被阻塞:try_get

task send; sem.get(1) ///獲取鑰匙 …… sem.put(1); //處理完成時(shí)把鑰匙返回endtask

03

線程通信

1.信箱

用于收發(fā)信息,SV中信箱可以存放任何數(shù)據(jù)類型,也可以從信箱中讀取這些數(shù)據(jù),

創(chuàng)建信箱:new()

將信息寫入信箱:put()

寫入信箱但不會(huì)阻塞:try_put()

獲取信息:get() 獲取信息并取出數(shù)據(jù):

??????????????????peek()獲取信息不會(huì)取出數(shù)據(jù)

從信箱獲取數(shù)據(jù)但不會(huì)阻塞:try_get()/try_peek()

獲取信箱信息數(shù)目:num()

2.信箱和隊(duì)列區(qū)別

  • 信箱必須通過new()例化,隊(duì)列只需要聲明

  • 信箱的存取方法put()和get()是阻塞方法,不一定會(huì)立即返回;隊(duì)列的存取方法push_back和pop_front()是非阻塞方法,會(huì)立即返回;

  • 傳遞形式參數(shù)時(shí),如果是input方向,則信箱類型傳遞的是句柄,隊(duì)列類型完成的是隊(duì)列內(nèi)容的拷貝;

3.總結(jié)

  • event:最小信息量的觸發(fā),即單一的通知單元,用來做事件的觸發(fā),也可多個(gè)事件組合起來作線程之間的同步;

  • semaphore:共享資源安全,用于多線程間需要對(duì)某一公共資源做訪問;

  • mailbpx:SV類似FIFO,在線程之間做數(shù)據(jù)通信或者內(nèi)部數(shù)據(jù)緩存;

END

往期相關(guān)(?猛戳可查看)

  • SystemVerilog

  • SystemVerilog兩態(tài)數(shù)據(jù)類型

  • SystemVerilog自定義、枚舉、結(jié)構(gòu)體類型

  • SystemVerilog數(shù)組操作

  • SystemVerilog數(shù)組類型

  • SystemVerilog函數(shù)和任務(wù)

  • SystemVerilog覆蓋率

$display("點(diǎn)個(gè)在看吧!")

總結(jié)

以上是生活随笔為你收集整理的事件触发控制_SystemVerilog线程控制与通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。