任务和函数
1、任務
任務定義
任務就是一段封裝在“task-endtask”之間的程序。調用某個任務時可能需要它處理某些數據并返回操作結果,所以任務應當有接收數據的輸入端和返回數據的輸出端。另外,任務可以彼此調用,而且任務內還可以調用函數。
task task_demo; //任務定義結構開頭,命名為 task_demo input [7:0] x,y; //輸入端口說明 output [7:0] tmp; //輸出端口說明 if(x>y) //給出任務定義的描述語句 tmp = x; else tmp = yendtask上述代碼定義了一個名為“task_demo”的任務,求取兩個數的最大值。在定義任務時,
有下列六點需要注意:
(1)在第一行“task”語句中不能列出端口名稱;
(2)任務的輸入、輸出端口和雙向端口數量不受限制,甚至可以沒有輸入、輸出以及
雙向端口。
(3)在任務定義的描述語句中,可以使用出現不可綜合操作符合語句(使用最為頻繁的就是延遲控制語句) ,但這樣會造成該任務不可綜合。
(4)在任務中可以調用其他的任務或函數,也可以調用自身。
(5)在任務定義結構內不能出現 initial和 always過程塊。
(6)在任務定義中可以出現“disable 中止語句” ,將中斷正在執行的任務,但其是不可綜合的。當任務被中斷后,程序流程將返回到調用任務的地方繼續向下執行。
任務調用
雖然任務中不能出現 initial 語句和 always 語句語句, 但任務調用語句可以在 initial 語句和 always 語句中使用,我個人對task的理解是封裝了一段功能的代碼,其語法形式如下:
task_id[(端口1, 端口 2, ........, 端口 N)];
其中 task_id是要調用的任務名,端口 1、端口 2,…是參數列表。參數列表給出傳入任務的數據(進入任務的輸入端)和接收返回結果的變量(從任務的輸出端接收返回結果) 。
任務調用語句中,參數列表的順序必須與任務定義中的端口聲明順序相同。任務調用語句是過程性語句,所以任務調用中接收返回數據的變量必須是寄存器類型。下面給出一個任務調用實例。
例:通過 Verilog HDL 的任務調用實現一個 4 比特全加器。
在調用任務時,需要注意以下幾點:
(1)任務調用語句只能出現在過程塊內;
(2)任務調用語句和一條普通的行為描述語句的處理方法一致;
(3)當被調用輸入、輸出或雙向端口時,任務調用語句必須包含端口名列表,且信號端口順序和類型必須和任務定義結構中的順序和類型一致。需要說明的是,任務的輸出端口必須和寄存器類型的數據變量對應。
(4)可綜合任務只能實現組合邏輯,也就是說調用可綜合任務的時間為“0” 。而在面向仿真的任務中可以帶有時序控制,如時延,因此面向仿真的任務的調用時間不為“0” 。
2、函數
函數定義
函數通過關鍵詞function和endfunction定義,不允許輸出端口聲明,但可以有多個輸入端口。函數定義的語法如下:
function[range] function-id; input-declaration other-declarations procedural-statement; endfunction其中,function語句標志著函數定義結構的開始;[range]參數指定函數返回值的類型或位寬,是一個可選項,若沒有指定,默認為1比特的寄存器類型;function-id為定義函數的名稱,對函數的調用也是通過函數名完成的,并在函數體內代表一個內部變量,函數調用的返回值也是通過函數名變量傳遞給調用語句;input-declaration用于對函數各個輸入端口的位寬和類型進行說明,在函數體內至少要有一個輸入端口;endfunction為函數結構體結束標志。
函數定義有幾點需要定義:
1、函數定義只能在模塊中完成,不能出現在過程塊中
2、函數至少要有一個輸入端口,不能包含輸出端口和雙向端口。
3、在函數體內,不能出現任何形式的時間控制語句,也不能使用disable中止語句
4、函數結構體中出現過程性語句
5、函數體內可以調用函數,但不能調用任務
函數調用
和任務一樣,函數也是在被調用時才被執行的,調用語句的語句形式如下:
fu'nction-id(expr1,.....exprN);
其中,func-id是要調用的函數名,expr1,。。。exprN是傳遞給函數的輸入參數列表,該輸入參數列表的順序必須與函數定義時聲明其輸入的順序一致。
在函數定義時,有以下幾點需要注意:
1、函數調用可以在過程塊中完成,也可以在assigne這樣的連續賦值語句中出現。
2、函數調用語句不能單獨作為一條語句出現,只能作為賦值語句的右端操作數
任務和函數的比較
轉載于:https://www.cnblogs.com/xuqing125/p/8884431.html
總結
- 上一篇: 数据库索引的理解
- 下一篇: 从阿里云下载图片到本地