0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SystemVerilog中線程常用的精細(xì)化控制方法

sanyue7758 ? 來源:硅芯思見 ? 2023-03-27 10:48 ? 次閱讀

在計(jì)算機(jī)中存在進(jìn)程和線程的概念,其中進(jìn)程是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位,線程是進(jìn)程的一個(gè)執(zhí)行單元,是比進(jìn)程還要小的獨(dú)立運(yùn)行的基本單位。在一個(gè)程序中至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。進(jìn)程是資源分配最小單位,線程是程序執(zhí)行的最小單位。

計(jì)算機(jī)在執(zhí)行程序時(shí),會(huì)為程序創(chuàng)建相應(yīng)的進(jìn)程,進(jìn)行資源分配時(shí),是以進(jìn)程為單位進(jìn)行相應(yīng)的分配。每個(gè)進(jìn)程都有相應(yīng)的線程,在執(zhí)行程序時(shí),實(shí)際上是執(zhí)行相應(yīng)的一系列線程,過程如下圖所示。

0aa22f40-cb29-11ed-bfe3-dac502259ad0.png

在SystemVerilog中,雖然IEEE中也使用了process和thread,但是在實(shí)際手冊(cè)解釋的過程中,兩個(gè)概念基本上處于互用的狀態(tài),所以本文統(tǒng)一使用線程進(jìn)行描述說明SystemVerilog中線程常用的精細(xì)化控制方法。

在SystemVerilog中,線程的創(chuàng)建主要有以下幾種方式:

?每一個(gè)initial結(jié)構(gòu)都會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的線程;

?每一個(gè)final結(jié)構(gòu)都會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的線程(關(guān)于final用法參考《SystemVerilog中的final是怎么結(jié)束的》);

?每一個(gè)always、always_comb、always_latch和always_ff結(jié)構(gòu)都會(huì)創(chuàng)建對(duì)應(yīng)的線程;

?fork-join(join_any/join_none)結(jié)構(gòu)中每條并行執(zhí)行的語(yǔ)句塊;

?每一個(gè)動(dòng)態(tài)線程,一般并行執(zhí)行的線程并且不會(huì)阻塞其他線程或者task中其他語(yǔ)句執(zhí)行的線程;

?每一個(gè)連續(xù)賦值語(yǔ)句;

0ab709c4-cb29-11ed-bfe3-dac502259ad0.png

在SystemVerilog中可以通過process來實(shí)現(xiàn)對(duì)于上述線程的控制,而這個(gè)process其實(shí)是SystemVerilog中的一個(gè)內(nèi)建類,通過該類聲明的句柄可以指向特定的線程,從而可以通過該句柄實(shí)現(xiàn)對(duì)于指向線程的訪問控制。process類在SystemVerilog中的定義如下:

0ac638e0-cb29-11ed-bfe3-dac502259ad0.png

雖然process是一個(gè)類,但是這哥們比較特殊,不能被拓展派生,也就是說process不會(huì)有子類的,并且該類在創(chuàng)建對(duì)象時(shí),是不能使用new函數(shù)的,process類型句柄指向?qū)ο笫峭ㄟ^process::self()完成的,因此如果用戶需要通過process句柄指向?qū)?yīng)的線程時(shí)需要在對(duì)應(yīng)的線程中調(diào)用process::self()實(shí)現(xiàn)。在process中經(jīng)常用來實(shí)現(xiàn)對(duì)于線程控制的方法主要如下:

?self()返回指向當(dāng)前線程的句柄;

?status()返回當(dāng)前句柄指向線程的狀態(tài)(包含的狀態(tài)有:FINISHED、RUNNING、WAITING、SUSPEND和KILLED等狀態(tài));

?kill()終止當(dāng)前句柄指向的線程及其開啟的所有子線程;

?await()等待調(diào)用其的句柄指向的線程執(zhí)行完成,注意不能在調(diào)用其的句柄指向的線程中使用該方法,只能在別的線程中調(diào)用該方法用以阻塞調(diào)用該方法的句柄指向的線程;

