function
function函數的目的返回一個用於表達式的值。
(the purpose of a function is to return a value that is to be used in an expression)
verilog中的function只能用於組合邏輯;
1 定義函數的語法
function <返回值的類型或范圍> <函數名>
<端口說明語句>
<變量類型說明>
begin
<語句>
…
end
endfunction
說明:
1 function [7:0] getbyte ; 2 input [15:0] address ; 3 begin 4 <說明語句> //從地址字節提取低字節的程序 5 getbyte = result_expression ; //把結果賦給函數的返回字節 6 end 7 endfunction |
① <返回值的類型或范圍>這一項為可選項,如果缺失,則返回值為一位寄存器類型數據。
② 從函數的返回值:函數的定義蘊含聲明了與函數同名、位寬一致的內部寄存器。例子中,getbyte被賦予的值就是調用函數的返回值。
③ 函數的調用:函數的調用是通過將函數作為表達式中的操作數來實現的。其調用格式:
<函數名> (<表達式> ,…, <表達式>);
其中函數名作為確認符。下面的例子中,兩次調用getbyte,把兩次調用的結果進行位拼接運算,以生成一個字。
word = control ? {getbyte(msbyte),getbyte(lsbyte)} : 8'd0 ; |
④ 函數使用的規則
1 函數定義不能包含有任何的時間控制語句,即任何用#、@、wait來標識的語句。
2 函數不能調用“task”。
3 定義函數時至少要有一個輸入參數。
4 在函數的定義中必須有一條賦值語句給函數中與函數名同名、位寬相同的內部寄存器賦值。
5 verilog中的function只能用於組合邏輯;
2 具體實例
函數功能:實現兩個4bit數的按位“與”運算。
實驗現象:如果函數操作正確,則led燈閃爍;如果函數操作不正確,則led燈常滅。
1 /* 2 3 程序功能:function 4 5 */ 6 7 8 module func_ex_01 ( 9 10 input clk , //E1 25M 11 12 13 output led //G2 高電平 燈亮 14 15 ); 16 17 18 19 /////////////////////////////////////////// 20 21 22 ///////////////////*counter_01*//////////////////////// 23 24 25 reg [25:0] counter_01 = 26'd0 ; 26 27 always @ (posedge clk) 28 begin 29 counter_01 <= counter_01 + 1'b1 ; 30 end 31 32 33 /////////////*& function*///////////////////////////// 34 35 36 37 function [3:0] yu ; 38 39 input [3:0] a ; 40 input [3:0] b ; 41 begin 42 yu = a & b ; 43 end 44 endfunction 45 46 47 /////////////////////////////////////////// 48 49 reg [3:0] reg_a = 4'b0101 ; 50 reg [3:0] reg_b = 4'b1010 ; 51 52 53 wire [3:0] result ; 54 55 assign result = yu(reg_a , reg_b) ; 56 57 58 //////////////////////////////*verify and display*//////////////////// 59 60 assign led = (result == 4'd0) ? counter_01[25] : 1'b0 ; 61 62 63 endmodule |
說明:verilog中的function只能用於組合邏輯;