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

 

posted @ 2019-06-21 11:05  liuyayong  阅读(11857)  评论(0编辑  收藏  举报