Verilog之function使用說明

2021-07-06 11:37:22 字數 2725 閱讀 4189

1.function的定義

function [range] function_name; 

input_declaration

other_declarations

procedural_statement

endfunction

(2)不允許輸出埠宣告

(包括輸出和雙向

埠) ;但可以有多個輸入埠;

(3)[range]引數指定函式返回值的型別或

位寬,是乙個可選項,若沒有指定,預設預設值為寬度 1 位元的暫存器資料

(4)function_name

為所定義函式的名稱,對函式的呼叫也是通過函式名完成的,

並在函式結構體內部代表乙個內部變數,

函式呼叫的返回值就是通過函式名變數傳遞給呼叫語句。函式定義在函式內部會隱式定義乙個暫存器變數,

該暫存器變數和函式同名並且位寬也

一致。函式通過在函式定義中對該暫存器的顯式賦值來返回函式計算結果

(5)input_declaration 為

各個輸入埠的位寬和型別進行說明,在函式定義中至少要有乙個輸入埠

注意事項:

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

(2)函式至少要有乙個輸入埠;不能包含輸出埠和雙向埠;

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

中止語句;

(4)函式定義結構體中不能出現過程塊語句(always 語句);

(5)函式內部可以呼叫函式,

但不能呼叫任務。

2.函式的呼叫

func_name(expr1, expr2, ........., exprn),

expr1, expr2, ......exprn是傳遞給函式的輸入引數列

表,該輸入引數列表的順序必須與函式定義時宣告其輸入的順序相同.

在函式呼叫中,有下列幾點需要注意: 

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

。 (2)

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

如果task或者function在不同地方併發呼叫,則它們使用同一組變數個記憶體位址,存在衝突產生錯誤。為避免錯誤,宣告時在task和function後面加上automatic 關鍵字。如:task automatic task_id ........ endtask

呼叫例子:

在過程語句always模組內呼叫,

`timescale 1ns / 100ps

module lfsr (clk, ena, nreset, rst, q);

// // parameters

// parameter [3:0] taps = 8; // number of flip-flops in lfsr

// // inputs & outputs

// input clk; // master clock

input ena; // clock enable

input nreset; // asynchronous active low reset

input rst; // synchronous active high reset

output [taps:1] q; // lfsr output

reg [taps:1] q;

// // module body

// function lsb;

input [taps-1:0] q;

case (taps)

2: lsb = ~q[0];

3: lsb = q[3] ^ q[2];

4: lsb = q[4] ^ q[3];

5: lsb = q[5] ^ q[3];

6: lsb = q[6] ^ q[5];

7: lsb = q[7] ^ q[6];

8: lsb = q[8] ^ q[6] ^ q[5] ^ q[4];

9: lsb = q[9] ^ q[5];

10: lsb = q[10] ^ q[7];

11: lsb = q[11] ^ q[9];

12: lsb = q[12] ^ q[6] ^ q[4] ^ q[1];

13: lsb = q[13] ^ q[4] ^ q[3] ^ q[1];

14: lsb = q[14] ^ q[5] ^ q[3] ^ q[1];

15: lsb = q[15] ^ q[14];

16: lsb = q[16] ^ q[15] ^ q[13] ^ q[4];

endcase

endfunction

always @(posedge clk or negedge nreset)

if (~nreset) q <= #1 0;

else if (rst) q <= #1 0;

else if (ena) q <= #1 ;

endmodule

ECMAScript中函式function型別

說起來ecmascript中上面最有意思,我想那莫過於函式了,有意思的根源,則在於函式實際上是物件。每個函式都是function型別的例項,而且都與其他引用型別一樣具有屬性和方法。由於函式是物件,因此函式名實際上也是乙個指向函式物件的指標,不會與某個函式繫結。函式通常是使用函式宣告語法定義的,如下例...

Verilog之預備知識

模擬電路 工作在模擬訊號下的電子電路 數位電路 工作在數碼訊號下的電子電路 模擬訊號在時間和數量上的變化都是 連續 的 數碼訊號在時間和數量上的變化都是 離散 的 迄今為止,大多數的大規模和超大規模積體電路都屬於數位電路 早期生產的數字積體電路邏輯功能是固定工不變的。要想改變它的邏輯功能,就必須改變...

verilog基礎之 語句系列

阻塞賦值 b a 1 賦值語句執行完後,塊才結束。2 b的值在賦值語句執行完後立刻就改變的。3 在時序邏輯塊中使用時,可能產生意想不到的結果。非阻塞賦值 b a 1 在語句塊中,上面語句所賦值的變數值不能立即就為下面的語句所用。2 塊結束後才能完成這次賦值操作,而所賦的變數值是上一次賦值所得到的。3...