任務(wù)和函數(shù)只能實現(xiàn)組合邏輯,而對時序邏輯無能為力。
1 任務(wù)
任務(wù)就是一段封裝在“task-endtask”之間的程序。任務(wù)是通過調(diào)用來執(zhí)行的,而且只有在調(diào)用時才執(zhí)行,如果定義了任務(wù),但是在整個過程中都沒有調(diào)用它,那么這個任務(wù)是不會執(zhí)行的。調(diào)用某個任務(wù)時可能需要它處理某些數(shù)據(jù)并返回操作結(jié)果,所以任務(wù)應(yīng)當有接收數(shù)據(jù)的輸入端和返回數(shù)據(jù)的輸出端。
任務(wù)可以彼此調(diào)用,而且任務(wù)內(nèi)還可以調(diào)用函數(shù)。任務(wù)是不可綜合的,它只能用于仿真。
(1)任務(wù)定義
任務(wù)定義的形式如下:
task task_id // 任務(wù)名
[declaration] //端口定義
procedural_statement //任務(wù)的具體操作語句
endtask
其中,task_id是任務(wù)名;可選項declaration是端口聲明語句和變量聲明語句,任務(wù)接收輸入值和返回輸出值就是通過此處聲明的端口進行的;procedural_statement是一段用來完成這個任務(wù)操作的過程語句,如果過程語句多于一條,應(yīng)將其放在語句塊內(nèi)。
一些注意事項:
a. 在任務(wù)定義結(jié)構(gòu)中不能出現(xiàn)initial和always過程塊。 b. 任務(wù)的輸入、輸出端口和雙向端口數(shù)量不受限制,甚至可以沒有輸入、輸出端口和雙向端口。 (2)任務(wù)調(diào)用
任務(wù)調(diào)用語句可以在initial語句和always語句中使用,其語法形式如下:
task_id[(expr1, expr2, ........, exprN)];
task_id是要調(diào)用的任務(wù)名,expr1, expr2, ........是參數(shù)列表。參數(shù)列表給出傳入任務(wù)的數(shù)據(jù)(進入任務(wù)的輸入端)和接收返回結(jié)果的變量(從任務(wù)的輸出端接收返回結(jié)果),任務(wù)調(diào)用語句中參數(shù)列表的順序必須與任務(wù)定義中的端口聲明順序相同。任務(wù)調(diào)用語句是過程性語句,所以任務(wù)調(diào)用中接收返回數(shù)據(jù)的變量必須是寄存器類型。
調(diào)用任務(wù)時,可以引用任務(wù)聲明所在的模塊內(nèi)定義的任何變量。
任務(wù)內(nèi)可以帶有時序控制,如時延。但任務(wù)的輸出值必須等到整個任務(wù)的全部語句都執(zhí)行完之后才能返回。
2 函數(shù)
和任務(wù)一樣,verilog的函數(shù)也是一段可以完成特定操作的程序,這段程序處于關(guān)鍵詞“function-endfunction”之間。
(1)函數(shù)定義
函數(shù)定義和任務(wù)定義一樣,可以出現(xiàn)在模塊內(nèi)的任何位置,其形式如下:
function [range] function_id;
input_declaration
other_declarations
procedural_statement
endfunction
其中[range]參數(shù)指定返回值的類型或位寬,默認是1比特數(shù)據(jù)。
function_id為所定義函數(shù)的名稱,對函數(shù)的調(diào)用也是通過函數(shù)名來完成的,而且它在函數(shù)結(jié)構(gòu)體內(nèi)代表一個內(nèi)部變量,函數(shù)調(diào)用的返回值就是通過函數(shù)名變量傳遞給調(diào)用語句的。
一些注意事項: a. 函數(shù)定義只能在模塊中完成,不能出現(xiàn)在過程塊中; b. 函數(shù)至少要有一個輸入端口,但不能包含輸出和雙向端口; c. 在函數(shù)結(jié)構(gòu)中,不能使用任何形式的時間控制語句(#、wait等),也不能使用disable中止語句; d. 函數(shù)定義結(jié)構(gòu)體總不能出現(xiàn)過程塊語句; e. 函數(shù)內(nèi)部可以調(diào)用函數(shù),但不能調(diào)用過程。 函數(shù)的定義中并沒有聲明輸出,函數(shù)定義時,在函數(shù)內(nèi)部已經(jīng)隱性的聲明了一個寄存器變量,該寄存器變量與函數(shù)名同名并且取值范圍也相同。
(2)函數(shù)調(diào)用
函數(shù)也是在被調(diào)用時才被執(zhí)行的,調(diào)用函數(shù)的語句:func_id(expr1, expr2, ........., exprN),其中,func_id是要調(diào)用的函數(shù)名,expr1, expr2, ......exprN是傳遞給函數(shù)的輸入?yún)?shù)列表,該輸入?yún)?shù)列表的順序必須與函數(shù)定義時聲明其輸入的順序相同。
在函數(shù)內(nèi)部聲明的所有寄存器都是靜態(tài)的,當函數(shù)被調(diào)用時,這些寄存器的值不能被改變。
一些注意事項: a. 函數(shù)調(diào)用可以在過程塊中完成,也可以在assign這樣的連續(xù)賦值語句中出現(xiàn); b. 函數(shù)調(diào)用語句不能單獨作為一條語句出現(xiàn),只能作為賦值語句的右端操作數(shù)。 3 任務(wù)與函數(shù)比較
比較點 任務(wù) 函數(shù)
輸入輸出 可以有任意多個輸入輸出 至少一輸入,不能有輸出和雙向端口
調(diào)用 任務(wù)只能在過程語句中調(diào)用, 函數(shù)可作為賦值操作的表達式,
而不能在連續(xù)賦值語句中調(diào)用 用于過程賦值和連續(xù)賦值語句
觸發(fā)事件控制 任務(wù)不能出現(xiàn)always語句; 函數(shù)中不能出現(xiàn)always、#,
可以包含延時控制語句(#), 這樣的語句,要保證函數(shù)執(zhí)行
但只能面向仿真,不能綜合 在零時間內(nèi)完成
調(diào)用其他 可以調(diào)用其他任務(wù)和函數(shù) 只能調(diào)用函數(shù),不能調(diào)用任務(wù)
返回值 通過輸出端口傳遞返回值 通過函數(shù)名返回,只有一個返回值
其他說明 任務(wù)調(diào)用語句可以作為一條 函數(shù)調(diào)用語句不能單獨作為
完整的語句出現(xiàn) 一條語句,出現(xiàn)只能作為賦
值語句的右端操作數(shù)
中斷 可以由disable中斷 不允許由disable中斷
|