task(任務)與function(函數)的不同
任務與函數主要有以下四點不同:
l 函數只能與主模塊共用一個仿真時間單位,而任務定義自己的仿真時間單位。
l 函數不能啟動任務,任務可以啟動其他任務和函數。
l 函數至少要有一個輸入變量,而任務可以沒有或有多任何類型的變量。
l 函數返回一個值,而任務不返回值。
l 任務的定義task語句說明
定義任務的語法如下:
task<任務名>
<端口及數據類型聲明語句>
<語句1>
<語句2>
…………
<語句n>
endtask
l 任務的調用及變量的傳遞
任務的調用:
<任務名>(端口1,端口2,…..,端口n);
下面舉例子說明怎么定義任務與調用任務:
任務定義:
task my_task;
input a,b;
output c;
<語句>
….
endtask
任務調用:my_task(v,w,x);
任務調用變量(v,w,x)和任務定義的I/O變量(a,b,c)之間是一一對應的,當任務啟動時,由v和w傳入的變量賦給了a和b,而當任務完成之后的輸出又通過c賦給x,下面舉一個具體程序來介紹:
代碼如下:
測試代碼如下:
仿真波形圖如下:
當start信號變成高電平的時候,即當state狀態由0跳變到1時,
調用load任務,把data_in的值寄存在save_data的同時狀態機狀態跳轉到2,當狀態跳轉到2的時候,調用shift任務,把save_data的值往左移一位的同時狀態機狀態跳轉到3,當狀態跳轉到3的時候,調用out任務,把save_data的值往data_out賦值的同時狀態機狀態跳轉到0,仿真的波形跟設計的完全一樣。
l 定義函數的語法:function說明語句
function<返回值的類型或范圍>(函數名);
<端口說明語句>
<變量類型說明語句>
begin
<語句>
………
end
endfunction
注意:<返回值的類型或范圍>這一項是可選項,如缺省則返回值位一位寄存器類型數據
l 舉例說明
下面舉一個實際程序的例子,來說明一下function函數的實際定
義與如何調用。
程序代碼如下:
測試代碼如下:
仿真波形圖如下:
當start信號變成高電平的時候,即當state狀態有0跳變到1時,調用load_data(data_in)函數,把data_in的值寄存在save_data的同時狀態機狀態跳轉到2,當狀態跳轉到2的時候,調用shift(save_data)函數,把save_data的值往左移一位的同時狀態機狀態跳轉到3,當狀態跳轉到3的時候,調用load_data(save_data)函數,把save_data的值往data_out賦值的同時狀態機狀態跳轉到0,仿真的波形跟設計的完全一樣。
此文章為原創出自 V3學院 www.v3edu.org