?suspend()掛起當(dāng)前句柄指向線程;

?resume()恢復(fù)被掛起的線程;

?srandom()設(shè)置線程的隨機(jī)種子;

上述方法中,kill()、await()、suspend()、resume()只能用于initial、always和fork結(jié)構(gòu)啟動(dòng)的線程。下面將針對(duì)process中這些方法的使用進(jìn)行示例說明。

【示例】

0ad44962-cb29-11ed-bfe3-dac502259ad0.png

仿真結(jié)果】

0aefeb40-cb29-11ed-bfe3-dac502259ad0.png

示例中,首先聲明了兩個(gè)句柄p1和p2,在兩個(gè)initial結(jié)構(gòu)中,p1和p2通過調(diào)用“process::self()”實(shí)現(xiàn)p1和p2分別指向其所在的initial結(jié)構(gòu)開啟的線程。

第一個(gè)initial結(jié)構(gòu)中“@0”時(shí)刻第一個(gè)$display中通過p1.status()方法獲取了當(dāng)前線程的狀態(tài)(log中顯示為RUNNING),然后等待10個(gè)時(shí)間單位后,再次調(diào)用$display(),在其中調(diào)用p1.status()方法獲取了當(dāng)前線程時(shí)刻“@10”的狀態(tài)(log中顯示為RUNNING),再經(jīng)過100個(gè)時(shí)間單位,在時(shí)刻@110再次在$display()中調(diào)用p1.status()方法獲取了當(dāng)前線程的執(zhí)行狀態(tài)(log中顯示為RUNNING),該語(yǔ)句執(zhí)行完后第一個(gè)initial結(jié)構(gòu)開啟的線程執(zhí)行完畢。

第二個(gè)initial結(jié)構(gòu)中,“@0”時(shí)刻第一個(gè)$display中通過p2.status()方法獲取了當(dāng)前線程的狀態(tài)(log中顯示為RUNNING),然后等待10個(gè)時(shí)間單位后,再次調(diào)用$display(),在其中調(diào)用p2.status()方法獲取了當(dāng)前線程時(shí)刻“@10”的狀態(tài)(log中顯示為RUNNING),然后通過p1調(diào)用await()方法,p1.await()后的語(yǔ)句將處于等待p1指向線程執(zhí)行完畢,其后的語(yǔ)句此時(shí)處于阻塞的狀態(tài),當(dāng)p1指向的線程(也就是第一個(gè)initial結(jié)構(gòu))在時(shí)刻“@110”執(zhí)行完畢,p1.await()不再阻塞其后語(yǔ)句的執(zhí)行,其后的語(yǔ)句繼續(xù)執(zhí)行,此時(shí)調(diào)用p1.status()顯示的值為p1當(dāng)前的狀態(tài)(log中顯示此時(shí)p1狀態(tài)位FINISHED)。在等待100個(gè)時(shí)間單位,在時(shí)刻“@210”調(diào)用p2.status()時(shí),p2指向的線程還沒有執(zhí)行完畢,所以其顯示的狀態(tài)仍為RUNNING。上述兩個(gè)線程執(zhí)行的過程如下圖所示。

0b00d31a-cb29-11ed-bfe3-dac502259ad0.png

【示例】

0b0ed384-cb29-11ed-bfe3-dac502259ad0.png

【仿真結(jié)果】

0b24aa10-cb29-11ed-bfe3-dac502259ad0.png

示例中,聲明了三個(gè)process句柄p1、p2和p3.在initial結(jié)構(gòu)中調(diào)用“process::self()”實(shí)現(xiàn)p1指向當(dāng)前的initial結(jié)構(gòu)開啟的線程,然后調(diào)用$display語(yǔ)句通過p1.status()獲取當(dāng)前initial結(jié)構(gòu)開啟線程的執(zhí)行狀態(tài)為RUNNING(該initial結(jié)構(gòu)正在執(zhí)行中)。

