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

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

3天內不再提示

SV線程的使用和控制

jf_GctfwYN7 ? 來源:IC修真院優秀學員 ? 2023-10-21 17:30 ? 次閱讀

1、線程的使用

1.1程序和模塊

? module (模塊)作為SV從Verilog繼承過來的概念,自然地保持了它的特點除了作為RTL模型的外殼包裝和實現硬件行為, 在更高層的集成層面,模塊之間也需要通信和同步。

? 對于硬件的過程塊,它們之間的通信可理解為不同邏輯/時序塊之間的通信或者同步,是通過信號的變化來完成的。

? 從硬件實現的角度來看,Verilog通過always,initial過程語句塊和信號數據連接實現進程間通信。

? 我們可以將不同的module作為獨立的程序塊,他們之間的同步通過信號的變化(event觸發)、等待特定事件(時鐘周期)或者時間(固定延時)來完成。

如果按照軟件的思維理解硬件仿真,仿真中的各個模塊首先是獨立運行的線程(thread)。

模塊(線程)在仿真一開始便并行執行, 除了每個線程會依照自身內部產生的事件來觸發過程語句塊之外, 也同時依靠相鄰模塊間的信號變化來完成模塊之間的線程同步。

? 線程即獨立運行的程序。

? 線程需要被觸發, 可以結束或者不結束。

? 在module中的initial和always,都可以看做獨立的線程,它們會在仿真0時刻開始,而選擇結束或者不結束。

? 硬件模型中由于都是always語句塊 , 所以可以看成是多個獨立運行的線程, 而這些線程會一直占用仿真資源, 因為它們并不會結束。

? 軟件測試平臺中的驗證環境都需要由initial語句塊去創建, 而在仿真過程中, 驗證環境中的對象可以創建和銷毀, 因此軟件測試端的資源占用是動態的。

軟件環境中的initial塊對語句有兩種分組方式 , 使用begin ... end或fork... join。

begin ... end的語句以順序的方式執行,而fork...join中的語句則以并發方式執行。

與fork... join類似的并行方式語句還包括fork...join_any,fork...join_none.

? 線程的執行軌跡是呈樹狀結構的, 即任何的線程都應該有父線程。

? 父線程可以開辟若干個子線程, 父線程可以暫?;蛘呓K止子線程。

? 當子線程終止時, 父線程可以繼續執行。

? 當父線程終止時, 其所開辟的所有子線程都應當會終止。

2、線程的控制

2.1 fork.... join

//fork...join
initial 
begin 
    $display("@%0t:start fork... join example", $time); 
    #10 $display("@%0t:sequential after #10", $time);
fork
    $display("@%Ot: parallel start", $time); 
    #50 $display("@%0t:parallel after #50", $time); 
    #10 $display("@%0t: parallel after #lO", $time);
begin
    #30 $display("@%0t:sequential after #30", $time); 
    #10 $display("@%0t:sequential after #10", $time);
end 
join 
    $display ("@%0t:after join", $time);
    #80 $display("@%0t: finish after #80", $time);
end
498856c2-6fe7-11ee-939d-92fbcf53809c.png ?

打印代碼:

@0: start fork... join example

@10: sequential after #10

@10: parallel start

@20: parallel after #10

@40: sequential after #30

@50: sequential after #10

@60: parallel after #50

@60: after join

@140: finish after #80

2.2 fork...join_any

//fork...join_any
initial 
begin 
    $display("@%0t:start fork... join_any example", $time); 
    #10 $display("@%0t:sequential after #10", $time);
fork
    $display("@%Ot: parallel start", $time); 
    #50 $display("@%0t:parallel after #50", $time); 
    #10 $display("@%0t: parallel after #lO", $time);
begin
    #30 $display("@%0t:sequential after #30", $time); 
     #10 $display("@%0t:sequential after #10", $time);
end 
join_any
    $display ("@%0t:after join", $time);
    #80 $display("@%0t: finish after #80", $time);
end

打印代碼:

@0: start fork... join_any example

@10: sequential after #10

@10: parallel start

@10: after join_any

@20: parallel after #10

@40: sequential after #30

@50: sequential after #10

@60: parallel after #50

@90: finish after #80

2.3 fork...join_none

//fork...join_none
initial 
begin 
    $display("@%0t:start fork... none example", $time); 
    #10 $display("@%0t:sequential after #10", $time);
fork
    $display("@%Ot: parallel start", $time); 
    #50 $display("@%0t:parallel after #50", $time); 
    #10 $display("@%0t: parallel after #lO", $time);
