RM新时代网站-首页

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

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

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

SV線(xiàn)程的使用和控制

jf_GctfwYN7 ? 來(lái)源:IC修真院優(yōu)秀學(xué)員 ? 2023-10-21 17:30 ? 次閱讀

1、線(xiàn)程的使用

1.1程序和模塊

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

? 對(duì)于硬件的過(guò)程塊,它們之間的通信可理解為不同邏輯/時(shí)序塊之間的通信或者同步,是通過(guò)信號(hào)的變化來(lái)完成的。

? 從硬件實(shí)現(xiàn)的角度來(lái)看,Verilog通過(guò)always,initial過(guò)程語(yǔ)句塊和信號(hào)數(shù)據(jù)連接實(shí)現(xiàn)進(jìn)程間通信。

? 我們可以將不同的module作為獨(dú)立的程序塊,他們之間的同步通過(guò)信號(hào)的變化(event觸發(fā))、等待特定事件(時(shí)鐘周期)或者時(shí)間(固定延時(shí))來(lái)完成。

如果按照軟件的思維理解硬件仿真,仿真中的各個(gè)模塊首先是獨(dú)立運(yùn)行的線(xiàn)程(thread)。

模塊(線(xiàn)程)在仿真一開(kāi)始便并行執(zhí)行, 除了每個(gè)線(xiàn)程會(huì)依照自身內(nèi)部產(chǎn)生的事件來(lái)觸發(fā)過(guò)程語(yǔ)句塊之外, 也同時(shí)依靠相鄰模塊間的信號(hào)變化來(lái)完成模塊之間的線(xiàn)程同步。

? 線(xiàn)程即獨(dú)立運(yùn)行的程序。

? 線(xiàn)程需要被觸發(fā), 可以結(jié)束或者不結(jié)束。

? 在module中的initial和always,都可以看做獨(dú)立的線(xiàn)程,它們會(huì)在仿真0時(shí)刻開(kāi)始,而選擇結(jié)束或者不結(jié)束。

? 硬件模型中由于都是always語(yǔ)句塊 , 所以可以看成是多個(gè)獨(dú)立運(yùn)行的線(xiàn)程, 而這些線(xiàn)程會(huì)一直占用仿真資源, 因?yàn)樗鼈儾⒉粫?huì)結(jié)束。

? 軟件測(cè)試平臺(tái)中的驗(yàn)證環(huán)境都需要由initial語(yǔ)句塊去創(chuàng)建, 而在仿真過(guò)程中, 驗(yàn)證環(huán)境中的對(duì)象可以創(chuàng)建和銷(xiāo)毀, 因此軟件測(cè)試端的資源占用是動(dòng)態(tài)的。

軟件環(huán)境中的initial塊對(duì)語(yǔ)句有兩種分組方式 , 使用begin ... end或fork... join。

begin ... end的語(yǔ)句以順序的方式執(zhí)行,而fork...join中的語(yǔ)句則以并發(fā)方式執(zhí)行。

與fork... join類(lèi)似的并行方式語(yǔ)句還包括fork...join_any,fork...join_none.

? 線(xiàn)程的執(zhí)行軌跡是呈樹(shù)狀結(jié)構(gòu)的, 即任何的線(xiàn)程都應(yīng)該有父線(xiàn)程。

? 父線(xiàn)程可以開(kāi)辟若干個(gè)子線(xiàn)程, 父線(xiàn)程可以暫?;蛘呓K止子線(xiàn)程。

? 當(dāng)子線(xiàn)程終止時(shí), 父線(xiàn)程可以繼續(xù)執(zhí)行。

? 當(dāng)父線(xiàn)程終止時(shí), 其所開(kāi)辟的所有子線(xiàn)程都應(yīng)當(dāng)會(huì)終止。

2、線(xiàn)程的控制

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 等待所有衍生線(xiàn)程

? 在SV中, 當(dāng)程序中的initial塊全部執(zhí)行完畢, 仿真器就退出了。

? 如果我們希望等待fork塊中的所有線(xiàn)程執(zhí)行完畢再退出結(jié)束initial塊, 我們可以使用wait fork語(yǔ)句來(lái)等待所有子線(xiàn)程結(jié)束。

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

2.5 停止單個(gè)線(xiàn)程

在使用了fork.. join_any或者fork... join_none以后,我們可以使用disable來(lái)指定需要停止的線(xiàn)程。

parameter TIME_OUT = 1000; 
task check_trans{Transaction tr);
fork
begin
//等待回應(yīng),或者達(dá)到某個(gè)最大時(shí)延
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 停止多個(gè)線(xiàn)程

disable fork可以停止從當(dāng)前線(xiàn)程中衍生出來(lái)的所有子線(xiàn)程。

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

2.7 停止被多次調(diào)用的任務(wù)

如果你給某—個(gè)任務(wù)或者線(xiàn)程指明標(biāo)號(hào), 那么當(dāng)這個(gè)線(xiàn)程被調(diào)用多次以后 , 如果通過(guò)disable去禁止這個(gè)線(xiàn)程標(biāo)號(hào), 所有衍生的同名線(xiàn)程都將被禁止。

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

? 任務(wù)wait_for_time_out被調(diào)用了三次, 從而衍生了三個(gè)線(xiàn)程。

? 線(xiàn)程0在#2延時(shí)之后禁止了該任務(wù),而由于三個(gè)線(xiàn)程均是“ 同名”線(xiàn)程, 因此這些線(xiàn)程都被禁止了, 最終也都沒(méi)有完成。

內(nèi)容來(lái)源:IC修真院優(yōu)秀學(xué)員

審核編輯:湯梓紅

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

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110074
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    10

    文章

    1733

    瀏覽量

    131446
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    385

    瀏覽量

    59761
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3785

    瀏覽量

    81004
  • 線(xiàn)程
    +關(guān)注

    關(guān)注

    0

    文章

    504

    瀏覽量

    19675

