日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

任务和函数

發布時間:2025/7/14 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 任务和函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 比特全加器。

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 //begin-end塊內順序執行 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

在調用任務時,需要注意以下幾點:
(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

總結

以上是生活随笔為你收集整理的任务和函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。