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...