色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SystemVerilog中線程常用的精細化控制方法

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

在計算機中存在進程和線程的概念,其中進程是并發執行的程序在執行過程中分配和管理資源的基本單位,線程是進程的一個執行單元,是比進程還要小的獨立運行的基本單位。在一個程序中至少有一個進程,一個進程至少有一個線程。進程是資源分配最小單位,線程是程序執行的最小單位。

計算機在執行程序時,會為程序創建相應的進程,進行資源分配時,是以進程為單位進行相應的分配。每個進程都有相應的線程,在執行程序時,實際上是執行相應的一系列線程,過程如下圖所示。

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

在SystemVerilog中,雖然IEEE中也使用了process和thread,但是在實際手冊解釋的過程中,兩個概念基本上處于互用的狀態,所以本文統一使用線程進行描述說明SystemVerilog中線程常用的精細化控制方法。

在SystemVerilog中,線程的創建主要有以下幾種方式:

?每一個initial結構都會創建一個對應的線程;

?每一個final結構都會創建一個對應的線程(關于final用法參考《SystemVerilog中的final是怎么結束的》);

?每一個always、always_comb、always_latch和always_ff結構都會創建對應的線程;

?fork-join(join_any/join_none)結構中每條并行執行的語句塊;

?每一個動態線程,一般并行執行的線程并且不會阻塞其他線程或者task中其他語句執行的線程;

?每一個連續賦值語句;

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

在SystemVerilog中可以通過process來實現對于上述線程的控制,而這個process其實是SystemVerilog中的一個內建類,通過該類聲明的句柄可以指向特定的線程,從而可以通過該句柄實現對于指向線程的訪問控制。process類在SystemVerilog中的定義如下:

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

雖然process是一個類,但是這哥們比較特殊,不能被拓展派生,也就是說process不會有子類的,并且該類在創建對象時,是不能使用new函數的,process類型句柄指向對象是通過process::self()完成的,因此如果用戶需要通過process句柄指向對應的線程時需要在對應的線程中調用process::self()實現。在process中經常用來實現對于線程控制的方法主要如下:

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

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

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

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

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

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

?srandom()設置線程的隨機種子;

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

【示例】

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

仿真結果】

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

示例中,首先聲明了兩個句柄p1和p2,在兩個initial結構中,p1和p2通過調用“process::self()”實現p1和p2分別指向其所在的initial結構開啟的線程。

第一個initial結構中“@0”時刻第一個$display中通過p1.status()方法獲取了當前線程的狀態(log中顯示為RUNNING),然后等待10個時間單位后,再次調用$display(),在其中調用p1.status()方法獲取了當前線程時刻“@10”的狀態(log中顯示為RUNNING),再經過100個時間單位,在時刻@110再次在$display()中調用p1.status()方法獲取了當前線程的執行狀態(log中顯示為RUNNING),該語句執行完后第一個initial結構開啟的線程執行完畢。

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

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

【示例】

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

【仿真結果】

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

示例中,聲明了三個process句柄p1、p2和p3.在initial結構中調用“process::self()”實現p1指向當前的initial結構開啟的線程,然后調用$display語句通過p1.status()獲取當前initial結構開啟線程的執行狀態為RUNNING(該initial結構正在執行中)。

fork-join_none結構中所有語句是并行執行的,示例中的fork結構中一共有三個線程,

第一個線程通過調用“process::self()”實現p2指向自己,當該方法結束后,該線程的歷史使命也就結束了,這里需要注意p2并沒有指向fork。

第二個線程為一個begin-end結構,在begin-end中首先通過調用“process::self()”實現了p3指向該線程,然后調用$display中通過p3.status()獲取當前線程執行狀態為RUNNING(該begin-end結構還在執行中),在等待100個時間單位,通過p2.status()和p3.status()獲取當前時刻p2和p3指向線程的執行狀態,因為p2指向的線程在調用“process::self()”完后就執行完了,所以p2.status()返回的狀態位FINISHED,p3.status()獲取的狀態值仍為RUNNING(其所指向begin-end結構還在執行中),再等待100個時間單位,通過p2.status()和p3.status()獲取當前時刻p2和p3指向線程的執行狀態,因為此時fork-join_none中并行執行的第三個線程通過p3調用了kill()方法,所以begin-end結構對應的線程被kill掉,因此此時企圖在等待100個時間單位再次獲取p2和p3執行狀態的語句不會執行。

第三個線程為等待190個時間單位后調用p3.kill(),實現了對于fork-join_none中第二個線程的kill操作。

fork-join_none結構后通過p1.status()獲取p1指向線程的執行狀態為RUNNING(因為p1指向的initial結構正在執行中);

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

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

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

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

【示例】

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

【仿真結果】

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

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

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

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

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

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

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

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





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7488

    瀏覽量

    87852
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110077
  • UVM
    UVM
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19167