fork-join_none結(jié)構(gòu)中所有語(yǔ)句是并行執(zhí)行的,示例中的fork結(jié)構(gòu)中一共有三個(gè)線程,

第一個(gè)線程通過調(diào)用“process::self()”實(shí)現(xiàn)p2指向自己,當(dāng)該方法結(jié)束后,該線程的歷史使命也就結(jié)束了,這里需要注意p2并沒有指向fork。

第二個(gè)線程為一個(gè)begin-end結(jié)構(gòu),在begin-end中首先通過調(diào)用“process::self()”實(shí)現(xiàn)了p3指向該線程,然后調(diào)用$display中通過p3.status()獲取當(dāng)前線程執(zhí)行狀態(tài)為RUNNING(該begin-end結(jié)構(gòu)還在執(zhí)行中),在等待100個(gè)時(shí)間單位,通過p2.status()和p3.status()獲取當(dāng)前時(shí)刻p2和p3指向線程的執(zhí)行狀態(tài),因?yàn)閜2指向的線程在調(diào)用“process::self()”完后就執(zhí)行完了,所以p2.status()返回的狀態(tài)位FINISHED,p3.status()獲取的狀態(tài)值仍為RUNNING(其所指向begin-end結(jié)構(gòu)還在執(zhí)行中),再等待100個(gè)時(shí)間單位,通過p2.status()和p3.status()獲取當(dāng)前時(shí)刻p2和p3指向線程的執(zhí)行狀態(tài),因?yàn)榇藭r(shí)fork-join_none中并行執(zhí)行的第三個(gè)線程通過p3調(diào)用了kill()方法,所以begin-end結(jié)構(gòu)對(duì)應(yīng)的線程被kill掉,因此此時(shí)企圖在等待100個(gè)時(shí)間單位再次獲取p2和p3執(zhí)行狀態(tài)的語(yǔ)句不會(huì)執(zhí)行。

第三個(gè)線程為等待190個(gè)時(shí)間單位后調(diào)用p3.kill(),實(shí)現(xiàn)了對(duì)于fork-join_none中第二個(gè)線程的kill操作。

fork-join_none結(jié)構(gòu)后通過p1.status()獲取p1指向線程的執(zhí)行狀態(tài)為RUNNING(因?yàn)閜1指向的initial結(jié)構(gòu)正在執(zhí)行中);

在經(jīng)過10個(gè)時(shí)間單位,通過p2.status()和p3.status()獲取當(dāng)前時(shí)刻p2和p3指向線程的執(zhí)行狀態(tài)分別為FINISHED(p2指向線程已經(jīng)執(zhí)行完畢)和WAITING(p3指向線程正在執(zhí)行其中#100,處于延遲阻塞等待狀態(tài));

通過p2.kill()企圖kill掉p2指向的線程,實(shí)際上此時(shí)p2指向的線程已經(jīng)執(zhí)行完畢,所以并不會(huì)影響p2指向線程的狀態(tài),所以此時(shí)在p2.kill()后通過p2.status()和p3.status()獲取當(dāng)前時(shí)刻p2和p3指向線程的執(zhí)行狀態(tài)仍為FINISHED(p2指向線程已經(jīng)執(zhí)行完畢)和WAITING(p3指向線程還在執(zhí)行其中#100,處于延遲阻塞等待狀態(tài));

在經(jīng)過210個(gè)時(shí)間單位,通過p1.status()、p2.status()和p3.status()獲取當(dāng)前時(shí)刻p1、p2和p3指向線程的執(zhí)行狀態(tài)為RUNNING(p1指向的initial結(jié)構(gòu)正在執(zhí)行中)、FINISHED(p2指向線程已經(jīng)執(zhí)行完畢)和KILLED(p3指向的線程執(zhí)行完之前,在fork-join_none結(jié)構(gòu)中等待190個(gè)時(shí)間單位時(shí)已經(jīng)被kill掉了,所以此時(shí)狀態(tài)位KILLED);上述線程執(zhí)行過程如下圖所示。

0b31298e-cb29-11ed-bfe3-dac502259ad0.png

【示例】

0b3d0aec-cb29-11ed-bfe3-dac502259ad0.png

【仿真結(jié)果】

0b4ecdea-cb29-11ed-bfe3-dac502259ad0.png

示例中,p通過“process::self()”指向了當(dāng)前的線程,通過$display顯示了p.status()為RUNNING,等待100個(gè)時(shí)間單位,企圖通過p.status()顯示p的狀態(tài),但是在這100個(gè)時(shí)間單位等待到其中的20個(gè)時(shí)間單位時(shí),另外一個(gè)initial結(jié)構(gòu)中仿真開始等待的20個(gè)時(shí)間單位后調(diào)用了p.suspend(),即此時(shí)將p指向的線程掛起,所以此時(shí)p指向的線程這時(shí)處于掛起等待狀態(tài),$display顯示了p.status()為SUSPEND,在再等待30個(gè)時(shí)間單位,調(diào)用p.resume()將之前掛起的p指向的線程返回,因?yàn)楫?dāng)前線程并未阻塞,所以當(dāng)前線程繼續(xù)執(zhí)行,$display顯示了p.status()為WAITING,當(dāng)前initial執(zhí)行完后,p指向的線程再次開始繼續(xù)之前暫停的執(zhí)行。