begin
    #30 $display("@%0t:sequential after #30", $time); 
    #10 $display("@%0t:sequential after #10", $time);
end 
join_none
    $display ("@%0t:after join_none", $time);
    #80 $display("@%0t: finish after #80", $time);
end

打印代碼:

@0: start fork... join_none example

@10: sequential after #10

@10: after join_none

@10: parallel start

@20: parallel after #10

@40: sequential after #30

@50: sequential after #10

@60: parallel after #50

@90: finish after #80

2.4 等待所有衍生線程

? 在SV中, 當程序中的initial塊全部執行完畢, 仿真器就退出了。

? 如果我們希望等待fork塊中的所有線程執行完畢再退出結束initial塊, 我們可以使用wait fork語句來等待所有子線程結束。

task run_threads;
...
fork
check_trans(trl); //線程1 
check_trans(tr2); //線程2 
check_trans(tr3); //線程3
join_none
...
//等待所有fork中的線程結束再退出task 
wait fork;
endtask

2.5 停止單個線程

在使用了fork.. join_any或者fork... join_none以后,我們可以使用disable來指定需要停止的線程。

parameter TIME_OUT = 1000; 
task check_trans{Transaction tr);
fork
begin
//等待回應,或者達到某個最大時延
fork: timeout_block
begin
wait(bus.cb.addr == tr.addr);
$display("@%0t: Addr match %d", $time, tr.addr);
end 
#TIME_ OUT $display ("@%0t:Error: timeout, $time);
join_any 
disable timeout_block;
end
join_none
endtask

2.6 停止多個線程

disable fork可以停止從當前線程中衍生出來的所有子線程。

initial begin 
check_trans(trO); //線程0
//創建一個線程來限制disable fork的作用范圍 
fork//線程1
begin
check_trans(trl); //線程2 
fork//線程3
check_trans(tr2); / /線程4
join 
//停止線程1-4, 單獨保留線程0 
#(TIME_OUT/2) disable fork
end
join
end
499c3a8e-6fe7-11ee-939d-92fbcf53809c.png

2.7 停止被多次調用的任務

如果你給某—個任務或者線程指明標號, 那么當這個線程被調用多次以后 , 如果通過disable去禁止這個線程標號, 所有衍生的同名線程都將被禁止。