原文標題:進程(線程)精細化控制中方法的使用

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    [原創] 歐洲精細化工展覽會(ChemSpec Europe 2010)

      歐洲精細化工展覽會(ChemSpec Europe 2010)      展會時間
    發表于 02-26 13:52

    2010年迪拜精細化工展

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

    2010迪拜精細化工展/中東化工技術機械展

    Chemspec Europe,Chemspec India 成功舉辦之后,精細化工展又一次開辟新市場,成為目前中東地區唯一一個針對精細化工的專業展會。市場介紹中東主要包括阿聯酋、科威特、沙特、伊拉克、伊朗
    發表于 06-29 13:57

    怎么才能讓無線站點實現精細化覆蓋?

    網絡覆蓋是電信運營商面臨的最大難題。數據業務浪潮的到來,將帶來新一輪的網絡競爭,作為無線網絡的神經元,站點更需要精細化覆蓋到最細小的角落,應對多場景變化,并實現站址獲取、快速交付、綠色環保、TCO節省等目標。
    發表于 08-14 07:41

    實用精細化工辭典

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

    精細化常用原材料手冊

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

    無線站點精細化覆蓋

    網絡覆蓋是電信運營商面臨的最大難題。數據業務浪潮的到來,將帶來新一輪的網絡競爭,作為無線網絡的神經元,站點更需要精細化覆蓋到最細小的角落,應對多場景變化,并實現站
    發表于 04-29 12:22 ?897次閱讀

    基于UEMS的電力系統精細化穩定控制系統

    基于UEMS的電力系統精細化穩定控制系統_常乃超
    發表于 01-04 17:05 ?0次下載

    MES系統實行精細化管理的六大步驟

    本文主要介紹了MES系統實行精細化管理的六大步驟。
    發表于 06-04 08:00 ?4次下載

    如何才能實現smt貼片車間的精細化管理

    要實現smt貼片車間的精細化管理,如果還是靠之前那種表格傳達數據的模式必然會出現銜接不良或者效率底下的問題,現在市場上已經出現了ERP和更全面的MES系統,如果從精細化的角度來講,應該要把生產步驟
    發表于 09-28 14:25 ?1867次閱讀

    福斯特、光華科技、西隴科學上榜2020中國精細化工百強企業榜單

    ? 11月25日,“第二十屆國際精細化工原料及中間體峰會暨2020中國精細化工百強發布會”在山東壽光舉行,杭州福斯特應用材料有限公司、西隴科學股份有限公司、廣東光華科技股份有限公司榮登“2020中國
    的頭像 發表于 12-15 15:22 ?4763次閱讀

    基于TransModeler軟件的精細化交通設計

    作為“區域—宏觀—中觀—微觀”一體化模型體系的中觀交通模型,以面向片區精細化交通改善設計和交通影響評價為出發點,采用“靜態動態分配相結合、整體中觀局部微觀”的建模方法,平衡建模效率與精度,實現精細化交通設計各類指標評估。
    的頭像 發表于 08-20 12:34 ?1850次閱讀

    進程(線程)精細化控制方法的使用

    在計算機中存在進程和線程的概念,其中進程是并發執行的程序在執行過程中分配和管理資源的基本單位,線程是進程的一個執行單元,是比進程還要小的獨立運行的基本單位。在一個程序中至少有一個進程,一個進程至少有
    的頭像 發表于 03-26 14:27 ?576次閱讀

    淺談數據中心精細化建設策略分析

    摘要:通過分析用戶需求、建設和運維等多方對數據中心建設的要求;結合國家政策、數據中心發展趨勢,創新性地引入關鍵因素多角度分析法。同時系統性地提出數據中心高質量發展中如何進行精細化建設的策略。
    的頭像 發表于 05-17 10:24 ?689次閱讀
    淺談數據中心<b class='flag-5'>精細化</b>建設策略分析

    綜合管廊精細化節能系統設計與實施

    的基礎數據,利用建立的能耗統計數據庫、管廊能耗評價指標體系,研發一套管廊精細化節能診斷系統,主要目標是實現對綜合管廊能耗精細化分析,節約地下綜合管廊運維過程中的能耗,為運維管理人員提供決策支持、節能診斷和運行策
    的頭像 發表于 06-19 16:31 ?352次閱讀
    綜合管廊<b class='flag-5'>精細化</b>節能系統設計與實施
    主站蜘蛛池模板: 日本调教网站| 欧美三级不卡在线观线看| 久久精品国产免费| 久久久无码精品亚洲A片猫咪 | 姑娘视频日本在线播放| 国产福利高清在线视频| 国产亚洲精品a在线观看app| 久久久久久天天夜夜天天| 美女脱了内裤张开腿让男人桶到爽 | 双手绑在床头调教乳尖| 性欧美13处14处破| 亚洲中文字幕无码爆乳APP| 最新国产成人综合在线观看| yellow日本高清在线| 国产乱对白精彩在线播放| 久久亚洲AV成人无码动态图| 且试天下芒果免费观看| 亚洲1区2区3区精华液| 又黄又湿免费高清视频| 哺乳期妇女挤奶水36d| 国产亚洲精品高清视频免费| 老阿姨儿子一二三区| 2020最新无码国产在线视频| 亚洲午夜AV久久久精品影院色戒| 中文字幕在线观看亚洲视频 | 99久久全国免费久久爱| 国产精品爽爽久久久久久蜜桃网站 | 巨大乳hdbbw| 午夜伦理yy44008影院| 99久久免费精品国产| 娇小老少配xxxxx| 我和黑帮老大第365天第2季在线| 99国产在线视频| 久久a级片| 亚洲VA天堂VA欧美VA在线| 德国黄色录像| 欧美含羞草免费观看全部完| 永久免费看bbb| 狠狠操天天操夜夜操| 天天射天天爱天天干| 成人免费视频一区|