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只能用於組合邏輯;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM