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

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

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

verilog中的task用法

CHANBAEK ? 來(lái)源:Andy的ICer之路 ? 作者:AndyICer ? 2023-03-23 15:13 ? 次閱讀

任務(wù)就是一段封裝在“task-endtask”之間的程序。 任務(wù)是通過(guò)調(diào)用來(lái)執(zhí)行的,而且只有在調(diào)用時(shí)才執(zhí)行,如果定義了任務(wù),但是在整個(gè)過(guò)程中都沒(méi)有調(diào)用它,那么這個(gè)任務(wù)是不會(huì)執(zhí)行的。 調(diào)用某個(gè)任務(wù)時(shí)可能需要它處理某些數(shù)據(jù)并返回操作結(jié)果,所以任務(wù)應(yīng)當(dāng)有接收數(shù)據(jù)的輸入端和返回?cái)?shù)據(jù)的輸出端。 另外,任務(wù)可以彼此調(diào)用,而且任務(wù)內(nèi)還可以調(diào)用函數(shù)。

1.任務(wù)定義

任務(wù)定義的形式如下:

task task_id; 
[declaration] 
procedural_statement 
endtask

其中,關(guān)鍵詞 task 和 endtask 將它們之間的內(nèi)容標(biāo)志成一個(gè)任務(wù)定義, task 標(biāo)志著一個(gè)任務(wù)定義結(jié)構(gòu)的開(kāi)始; task_id 是任務(wù)名; 可選項(xiàng) declaration 是端口聲明語(yǔ)句和變量聲明語(yǔ)句,任務(wù)接收輸入值和返回輸出值就是通過(guò)此處聲明的端口進(jìn)行的;

procedural_statement是一段用來(lái)完成這個(gè)任務(wù)操作的過(guò)程語(yǔ)句,如果過(guò)程語(yǔ)句多于一條,應(yīng)將其放在語(yǔ)句塊內(nèi); endtask 為任務(wù)定義結(jié)構(gòu)體結(jié)束標(biāo)志。 下面給出一個(gè)任務(wù)定義的實(shí)例。

:定義一個(gè)任務(wù)。 
task task_demo;                //任務(wù)定義結(jié)構(gòu)開(kāi)頭,命名為 task_demo 
input  [7:0] x,y;           //輸入端口說(shuō)明 
output [7:0] tmp;           //輸出端口說(shuō)明 


if(x>y)                  //給出任務(wù)定義的描述語(yǔ)句 
tmp = x; 
else 
tmp = y;
endtask 
上述代碼

定義了一個(gè)名為“task_demo”的任務(wù),求取兩個(gè)數(shù)的最大值。 在定義任務(wù)時(shí),有下列六點(diǎn)需要注意:

(1)在第一行“task”語(yǔ)句中不能列出端口名稱(chēng);

(2)任務(wù)的輸入、輸出端口和雙向端口數(shù)量不受限制,甚至可以沒(méi)有輸入、輸出以及雙向端口。

(3)在任務(wù)定義的描述語(yǔ)句中,可以使用出現(xiàn)不可綜合操作符合語(yǔ)句(使用最為頻繁的就是延遲控制語(yǔ)句) ,但這樣會(huì)造成該任務(wù)不可綜合。

(4)在任務(wù)中可以調(diào)用其他的任務(wù)或函數(shù),也可以調(diào)用自身。

(5)在任務(wù)定義結(jié)構(gòu)內(nèi)不能出現(xiàn) initial和 always過(guò)程塊。

(6)在任務(wù)定義中可以出現(xiàn)“disable 中止語(yǔ)句” ,將中斷正在執(zhí)行的任務(wù),但其是不可綜合的。 當(dāng)任務(wù)被中斷后,程序流程將返回到調(diào)用任務(wù)的地方繼續(xù)向下執(zhí)行。

2.任務(wù)調(diào)用

雖然任務(wù)中不能出現(xiàn) initial 語(yǔ)句和 always 語(yǔ)句語(yǔ)句, 但任務(wù)調(diào)用語(yǔ)句可以在 initial 語(yǔ)句和 always 語(yǔ)句中使用,其語(yǔ)法形式如下:task_id[(端口1, 端口 2, ........, 端口 N)];

其中 task_id是要調(diào)用的任務(wù)名,端口 1、端口 2,… 是參數(shù)列表。 參數(shù)列表給出傳入任務(wù)的數(shù)據(jù)(進(jìn)入任務(wù)的輸入端)和接收返回結(jié)果的變量(從任務(wù)的輸出端接收返回結(jié)果) 。 任務(wù)調(diào)用語(yǔ)句中,參數(shù)列表的順序必須與任務(wù)定義中的端口聲明順序相同。 任務(wù)調(diào)用語(yǔ)句是過(guò)程性語(yǔ)句,所以任務(wù)調(diào)用中接收返回?cái)?shù)據(jù)的變量必須是寄存器類(lèi)型。 下面給出一個(gè)任務(wù)調(diào)用實(shí)例。