再等待80個(gè)時(shí)間單位(之前100個(gè)時(shí)間單位計(jì)時(shí)20個(gè)時(shí)間單位后還剩下80個(gè)時(shí)間單位未計(jì)時(shí))調(diào)用$display顯示了p.status()為RUNNING,再等待100個(gè)時(shí)間單位后調(diào)用$display顯示了p.status()仍為RUNNING。上述線程執(zhí)行過程如下圖所示。

0b5c5ac8-cb29-11ed-bfe3-dac502259ad0.png

通過示例可以看到,await是用來等待一個(gè)線程執(zhí)行完成后返回的,而suspend則用來將一個(gè)線程手動(dòng)掛起,其解除必須通過resume()來完成,并不一定要等到線程執(zhí)行完畢。

上述通過示例展示了process中常用方法的使用,其實(shí)在UVM中對(duì)于線程的控制大多都是通過process完成的,如下例中run_phase的執(zhí)行。

0b725e7c-cb29-11ed-bfe3-dac502259ad0.png

當(dāng)我們執(zhí)行run_test時(shí),實(shí)際上在run_test這個(gè)task中聲明了一個(gè)process句柄phase_runner_proc,這個(gè)句柄在425行通過“process::self()”指向了當(dāng)前fork-join_none結(jié)構(gòu)中的一個(gè)線程,這個(gè)線程就是fork-join_none中的begin-end。當(dāng)后續(xù)的m_run_phases()執(zhí)行完成后,wait等到了m_phase_all_done拉高,表明當(dāng)前的run_phases執(zhí)行完畢,然后通過phase_runner_proc.kill()將fork-join_none中開啟的線程及其所有子線程都kill掉,相當(dāng)于打掃戰(zhàn)場(chǎng),從而通過process實(shí)現(xiàn)了對(duì)于fork-join_none中線程及其所有子線程的控制操作。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7174

    瀏覽量

    87157
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1333

    瀏覽量

    109713
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    19087