task wait_for_time_out(int id);
if (id == 0)
fork
begin
#2; 
$display("@%0t:disable wait_for_time_out"' $time); 
disable wait_for_time_out;
end 
join_none 
fork : just_a_little
begin
$display ("@%0t:%m: %0d entering thread", $time, id); 
#TIME_OUT; 
$display("@%0t:%m: %0d done", $0ime, id); 
end
join_none
endtask
initial begin
wait_for_time_out(0); // Spawn thread 0 
wait_for_time_out(1); // Spawn thread 1  
wait_for_time_out(2); // Spawn thread 2 
#(TIME_OUT*2) $display("@%0t:All done", $time); 
end

? 任務wait_for_time_out被調用了三次, 從而衍生了三個線程。

? 線程0在#2延時之后禁止了該任務,而由于三個線程均是“ 同名”線程, 因此這些線程都被禁止了, 最終也都沒有完成。

內容來源:IC修真院優秀學員

審核編輯:湯梓紅

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

    關注

    28

    文章

    1328

    瀏覽量

    109479
  • 時鐘
    +關注

    關注

    10

    文章

    1490

    瀏覽量

    130491
  • RTL
    RTL
    +關注

    關注

    1

    文章

    382

    瀏覽量

    59223
  • 程序
    +關注

    關注

    114

    文章

    3650

    瀏覽量

    79780
  • 線程
    +關注

    關注

    0

    文章

    496

    瀏覽量

    19537

原文標題:IC學霸筆記 | SV線程

文章出處:【微信號:IC修真院,微信公眾號:IC修真院】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HDMI+AV+SV轉HDMI、AV+SV轉HDMI轉換器芯片方案

    HDMI+AV+SV轉HDMI、AV+SV轉HDMI轉換器芯視音HDMI+AV+SV轉HDMI產品可將一路HDMI信號+一路CVBS信號+一路S-VIDEO信號轉成HDMI信號。輸入端不管輸入PAL
    發表于 09-29 16:49

    雙路400mA LED分段調色溫專用芯片方案 SV420/SV425

    420/SV4253,方案特點 SV420/SV425是雙路LED色溫控制專用芯片,支持40V直接輸入工作電壓,簡化輸入限壓電阻設計,提高可靠性。 方案僅在變壓器次級即可自動完成上下電
    發表于 07-03 17:31

    DY-SV5W模塊介紹

    以下為DY-SV5W介紹摘抄模塊應用手冊1.產品概述DY-SV5W是本司自主研發的一款智能語音模塊,集成IO分段觸發,UART串口控制,ONE_line單總線串口控制,標準MP3等7種
    發表于 02-10 06:25

    sv810是什么?sv810有何功能呢

    sv810是什么?sv810有何功能呢?
    發表于 03-03 07:07

    Linux線程實現與線程控制步驟簡析

    處理。因此,大大減少了上下文切換的開銷。同進程一樣,線程也將相關的變量值放在線程控制表內TCB。一個進程可以有多個線程,也就是有多個線程控制表及堆棧寄存器,但卻共享一個用戶地址空間。要
    發表于 04-25 09:29

    Java的線程課程

    線程的概念線程其實是控制線程(Thread of control)的簡寫。 控制線程就是程序運行時的路徑,是在一個程序中與其它控制線程無關的
    發表于 04-10 15:58 ?0次下載

    創維SV-666S SV-767S功放電路圖

    創維SV-666S SV-767S功放電路圖
    發表于 05-19 16:42 ?94次下載
    創維<b class='flag-5'>SV</b>-666S <b class='flag-5'>SV</b>-767S功放電路圖

    聲雅SV—221功放剖析

    聲雅SV—221功放剖析說明。
    發表于 04-10 11:04 ?32次下載

    Arduino串口控制DY-SV5W音頻播放

    以下為DY-SV5W介紹摘抄模塊應用手冊1.產品概述DY-SV5W是本司自主研發的一款智能語音模塊,集成IO分段觸發,UART串口控制,ONE_line單總線串口控制,標準MP3等7種
    發表于 12-06 19:21 ?24次下載
    Arduino串口<b class='flag-5'>控制</b>DY-<b class='flag-5'>SV</b>5W音頻播放

    什么是線程線程池中線程實現復用的原理

    一般建議自定義線程工廠,構建線程的時候設置線程的名稱,這樣就在查日志的時候就方便知道是哪個線程執行的代碼。
    發表于 01-29 13:44 ?1385次閱讀

    網絡廣播對講編碼解碼模塊SV-2101V/SV-2103V介紹

    模塊結構 SV-2101V/SV-2103V使用了AT32F437VGT7處理器構架加專業的雙向音頻Codec編解碼器,處理器負責數據的傳輸,用戶命令的解析執行以及功放接口的控制,專業音頻Codec
    發表于 02-14 09:52 ?554次閱讀

    SV-2101VP/ SV-2103VP系列網絡音頻模塊 sip網絡對講模塊

    和音頻編解碼協議,可用于VoIP和IP尋呼以及高質量音樂流媒體播放等應用。同時, SV-2103VP還提供兩個串行端口,八個數字輸入/輸出,允許用戶通過程序控制。 對于硬件產品研發集成,我公司提供使用開發規范,包括原理圖,引腳分布和自定義載板PCB布局的建議。 **
    的頭像 發表于 03-07 09:43 ?718次閱讀
    <b class='flag-5'>SV</b>-2101VP/ <b class='flag-5'>SV</b>-2103VP系列網絡音頻模塊 sip網絡對講模塊

    核心線程數和最大線程數區別

    達到最大線程數。當任務執行完畢后,線程池會根據線程池參數來決定是否回收線程。 簡單來說,核心線程數用于優化
    的頭像 發表于 06-01 09:33 ?6560次閱讀

    獨立SIP音頻功能模塊SV-2101VP和SV-2103VP

    SV-2101VP/ SV-2103VP使用了AT32F437VGT7處理器構架加專業的雙向音頻Codec編解碼器,處理器負責數據的傳輸,用戶命令的解析執行以及功放接口的控制,專業音頻Codec負責
    的頭像 發表于 08-24 10:20 ?380次閱讀
    獨立SIP音頻功能模塊<b class='flag-5'>SV</b>-2101VP和<b class='flag-5'>SV</b>-2103VP

    核心線程數和最大線程數怎么設置

    核心線程數和最大線程數是Java線程池中重要的參數,用來控制線程池中線程的數量和行為。正確地設置這兩個參數可以優化系統的性能和資源利用率。本
    的頭像 發表于 12-01 13:50 ?4945次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>