事件触发控制_SystemVerilog线程控制与通信
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;endtask3.時(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)來完成等待事件;
wait_order() 可使得線程保持等待,直到在參數(shù)列表中的事件event按照順序從左往右依次完成;
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í)把鑰匙返回endtask03
線程通信
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微博网页版(微博搜索的微博)
- 下一篇: 飞书app怎么删除聊天记录