verilog之function
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只能用于组合逻辑;