例:通過(guò) Verilog HDL 的任務(wù)調(diào)用實(shí)現(xiàn)一個(gè) 4 bit全加器。

module EXAMPLE (A, B, CIN, S, COUT); 

input [3:0] A, B; 
input CIN; 
output [3:0] S; 
output COUT; 

reg [3:0] S; 
reg COUT; 
reg [1:0] S0, S1, S2, S3; 

task ADD; 

input A, B, CIN; 
output [1:0] C; 

reg [1:0] C; 
reg S, COUT; 

begin
S = A ^ B ^ CIN; 
COUT = (A&B) | (A&CIN) | (B&CIN); 
C = {COUT, S}; 
end 
endtask 

always @(A or B or CIN) begin 
ADD (A[0], B[0], CIN, S0); 
ADD (A[1], B[1], S0[1], S1); 
ADD (A[2], B[2], S1[1], S2); 
ADD (A[3], B[3], S2[1], S3); 
S = {S3[0], S2[0], S1[0], S0[0]}; 
COUT = S3[1]; 
end 
endmodule

在調(diào)用任務(wù)時(shí),需要注意以下幾點(diǎn):

(1)任務(wù)調(diào)用語(yǔ)句只能出現(xiàn)在過(guò)程塊內(nèi);

(2)任務(wù)調(diào)用語(yǔ)句和一條普通的行為描述語(yǔ)句的處理方法一致;

(3)當(dāng)被調(diào)用輸入、輸出或雙向端口時(shí),任務(wù)調(diào)用語(yǔ)句必須包含端口名列表,且信號(hào)端口順序和類(lèi)型必須和任務(wù)定義結(jié)構(gòu)中的順序和類(lèi)型一致。 需要說(shuō)明的是,任務(wù)的輸出端口必須和寄存器類(lèi)型的數(shù)據(jù)變量對(duì)應(yīng)。

