加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

硬件描述語(yǔ)言Verilog HDL設(shè)計(jì)進(jìn)階之:Verilog HDL高級(jí)語(yǔ)法結(jié)構(gòu)--函數(shù)

2013/08/23
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

4.3  Verilog HDL高級(jí)語(yǔ)法結(jié)構(gòu)—函數(shù)(function)


函數(shù)的目的是返回一個(gè)用于表達(dá)式的值。


1.函數(shù)定義語(yǔ)法

function <返回值的類型或范圍> (函數(shù)名);
      <端口說(shuō)明語(yǔ)句>
      <變量類型說(shuō)明語(yǔ)句> begin
      <語(yǔ)句>
      ...
      end
endfunction

請(qǐng)注意<返回值的類型或范圍>這一項(xiàng)是可選項(xiàng),如缺省則返回值為一位寄存器類型數(shù)據(jù)。下面用例子說(shuō)明:

function [7:0] getbyte;
      input [15:0] address;
      begin
           <說(shuō)明語(yǔ)句>                             //從地址字中提取低字節(jié)的程序
           getbyte = result_expression;      //把結(jié)果賦予函數(shù)的返回字節(jié)
      end
endfunction


2.函數(shù)返回值

函數(shù)的定義蘊(yùn)含聲明了與函數(shù)同名的、函數(shù)內(nèi)部的寄存器。如在函數(shù)的聲明語(yǔ)句中<返回值的類型或范圍>為缺省,則這個(gè)寄存器是一位的;否則是與函數(shù)定義中<返回值的類型或范圍>一致的寄存器。
函數(shù)的定義把函數(shù)返回值所賦值寄存器的名稱初始化為與函數(shù)同名的內(nèi)部變量。上面的例子說(shuō)明了這個(gè)概念:getbyte被賦予的值就是函數(shù)的返回值。


3.函數(shù)調(diào)用
函數(shù)的調(diào)用是通過(guò)將函數(shù)作為表達(dá)式中的操作數(shù)來(lái)實(shí)現(xiàn)的,其調(diào)用格式如下:

<函數(shù)名> (<表達(dá)式><,<表達(dá)式>>*)

其中函數(shù)名作為確認(rèn)符。下面的例子中通過(guò)對(duì)兩次調(diào)用函數(shù)getbyte的結(jié)果值進(jìn)行位拼接運(yùn)算來(lái)生成一個(gè)字。

word = control? {getbyte(msbyte),getbyte(lsbyte)} : 0;


4.函數(shù)使用規(guī)則

與任務(wù)相比函數(shù)的使用有較多的約束,下面給出的是函數(shù)的使用規(guī)則。
•  函數(shù)的定義不能包含有任何的時(shí)間控制語(yǔ)句,即任何用#、@、或wait來(lái)標(biāo)識(shí)的語(yǔ)句。
•  函數(shù)不能啟動(dòng)任務(wù)。
•  定義函數(shù)時(shí)至少要有一個(gè)輸入?yún)⒘俊?br /> •  在函數(shù)的定義中必須有一條賦值語(yǔ)句給函數(shù)中的一個(gè)內(nèi)部變量賦以函數(shù)的結(jié)果值,該內(nèi)部變量具有和函數(shù)名相同的名字。


5.實(shí)例詳解


下面的例子中定義了一個(gè)可進(jìn)行階乘運(yùn)算的名為factorial的函數(shù),該函數(shù)返回一個(gè)32位的寄存器類型的值,該函數(shù)可后向調(diào)用自身,并且打印出部分結(jié)果值。

module  tryfact;                                          //模塊開(kāi)始
//函數(shù)的定義-------------------------------
function[31:0]factorial;                            //函數(shù)開(kāi)始
      input[3:0]operand;                             //函數(shù)的入口
      reg[3:0]index;                                  //函數(shù)的寄存器
      begin
           factorial = operand? 1 : 0;              //若operand全為0,則為0
           for(index=2;index<=operand;index=index+1) //循環(huán)語(yǔ)句
                 factorial = index * factorial;    //乘法器
      end
endfunction                                            //函數(shù)結(jié)束
//函數(shù)的測(cè)試-------------------------------------
reg[31:0]result;
reg[3:0]n;
initial begin
      result=1;
      for(n=2;n<=9;n=n+1) begin                     //循環(huán)語(yǔ)句(調(diào)用函數(shù))
           $display("Partial result n= %d result= %d", n, result);  //每次函數(shù)的執(zhí)行結(jié)果
           result = n * factorial(n)/((n*2)+1);   //調(diào)用函數(shù)
      end
      $display("Finalresult=%d",result);           //打印結(jié)果
end
endmodule                                               //模塊結(jié)束
 

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

華清遠(yuǎn)見(jiàn)(www.farsight.com.cn)是國(guó)內(nèi)領(lǐng)先嵌入師培訓(xùn)機(jī)構(gòu),2004年注冊(cè)于中國(guó)北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營(yíng)分公司。華清遠(yuǎn)見(jiàn)除提供嵌入式相關(guān)的長(zhǎng)期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負(fù)責(zé)嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實(shí)驗(yàn)平臺(tái)的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開(kāi)出版70余本嵌入式/移動(dòng)開(kāi)發(fā)/物聯(lián)網(wǎng)相關(guān)圖書(shū)。企業(yè)理念:專業(yè)始于專注 卓識(shí)源于遠(yuǎn)見(jiàn)。企業(yè)價(jià)值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。