原文標(biāo)題:進(jìn)程(線程)精細(xì)化控制中方法的使用

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    [原創(chuàng)] 歐洲精細(xì)化工展覽會(huì)(ChemSpec Europe 2010)

      歐洲精細(xì)化工展覽會(huì)(ChemSpec Europe 2010)      展會(huì)時(shí)間
    發(fā)表于 02-26 13:52

    2010年迪拜精細(xì)化工展

    ,Chemspec India 成功舉辦之后,精細(xì)化工展又一次開辟新市場(chǎng),成為目前中東地區(qū)唯一一個(gè)針對(duì)精細(xì)化工的專業(yè)展會(huì)。市場(chǎng)介紹中東主要包括阿聯(lián)酋、科威特、沙特、伊拉克、伊朗、也門、阿曼、巴林、卡塔爾、敘利亞
    發(fā)表于 06-02 17:26

    2010迪拜精細(xì)化工展/中東化工技術(shù)機(jī)械展

    Chemspec Europe,Chemspec India 成功舉辦之后,精細(xì)化工展又一次開辟新市場(chǎng),成為目前中東地區(qū)唯一一個(gè)針對(duì)精細(xì)化工的專業(yè)展會(huì)。市場(chǎng)介紹中東主要包括阿聯(lián)酋、科威特、沙特、伊拉克、伊朗
    發(fā)表于 06-29 13:57

    怎么才能讓無線站點(diǎn)實(shí)現(xiàn)精細(xì)化覆蓋?

    網(wǎng)絡(luò)覆蓋是電信運(yùn)營(yíng)商面臨的最大難題。數(shù)據(jù)業(yè)務(wù)浪潮的到來,將帶來新一輪的網(wǎng)絡(luò)競(jìng)爭(zhēng),作為無線網(wǎng)絡(luò)的神經(jīng)元,站點(diǎn)更需要精細(xì)化覆蓋到最細(xì)小的角落,應(yīng)對(duì)多場(chǎng)景變化,并實(shí)現(xiàn)站址獲取、快速交付、綠色環(huán)保、TCO節(jié)省等目標(biāo)。
    發(fā)表于 08-14 07:41

    實(shí)用精細(xì)化工辭典

    實(shí)用精細(xì)化工辭典共收5000余條精細(xì)化工名稱。所有名稱按中文筆劃、筆順排列,檢索方便。中文名稱原為英文名稱;外國(guó)商品名均采用原名稱,但日文假名均以英文表示;單位一
    發(fā)表于 11-29 09:33 ?0次下載
    實(shí)用<b class='flag-5'>精細(xì)化</b>工辭典

    精細(xì)化常用原材料手冊(cè)

    精細(xì)化常用原材料手冊(cè):介紹了精細(xì)化工產(chǎn)品制造常用原材料919種,分為36類:酸、堿、油、脂、羊毛脂及其衍生物,蠟,溶劑,表面活性劑,合成樹脂,合成橡膠及彈性體,單
    發(fā)表于 11-30 11:17 ?0次下載
    <b class='flag-5'>精細(xì)化</b>工<b class='flag-5'>常用</b>原材料手冊(cè)

    無線站點(diǎn)精細(xì)化覆蓋

    網(wǎng)絡(luò)覆蓋是電信運(yùn)營(yíng)商面臨的最大難題。數(shù)據(jù)業(yè)務(wù)浪潮的到來,將帶來新一輪的網(wǎng)絡(luò)競(jìng)爭(zhēng),作為無線網(wǎng)絡(luò)的神經(jīng)元,站點(diǎn)更需要精細(xì)化覆蓋到最細(xì)小的角落,應(yīng)對(duì)多場(chǎng)景變化,并實(shí)現(xiàn)站
    發(fā)表于 04-29 12:22 ?850次閱讀

    基于UEMS的電力系統(tǒng)精細(xì)化穩(wěn)定控制系統(tǒng)

    基于UEMS的電力系統(tǒng)精細(xì)化穩(wěn)定控制系統(tǒng)_常乃超
    發(fā)表于 01-04 17:05 ?0次下載

    MES系統(tǒng)實(shí)行精細(xì)化管理的六大步驟

    本文主要介紹了MES系統(tǒng)實(shí)行精細(xì)化管理的六大步驟。
    發(fā)表于 06-04 08:00 ?4次下載

    如何才能實(shí)現(xiàn)smt貼片車間的精細(xì)化管理

    要實(shí)現(xiàn)smt貼片車間的精細(xì)化管理,如果還是靠之前那種表格傳達(dá)數(shù)據(jù)的模式必然會(huì)出現(xiàn)銜接不良或者效率底下的問題,現(xiàn)在市場(chǎng)上已經(jīng)出現(xiàn)了ERP和更全面的MES系統(tǒng),如果從精細(xì)化的角度來講,應(yīng)該要把生產(chǎn)步驟
    發(fā)表于 09-28 14:25 ?1807次閱讀

    福斯特、光華科技、西隴科學(xué)上榜2020中國(guó)精細(xì)化工百?gòu)?qiáng)企業(yè)榜單

    ? 11月25日,“第二十屆國(guó)際精細(xì)化工原料及中間體峰會(huì)暨2020中國(guó)精細(xì)化工百?gòu)?qiáng)發(fā)布會(huì)”在山東壽光舉行,杭州福斯特應(yīng)用材料有限公司、西隴科學(xué)股份有限公司、廣東光華科技股份有限公司榮登“2020中國(guó)
    的頭像 發(fā)表于 12-15 15:22 ?4544次閱讀

    基于TransModeler軟件的精細(xì)化交通設(shè)計(jì)

    作為“區(qū)域—宏觀—中觀—微觀”一體化模型體系的中觀交通模型,以面向片區(qū)精細(xì)化交通改善設(shè)計(jì)和交通影響評(píng)價(jià)為出發(fā)點(diǎn),采用“靜態(tài)動(dòng)態(tài)分配相結(jié)合、整體中觀局部微觀”的建模方法,平衡建模效率與精度,實(shí)現(xiàn)精細(xì)化交通設(shè)計(jì)各類指標(biāo)評(píng)估。
    的頭像 發(fā)表于 08-20 12:34 ?1664次閱讀

    進(jìn)程(線程)精細(xì)化控制方法的使用

    在計(jì)算機(jī)中存在進(jìn)程和線程的概念,其中進(jìn)程是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位,線程是進(jìn)程的一個(gè)執(zhí)行單元,是比進(jìn)程還要小的獨(dú)立運(yùn)行的基本單位。在一個(gè)程序中至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有
    的頭像 發(fā)表于 03-26 14:27 ?480次閱讀

    淺談數(shù)據(jù)中心精細(xì)化建設(shè)策略分析

    摘要:通過分析用戶需求、建設(shè)和運(yùn)維等多方對(duì)數(shù)據(jù)中心建設(shè)的要求;結(jié)合國(guó)家政策、數(shù)據(jù)中心發(fā)展趨勢(shì),創(chuàng)新性地引入關(guān)鍵因素多角度分析法。同時(shí)系統(tǒng)性地提出數(shù)據(jù)中心高質(zhì)量發(fā)展中如何進(jìn)行精細(xì)化建設(shè)的策略。
    的頭像 發(fā)表于 05-17 10:24 ?558次閱讀
    淺談數(shù)據(jù)中心<b class='flag-5'>精細(xì)化</b>建設(shè)策略分析

    綜合管廊精細(xì)化節(jié)能系統(tǒng)設(shè)計(jì)與實(shí)施

    的基礎(chǔ)數(shù)據(jù),利用建立的能耗統(tǒng)計(jì)數(shù)據(jù)庫(kù)、管廊能耗評(píng)價(jià)指標(biāo)體系,研發(fā)一套管廊精細(xì)化節(jié)能診斷系統(tǒng),主要目標(biāo)是實(shí)現(xiàn)對(duì)綜合管廊能耗精細(xì)化分析,節(jié)約地下綜合管廊運(yùn)維過程中的能耗,為運(yùn)維管理人員提供決策支持、節(jié)能診斷和運(yùn)行策
    的頭像 發(fā)表于 06-19 16:31 ?256次閱讀
    綜合管廊<b class='flag-5'>精細(xì)化</b>節(jié)能系統(tǒng)設(shè)計(jì)與實(shí)施