(4)可綜合任務(wù)只能實(shí)現(xiàn)組合邏輯,也就是說(shuō)調(diào)用可綜合任務(wù)的時(shí)間為“0” 。 而在面向仿真的任務(wù)中可以帶有時(shí)序控制,如時(shí)延,因此面向仿真的任務(wù)的調(diào)用時(shí)間不為“0” 。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎ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

    文章

    1339

    瀏覽量

    109881
  • 端口
    +關(guān)注

    關(guān)注

    4

    文章

    936

    瀏覽量

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

    關(guān)注

    115

    文章

    3749

    瀏覽量

    80680
  • 調(diào)用函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    2291
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    verilog關(guān)于task的調(diào)用問(wèn)題

    在夏宇聞老師的教程里,關(guān)于EEPROM仿真的代碼,EEPROM_WR有調(diào)用shift8_out,shift8_in等任務(wù), 這些任務(wù)都是以狀態(tài)機(jī)來(lái)實(shí)現(xiàn)的。請(qǐng)問(wèn)這些任務(wù)在調(diào)用時(shí)開(kāi)始執(zhí)行,那么什么時(shí)候
    發(fā)表于 03-03 11:22

    轉(zhuǎn)載---verilogtask和function的區(qū)別

    ,能計(jì)算多個(gè)結(jié)果值,結(jié) 函數(shù)通過(guò)一個(gè)返回一個(gè)值來(lái)響應(yīng)輸入信號(hào)的值。果值只能通過(guò)被調(diào)用的任務(wù)的輸出端口輸出或函數(shù)不能有wire型變量??偩€端口送出;任務(wù)定義語(yǔ)法:task ;……endtask函數(shù)定義
    發(fā)表于 03-13 21:53

    Verilog#號(hào)的用法請(qǐng)教

    Verilog #號(hào)一般用來(lái)表示延時(shí)的,或者是傳遞參數(shù)。我遇到一個(gè)表達(dá)式:cnt
    發(fā)表于 04-29 12:33

    veriloggenerate語(yǔ)句的用法分享

    generate為verilog的生成語(yǔ)句,當(dāng)對(duì)矢量的多個(gè)位進(jìn)行重復(fù)操作時(shí),或者當(dāng)進(jìn)行多個(gè)模塊的實(shí)例引用的重復(fù)操作時(shí),或者根據(jù)參數(shù)的定義來(lái)確定程序是否應(yīng)該包含某段
    發(fā)表于 12-23 16:59

    簡(jiǎn)談FPGA verilogtask用法

    ????????大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來(lái)聊一聊FPGA verilogtask用法。 ? ? ? ?任務(wù)就是一段封裝在“tas
    的頭像 發(fā)表于 08-09 18:59 ?4.1w次閱讀

    簡(jiǎn)談FPGA verilog的function用法與例子

    大家好,又到了每日學(xué)習(xí)的時(shí)間了,今天我們來(lái)聊一聊FPGA verilog的function用法與例子。 函數(shù)的功能和任務(wù)的功能類(lèi)似,但二者還存在很大的不同。在 Verilog HDL
    的頭像 發(fā)表于 08-10 13:42 ?1.9w次閱讀
    簡(jiǎn)談FPGA <b class='flag-5'>verilog</b><b class='flag-5'>中</b>的function<b class='flag-5'>用法</b>與例子

    如何進(jìn)行AndroidTask任務(wù)棧的分配

    這意思就是說(shuō)Task實(shí)際上是一個(gè)Activity棧,通常用戶(hù)感受的一個(gè)Application就是一個(gè)Task。從這個(gè)定義來(lái)看,Task跟Service或者其他Components是沒(méi)有任何聯(lián)系的,它
    發(fā)表于 07-03 17:42 ?0次下載
    如何進(jìn)行Android<b class='flag-5'>中</b><b class='flag-5'>Task</b>任務(wù)棧的分配

    verilog的initial語(yǔ)句說(shuō)明

    解釋verilog HDL的initial語(yǔ)句的用法。
    發(fā)表于 05-31 09:11 ?0次下載

    FPGA CPLDVerilog設(shè)計(jì)小技巧

    FPGA CPLDVerilog設(shè)計(jì)小技巧(肇慶理士電源技術(shù)有限)-FPGA CPLDVerilog設(shè)計(jì)小技巧? ? ? ? ? ? ? ? ?
    發(fā)表于 09-18 16:49 ?37次下載
    FPGA CPLD<b class='flag-5'>中</b>的<b class='flag-5'>Verilog</b>設(shè)計(jì)小技巧

    verilogtask用法介紹

    任務(wù)就是一段封裝在“task-endtask”之間的程序。任務(wù)是通過(guò)調(diào)用來(lái)執(zhí)行的,而且只有在調(diào)用時(shí)才執(zhí)行
    的頭像 發(fā)表于 06-05 16:21 ?1562次閱讀

    verilogfunction和task的區(qū)別

    Verilog,F(xiàn)unction和Task是用于模塊化設(shè)計(jì)和重用代碼的兩種重要元素。它們?cè)试S開(kāi)發(fā)人員將復(fù)雜的操作分解為更小的功能單元,并在需要時(shí)調(diào)用它們。雖然Function和Task
    的頭像 發(fā)表于 02-22 15:40 ?1582次閱讀

    verilog function函數(shù)的用法

    Verilog 中被廣泛用于對(duì)電路進(jìn)行模塊化設(shè)計(jì),以簡(jiǎn)化和組織代碼。 本文將詳細(xì)介紹 Verilog 函數(shù)的用法,并探討函數(shù)在硬件設(shè)計(jì)的重要性和實(shí)際應(yīng)用場(chǎng)景。 一.
    的頭像 發(fā)表于 02-22 15:49 ?4579次閱讀

    verilog task和function區(qū)別

    verilogtask和function都是用于實(shí)現(xiàn)模塊的可重復(fù)的功能,并且可以接收參數(shù)和返回結(jié)果。但是它們?cè)诰帉?xiě)和使用上有一些區(qū)別。下面將詳細(xì)介紹
    的頭像 發(fā)表于 02-22 15:53 ?901次閱讀

    verilog inout用法與仿真

    Verilog語(yǔ)言是一種硬件描述語(yǔ)言(HDL),用于描述數(shù)字邏輯電路和系統(tǒng)。它是一種非常強(qiáng)大且廣泛使用的語(yǔ)言,在數(shù)字電路設(shè)計(jì)扮演著重要的角色。其中, inout 是Verilog
    的頭像 發(fā)表于 02-23 10:15 ?2356次閱讀

    Verilog語(yǔ)法運(yùn)算符的用法

    verilog語(yǔ)法中使用以下兩個(gè)運(yùn)算符可以簡(jiǎn)化我們的位選擇代碼。
    的頭像 發(fā)表于 10-25 15:17 ?62次閱讀
    <b class='flag-5'>Verilog</b>語(yǔ)法<b class='flag-5'>中</b>運(yùn)算符的<b class='flag-5'>用法</b>