1. task(任務)與function(函數)的不同 任務與函數主要有以下四點不同: l 函數只能與主模塊共用一個 仿真時間單位,而任務定義自己的仿真時間單位。 l 函數不能啟動任務,任務可以啟動其他任務和函數。 l 函數至少要有一個輸入變量,而任務可以沒有或有多任何類型的變量。 l 函數返回一個值,而任務不返回值。
2. task語句說明 l 任務的定義 定義任務的語法如下: 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,仿真的波形跟設計的完全一樣。
3. function說明語句 l 定義函數的語法: 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,仿真的波形跟設計的完全一樣。 |