新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 硬件描述語言Verilog HDL設計進階之:Verilog HDL高級語法結構--函數

        硬件描述語言Verilog HDL設計進階之:Verilog HDL高級語法結構--函數

        作者: 時間:2017-06-05 來源:網絡 收藏

        4.3 Verilog HDL高級語法結構—

        本文引用地址:http://www.104case.com/article/201706/348832.htm


        的目的是返回一個用于表達式的值。


        1.定義語法

        返回值的類型或范圍> (函數名);
        端口說明語句>
        變量類型說明語句> begin
        語句>
        ...
        end
        end

        請注意返回值的類型或范圍>這一項是可選項,如缺省則返回值為一位寄存器類型數據。下面用例子說明:

        function [7:0] getbyte;
        input [15:0] address;
        begin
        說明語句> //從地址字中提取低字節的程序
        getbyte = result_expression; //把結果賦予函數的返回字節
        end
        endfunction


        2.函數返回值

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


        3.函數調用
        函數的調用是通過將函數作為表達式中的操作數來實現的,其調用格式如下:

        函數名> (表達式>,表達式>>*)

        其中函數名作為確認符。下面的例子中通過對兩次調用函數getbyte的結果值進行位拼接運算來生成一個字。

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


        4.函數使用規則

        與任務相比函數的使用有較多的約束,下面給出的是函數的使用規則。
        • 函數的定義不能包含有任何的時間控制語句,即任何用#、@、或wait來標識的語句。
        • 函數不能啟動任務。
        • 定義函數時至少要有一個輸入參量。
        • 在函數的定義中必須有一條賦值語句給函數中的一個內部變量賦以函數的結果值,該內部變量具有和函數名相同的名字。


        5.實例詳解


        下面的例子中定義了一個可進行階乘運算的名為factorial的函數,該函數返回一個32位的寄存器類型的值,該函數可后向調用自身,并且打印出部分結果值。

        module tryfact; //模塊開始
        //函數的定義-------------------------------
        function[31:0]factorial; //函數開始
        input[3:0]operand; //函數的入口
        reg[3:0]index; //函數的寄存器
        begin
        factorial = operand? 1 : 0; //若operand全為0,則為0
        for(index=2;index=operand;index=index+1) //循環語句
        factorial = index * factorial; //乘法器
        end
        endfunction //函數結束
        //函數的測試-------------------------------------
        reg[31:0]result;
        reg[3:0]n;
        initial begin
        result=1;
        for(n=2;n=9;n=n+1) begin //循環語句(調用函數)
        $display(Partial result n= %d result= %d, n, result); //每次函數的執行結果
        result = n * factorial(n)/((n*2)+1); //調用函數
        end
        $display(Finalresult=%d,result); //打印結果
        end
        endmodule //模塊結束



        關鍵詞: VerilogHDL 函數 function

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 商南县| 阳泉市| 永宁县| 开远市| 永泰县| 内丘县| 广宗县| 瓮安县| 来安县| 兴安县| 商南县| 横峰县| 连平县| 张家界市| 页游| 正定县| 邯郸县| 泽州县| 介休市| 巴楚县| 靖边县| 思南县| 罗田县| 逊克县| 固阳县| 乐都县| 江陵县| 襄垣县| 加查县| 辉南县| 泾川县| 平阴县| 皮山县| 宁都县| 措勤县| 海兴县| 洞头县| 布拖县| 特克斯县| 莱阳市| 台江县|