Verilog HDL的任務和函式

2021-06-03 21:05:33 字數 1773 閱讀 5592

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

一、任務

任務就是一段封裝在「task…endtask」之間的程式。任務可以彼此呼叫,而且任務內還可以呼叫函式。

1、任務定義

形式如下: 

task task_id;   // 任務名 

[declaration]   // 埠定義 

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

endtask

一些注意事項:

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

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

2、任務呼叫

形式如下:

task_id[(埠1, 埠2, …, 埠n)];

一些注意事項:

a. 任務呼叫語句只能出現在過程塊內;

b. 任務的輸出埠必須和暫存器型別的資料變數對應;

二、函式

1、函式定義

形式如下:

function [range] function_id;

input_declaration

other_declarations

procedural_statement

endfunction

其中[range]引數指定返回值的型別或位寬,預設是1位元資料。function_id為所定義函式的名稱,對函式的呼叫也是通過函式名來完成的,而且它在函式結構體內代表乙個內部變數,函式呼叫的返回值就是通過函式名變數傳遞給呼叫語句的。

一些注意事項:

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

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

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

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

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

2、函式呼叫

形式如下:

function_id(expr1, expr2, …, exprn);

一些注意事項:

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

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

3、任務和函式的區別

比較點任務

函式輸入、輸出

可以有任意多個各種型別的引數

至少有乙個輸入,不能有輸出和雙向埠

呼叫任務只能在過程語句中呼叫,而不能在連續賦值語句中呼叫

函式可作為賦值操作的表示式,用於過程賦值和連續賦值語句

觸發事件控制

任務不能出現always語句;可以包含延時控制語句(#),但只能面向**,不能綜合

函式中不能出現(always、#)這樣的語句,要保證函式的執行在零時間內完成

呼叫其他任務和函式

可以呼叫其他任務和函式

只能呼叫函式,不能呼叫任務

返回值沒有返回值

只有乙個返回值

其他說明

任務呼叫語句可以作為一條完整的語句出現

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

VHDL和 verilogHDL的區別

硬體描述語言hdl hardware describe language hdl概述 隨著eda技術的發展,使用硬體語言設計pld fpga成為一種趨勢。目前最主要的硬體描述語言是vhdl和verilog hdl。vhdl發展的顯紓 鋟 細瘢 鳹erilog hdl是在c語言的基礎上發展起來的一種硬...

verilog HDL中wire和reg的區別

wire表示直通,即輸入有變化,輸出馬上無條件地反映 如與 非門的簡單連線 reg表示一定要有觸發,輸出才會反映輸入的狀態。reg相當於儲存單元,wire相當於物理連線。reg表示一定要有觸發,沒有輸入的時候可以保持原來的值,但不直接實際的硬體電路對應。兩者的區別是 暫存器型資料保持最後一次的賦值,...

FreeRtos 空閒任務與空閒任務鉤子函式

以下基礎知識 自正點原子pdf資料。前面例子中建立的任務大部份時間都處於阻塞態。這種狀態下所有的任務都不可執行,所以也不能被排程器選中。但處理器總是需要 來執行 所以至少要有乙個任務處於執行態。為了保證這 一點,當呼叫 vtaskstartscheduler 時,排程器會自動建立乙個空閒任務。空閒任...