1. 程式人生 > >Verilog中函式與任務比較

Verilog中函式與任務比較

http://blog.163.com/taofenfang_05/blog/static/64214093201181692057682/

任務和函式只能實現組合邏輯,而對時序邏輯無能為力。

1  任務

    任務就是一段封裝在“task-endtask”之間的程式。任務是通過呼叫來執行的,而且只有在呼叫時才執行,如果定義了任務,但是在整個過程中都沒有呼叫它,那麼這個任務是不會執行的。呼叫某個任務時可能需要它處理某些資料並返回操作結果,所以任務應當有接收資料的輸入端和返回資料的輸出端。

    任務可以彼此呼叫,而且任務內還可以呼叫函式。任務是不可綜合的,它只能用於模擬。

(1)任務定義

    任務定義的形式如下:

    task task_id    // 任務名

         [declaration]   //埠定義

         procedural_statement  //任務的具體操作語句

    endtask

    其中,task_id是任務名;可選項declaration是埠宣告語句和變數宣告語句,任務接收輸入值和返回輸出值就是通過此處宣告的埠進行的;procedural_statement是一段用來完成這個任務操作的過程語句,如果過程語句多於一條,應將其放在語句塊內。

    一些注意事項:

a. 在任務定義結構中不能出現initial和always過程塊。

b. 任務的輸入、輸出埠和雙向埠數量不受限制,甚至可以沒有輸入、輸出埠和雙向埠。

(2)任務呼叫

    任務呼叫語句可以在initial語句和always語句中使用,其語法形式如下:

    task_id[(expr1, expr2, ........, exprN)];

    task_id是要呼叫的任務名,expr1, expr2, ........是引數列表。引數列表給出傳入任務的資料(進入任務的輸入端)和接收返回結果的變數(從任務的輸出端接收返回結果),任務呼叫語句中引數列表的順序必須與任務定義中的埠宣告順序相同。任務呼叫語句是過程性語句,所以任務呼叫中接收返回資料的變數必須是暫存器型別。      

    呼叫任務時,可以引用任務宣告所在的模組內定義的任何變數。

    任務內可以帶有時序控制,如時延。但任務的輸出值必須等到整個任務的全部語句都執行完之後才能返回。

2   函式

    和任務一樣,verilog的函式也是一段可以完成特定操作的程式,這段程式處於關鍵詞“function-endfunction”之間。

(1)函式定義

    函式定義和任務定義一樣,可以出現在模組內的任何位置,其形式如下:

    function [range] function_id;

        input_declaration

        other_declarations

        procedural_statement

    endfunction

    其中[range]引數指定返回值的型別或位寬,預設是1位元資料。

    function_id為所定義函式的名稱,對函式的呼叫也是通過函式名來完成的,而且它在函式結構體內代表一個內部變數,函式呼叫的返回值就是通過函式名變數傳遞給呼叫語句的。

一些注意事項:

a. 函式定義只能在模組中完成,不能出現在過程塊中;

b. 函式至少要有一個輸入埠,但不能包含輸出和雙向埠;

c. 在函式結構中,不能使用任何形式的時間控制語句(#、wait等),也不能使用disable中止語句;

d. 函式定義結構體總不能出現過程塊語句;

e. 函式內部可以呼叫函式,但不能呼叫過程。

    函式的定義中並沒有宣告輸出,函式定義時,在函式內部已經隱性的聲明瞭一個暫存器變數,該暫存器變數與函式名同名並且取值範圍也相同。

(2)函式呼叫

    函式也是在被呼叫時才被執行的,呼叫函式的語句:func_id(expr1, expr2, ........., exprN),其中,func_id是要呼叫的函式名,expr1, expr2, ......exprN是傳遞給函式的輸入引數列表,該輸入引數列表的順序必須與函式定義時宣告其輸入的順序相同。

    在函式內部宣告的所有暫存器都是靜態的,當函式被呼叫時,這些暫存器的值不能被改變。

一些注意事項:

a. 函式呼叫可以在過程塊中完成,也可以在assign這樣的連續賦值語句中出現;

b. 函式呼叫語句不能單獨作為一條語句出現,只能作為賦值語句的右端運算元。

3  任務與函式比較

比較點          任務                函式

輸入輸出可以有任意多個輸入輸出        至少一輸入,不能有輸出和雙向埠

呼叫         任務只能在過程語句中呼叫,     函式可作為賦值操作的表示式,

                         而不能在連續賦值語句中呼叫          用於過程賦值和連續賦值語句

觸發事件控制    任務不能出現always語句;             函式中不能出現always、#,

                         可以包含延時控制語句(#),         這樣的語句,要保證函式執行

                         但只能面向模擬,不能綜合              在零時間內完成

呼叫其他           可以呼叫其他任務和函式                  只能呼叫函式,不能呼叫任務

返回值              通過輸出埠傳遞返回值                  通過函式名返回,只有一個返回值

其他說明          任務呼叫語句可以作為一條               函式呼叫語句不能單獨作為

完整的語句出現                                一條語句,出現只能作為賦

值語句的右端運算元

中斷                可以由disable中斷                           不允許由disable中斷