原文標(biāo)題:IC學(xué)霸筆記 | SV線(xiàn)程

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HDMI+AV+SV轉(zhuǎn)HDMI、AV+SV轉(zhuǎn)HDMI轉(zhuǎn)換器芯片方案

    HDMI+AV+SV轉(zhuǎn)HDMI、AV+SV轉(zhuǎn)HDMI轉(zhuǎn)換器芯視音HDMI+AV+SV轉(zhuǎn)HDMI產(chǎn)品可將一路HDMI信號(hào)+一路CVBS信號(hào)+一路S-VIDEO信號(hào)轉(zhuǎn)成HDMI信號(hào)。輸入端不管輸入PAL
    發(fā)表于 09-29 16:49

    雙路400mA LED分段調(diào)色溫專(zhuān)用芯片方案 SV420/SV425

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

    DY-SV5W模塊介紹

    以下為DY-SV5W介紹摘抄模塊應(yīng)用手冊(cè)1.產(chǎn)品概述DY-SV5W是本司自主研發(fā)的一款智能語(yǔ)音模塊,集成IO分段觸發(fā),UART串口控制,ONE_line單總線(xiàn)串口控制,標(biāo)準(zhǔn)MP3等7種
    發(fā)表于 02-10 06:25

    sv810是什么?sv810有何功能呢

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

    Linux線(xiàn)程實(shí)現(xiàn)與線(xiàn)程控制步驟簡(jiǎn)析

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

    Java的線(xiàn)程課程

    線(xiàn)程的概念線(xiàn)程其實(shí)是控制線(xiàn)程(Thread of control)的簡(jiǎn)寫(xiě)。 控制線(xiàn)程就是程序運(yùn)行時(shí)的路徑,是在一個(gè)程序中與其它控制線(xiàn)程無(wú)關(guān)的
    發(fā)表于 04-10 15:58 ?0次下載

    創(chuàng)維SV-666S SV-767S功放電路圖

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

    SV8300功能介紹

    SV8300SV8300的可堆疊式機(jī)架設(shè)計(jì)支持在一個(gè)系統(tǒng)內(nèi)服務(wù)器功能、媒體網(wǎng)關(guān)和媒體轉(zhuǎn)換等功能的集成。
    發(fā)表于 02-10 15:11 ?25次下載
    <b class='flag-5'>SV</b>8300功能介紹

    如何在基于SV的仿真環(huán)境中使用軟件語(yǔ)言

    除了這個(gè)方式,SV還提供了和C/C++直接的接口DPI。DPI接口允許用戶(hù)用C編寫(xiě)程序,并和SV實(shí)現(xiàn)對(duì)接,也可以用SV寫(xiě)程序,將SV程序?qū)С龅絚中。
    的頭像 發(fā)表于 09-27 14:20 ?3195次閱讀
    如何在基于<b class='flag-5'>SV</b>的仿真環(huán)境中使用軟件語(yǔ)言

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

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

    網(wǎng)絡(luò)廣播對(duì)講編碼解碼模塊SV-2101V/SV-2103V介紹

    模塊結(jié)構(gòu) SV-2101V/SV-2103V使用了AT32F437VGT7處理器構(gòu)架加專(zhuān)業(yè)的雙向音頻Codec編解碼器,處理器負(fù)責(zé)數(shù)據(jù)的傳輸,用戶(hù)命令的解析執(zhí)行以及功放接口的控制,專(zhuān)業(yè)音頻Codec
    發(fā)表于 02-14 09:52 ?704次閱讀

    核心線(xiàn)程數(shù)和最大線(xiàn)程數(shù)區(qū)別

    達(dá)到最大線(xiàn)程數(shù)。當(dāng)任務(wù)執(zhí)行完畢后,線(xiàn)程池會(huì)根據(jù)線(xiàn)程池參數(shù)來(lái)決定是否回收線(xiàn)程。 簡(jiǎn)單來(lái)說(shuō),核心線(xiàn)程數(shù)用于優(yōu)化
    的頭像 發(fā)表于 06-01 09:33 ?7653次閱讀

    線(xiàn)程池的線(xiàn)程怎么釋放

    線(xiàn)程分組看,pool名開(kāi)頭線(xiàn)程占616條,而且waiting狀態(tài)也是616條,這個(gè)點(diǎn)就非??梢闪?,我斷定就是這個(gè)pool開(kāi)頭線(xiàn)程池導(dǎo)致的問(wèn)題。我們先排查為何這個(gè)線(xiàn)程池中會(huì)有600+的
    發(fā)表于 07-31 10:49 ?2274次閱讀
    <b class='flag-5'>線(xiàn)程</b>池的<b class='flag-5'>線(xiàn)程</b>怎么釋放

    核心線(xiàn)程數(shù)和最大線(xiàn)程數(shù)怎么設(shè)置

    核心線(xiàn)程數(shù)和最大線(xiàn)程數(shù)是Java線(xiàn)程池中重要的參數(shù),用來(lái)控制線(xiàn)程池中線(xiàn)程的數(shù)量和行為。正確地設(shè)置這兩個(gè)參數(shù)可以?xún)?yōu)化系統(tǒng)的性能和資源利用率。本
    的頭像 發(fā)表于 12-01 13:50 ?9042次閱讀

    表面貼裝壓控晶體振蕩器 DSV221SV DSV321SV :精準(zhǔn)頻率控制的卓越之選

    表面貼裝壓控晶體振蕩器(DSV221SV/DSV321SV):精準(zhǔn)頻率控制的卓越之選
    的頭像 發(fā)表于 08-06 13:44 ?281次閱讀
    表面貼裝壓控晶體振蕩器 DSV221<b class='flag-5'>SV</b> DSV321<b class='flag-5'>SV</b> :精準(zhǔn)頻率<b class='flag-5'>控制</b>的卓越之選
    RM新时代网站-首页