色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog任務與函數的區別

冬至子 ? 來源:數字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-06-01 16:38 ? 次閱讀

任務與函數的區別

和函數一樣,任務(task)可以用來描述共同的代碼段,并在模塊內任意位置被調用,讓代碼更加的直觀易讀。函數一般用于組合邏輯的各種轉換和計算,而任務更像一個過程,不僅能完成函數的功能,還可以包含時序控制邏輯。下面對任務與函數的區別進行概括:

1.jpg

任務

◆任務聲明

任務在模塊中任意位置定義,并在模塊內任意位置引用,作用范圍也局限于此模塊。

模塊內子程序出現下面任意一個條件時,則必須使用任務而不能使用函數。

1)子程序中包含時序控制邏輯,例如延遲,事件控制等

2)沒有輸入變量

3)沒有輸出或輸出端的數量大于 1

Verilog 任務聲明格式如下:

task       task_id ;
       port_declaration ;
       procedural_statement ;
endtask

任務中使用關鍵字 input、output 和 inout 對端口進行聲明。input 、inout 型端口將變量從任務外部傳遞到內部,output、inout 型端口將任務執行完畢時的結果傳回到外部。

進行任務的邏輯設計時,可以把 input 聲明的端口變量看做 wire 型,把 output 聲明的端口變量看做 reg 型。但是不需要用 reg 對 output 端口再次說明。

對 output 信號賦值時也不要用關鍵字 assign。為避免時序錯亂,建議 output 信號采用阻塞賦值。

例如,一個帶延時的異或功能 task 描述如下:

task xor_oper_iner;
    input [N-1:0]   numa;
    input [N-1:0]   numb;
    output [N-1:0]  numco ;
    //output reg [N-1:0]  numco ; //無需再注明 reg 類型,雖然注明也可能沒錯
    #3  numco = numa ^ numb ;
    //assign #3 numco = numa ^ numb ; //不用assign,因為輸出默認是reg
endtask

任務在聲明時,也可以在任務名后面加一個括號,將端口聲明包起來。

上述設計可以更改為:

task xor_oper_iner(
    input [N-1:0]   numa,
    input [N-1:0]   numb,
    output [N-1:0]  numco  ) ; 
    #3  numco       = numa ^ numb ;
endtask

◆任務調用

任務可單獨作為一條語句出現在 initial 或 always 塊中,調用格式如下:

task_id(input1, input2, …,outpu1, output2, …);

任務調用時,端口必須按順序對應。

輸入端連接的模塊內信號可以是 wire 型,也可以是 reg 型。輸出端連接的模塊內信號要求一定是 reg 型,這點需要注意。

對上述異或功能的 task 進行一個調用,完成對異或結果的緩存。

module xor_oper
    #(parameter         N = 4)
     (
      input             clk ,
      input             rstn ,
      input [N-1:0]     a ,
      input [N-1:0]     b ,
      output [N-1:0]    co  );

    reg [N-1:0]          co_t ;
    always @(*) begin          //任務調用
        xor_oper_iner(a, b, co_t);
    end

    reg [N-1:0]          co_r ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            co_r   <= 'b0 ;
        end
        else begin
            co_r   <= co_t ;         //數據緩存
        end
    end
    assign       co = co_r ;

   /*------------ task -------*/
    task xor_oper_iner;
        input [N-1:0]   numa;
        input [N-1:0]   numb;
        output [N-1:0]  numco ;
        #3  numco       = numa ^ numb ;   //阻塞賦值,易于控制時序
    endtask

endmodule

◆對上述設計進行簡單仿真testbench 描述如下。

激勵部分我們使用簡單的 task 進行描述,看起來會更加的清晰簡潔。

其實,task 最多的應用場景還是在 testbench 中使用。task 在一些編譯器中也不支持綜合。

`timescale 1ns/1ns

module test ;
    reg          clk, rstn ;

    initial begin
        rstn      = 0 ;
        #8 rstn   = 1 ;
        forever begin
            clk = 0 ; # 5;
            clk = 1 ; # 5;
        end
    end

    reg  [3:0]   a, b;
    wire [3:0]   co ;
    initial begin
        a         = 0 ;
        b         = 0 ;
        sig_input(4'b1111, 4'b1001, a, b);
        sig_input(4'b0110, 4'b1001, a, b);
        sig_input(4'b1000, 4'b1001, a, b);
    end

    task sig_input ;
        input [3:0]       a ;
        input [3:0]       b ;
        output [3:0]      ao ;
        output [3:0]      bo ;
        @(posedge clk) ;
        ao = a ;
        bo = b ;
    endtask ; // sig_input

    xor_oper         u_xor_oper
    (
      .clk              (clk  ),
      .rstn             (rstn ),
      .a                (a    ),
      .b                (b    ),
      .co               (co   ));

    initial begin
        forever begin
            #100;
            if ($time >= 1000)  $finish ;
        end
    end

endmodule

◆仿真結果如下。

由圖可知,異或輸出邏輯結果正確,相對于輸入有 3ns 的延遲。

且連接信號 a,b,co_t 與任務內部定義的信號 numa,numb,numco 狀態也保持一致。

圖片

任務操作全局變量

因為任務可以看做是過程性賦值,所以任務的 output 端信號返回時間是在任務中所有語句執行完畢之后。

任務內部變量也只有在任務中可見,如果想具體觀察任務中對變量的操作過程,需要將觀察的變量聲明在模塊之內、任務之外,可謂之“全局變量”。

◆例如有以下 2 種嘗試利用 task 產生時鐘的描述方式。

//way1 to decirbe clk generating, not work
    task clk_rvs_iner ;
        output    clk_no_rvs ;
        # 5 ;     clk_no_rvs = 0 ;
        # 5 ;     clk_no_rvs = 1 ;
    endtask 
    reg          clk_test1 ;
    always clk_rvs_iner(clk_test1);
//way2: use task to operate global varialbes to generating clk
    reg          clk_test2 ;
    task clk_rvs_global ;
        # 5 ;     clk_test2 = 0 ;
        # 5 ;     clk_test2 = 1 ;
    endtask // clk_rvs_iner
    always clk_rvs_global;

◆ 仿真結果如下。

第一種描述方式,雖然任務內部變量會有賦值 0 和賦值 1 的過程操作,但中間變化過程并不可見,最后輸出的結果只能是任務內所有語句執行完畢后輸出端信號的最終值。所以信號 clk_test1 值恒為 1,此種方式產生不了時鐘。

第二種描述方式,雖然沒有端口信號,但是直接對“全局變量”進行過程操作,因為該全局變量對模塊是可見的,所以任務內信號翻轉的過程會在信號 clk_test2 中體現出來。

圖片

automatic 任務

和函數一樣,Verilog 中任務調用時的局部變量都是靜態的。可以用關鍵字 automatic 來對任務進行聲明,那么任務調用時各存儲空間就可以動態分配,每個調用的任務都各自獨立的對自己獨有的地址空間進行操作,而不影響多個相同任務調用時的并發執行。

如果一任務代碼段被 2 處及以上調用,一定要用關鍵字 automatic 聲明。

◆當沒有使用 automatic 聲明任務時,任務被 2 次調用,可能出現信號間干擾,例如下面代碼描述:

task test_flag ;
        input [3:0]       cnti ;
        input             en ;
        output [3:0]      cnto ;
        if (en) cnto = cnti ;
    endtask

    reg          en_cnt ;
    reg [3:0]    cnt_temp ;
    initial begin
        en_cnt    = 1 ;
        cnt_temp  = 0 ;
        #25 ;     en_cnt = 0 ;
    end
    always #10 cnt_temp = cnt_temp + 1 ;

    reg [3:0]             cnt1, cnt2 ;
    always @(posedge clk) test_flag(2, en_cnt, cnt1);       //task(1)
    always @(posedge clk) test_flag(cnt_temp, !en_cnt, cnt2);//task(2)

◆ 仿真結果如下。

en_cnt 為高時,任務 (1) 中信號 en 有效, cnt1 能輸出正確的邏輯值;

此時任務 (2) 中信號 en 是不使能的,所以 cnt2 的值被任務 (1) 驅動的共用變量 cnt_temp 覆蓋。

en_cnt 為低時,任務 (2) 中信號 en 有效,所以任務 (2) 中的信號 cnt2 能輸出正確的邏輯值;而此時信號 cnt1 的值在時鐘的驅動下,一次次被任務 (2) 驅動的共用變量 cnt_temp 覆蓋。

可見,任務在兩次并發調用中,共用存儲空間,導致信號間產生了影響。

圖片

◆其他描述不變,只在上述 task 聲明時加入關鍵字 automatic,如下所示。

task automatic test_flag ;

◆此時仿真結果如下。

en_cnt 為高時,任務 (1) 中信號 cnt1 能輸出正確的邏輯值,任務 (2) 中信號 cnt2 的值為 X;

en_cnt 為低時,任務 (2) 中信號 cnt2 能輸出正確的邏輯值,任務 (1) 中信號 cnt1 的值為 X;

可見,任務在兩次并發調用中,因為存儲空間相互獨立,信號間并沒有產生影響。

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110163
  • 時序控制器
    +關注

    關注

    0

    文章

    19

    瀏覽量

    11233
  • CLK
    CLK
    +關注

    關注

    0

    文章

    127

    瀏覽量

    17185
  • 時鐘驅動器
    +關注

    關注

    0

    文章

    33

    瀏覽量

    13862
收藏 人收藏

    評論

    相關推薦

    Verilog系統任務的相關資料推薦

    Verilog數字系統設計十任務函數實驗2文章目錄Verilog數字系統設計十前言一、Verilog系統
    發表于 02-09 06:05

    任務函數區別

    Verilog數字系統設計九任務函數實驗1文章目錄Verilog數字系統設計九前言一、任務函數
    發表于 02-09 07:47

    FreeRTOS任務應用函數介紹

    任務應用函數是一組輔助類函數,一般用于調試信息輸出、獲取任務句柄、獲取任務狀態、操作任務標簽值等
    的頭像 發表于 03-19 10:22 ?2588次閱讀

    Verilog HDL語言中任務函數的比較

    其中,返回值的類型和位寬是可選項,如果缺省會返回一位寄存器類型數據。Verilog HDL認為函數的定義隱式地聲明了與函數同名的寄存器。函數的定義把
    的頭像 發表于 07-02 10:24 ?2360次閱讀

    Verilog數字系統設計——任務函數二(系統任務readmemb或readmemh)

    Verilog數字系統設計十任務函數實驗2文章目錄Verilog數字系統設計十前言一、Verilog系統
    發表于 12-05 19:06 ?7次下載
    <b class='flag-5'>Verilog</b>數字系統設計——<b class='flag-5'>任務</b>和<b class='flag-5'>函數</b>二(系統<b class='flag-5'>任務</b>readmemb或readmemh)

    Verilog數字系統設計——任務函數一(斐波那契數列)

    Verilog數字系統設計九任務函數實驗1文章目錄Verilog數字系統設計九前言一、任務函數
    發表于 12-05 19:06 ?9次下載
    <b class='flag-5'>Verilog</b>數字系統設計——<b class='flag-5'>任務</b>和<b class='flag-5'>函數</b>一(斐波那契數列)

    Verilog設計中函數任務的作用分析

    任務函數Verilog中用于描述常用的功能行為。與其在不同的地方復制相同的代碼,不如根據需求使用函數任務,這是一種良好且常見的做法。為
    的頭像 發表于 03-15 11:01 ?1771次閱讀

    Verilog系統函數和邊沿檢測

    “ 本文主要分享了在Verilog設計過程中一些經驗與知識點,主要包括Verilog仿真時常用的系統任務、雙向端口的使用(inout)、邊沿檢測”
    的頭像 發表于 03-15 13:34 ?2379次閱讀

    Verilog中關于文件操作的系統任務

    Verilog提供了很多對文件操作的系統任務函數,例如打開關閉文件、向文件寫入值、從文件讀出值等等。
    的頭像 發表于 12-05 13:57 ?1625次閱讀

    FreeRTOS任務通知通用發送函數

    發送任務通知 任務通知通用發送函數 任務任務通知發送函數:xTaskNotify()、xTas
    的頭像 發表于 07-30 11:43 ?749次閱讀
    FreeRTOS<b class='flag-5'>任務</b>通知通用發送<b class='flag-5'>函數</b>

    verilog函數任務對比

    verilog中,函數任務均用來描述共同的代碼段,并且在模式內任意位置被調用,提高代碼效率,讓代碼更加的直觀,提高代碼可讀性。但是在實際使用的過程中,函數
    的頭像 發表于 02-12 18:43 ?903次閱讀

    verilog同步和異步的區別 verilog阻塞賦值和非阻塞賦值的區別

    Verilog中同步和異步的區別,以及阻塞賦值和非阻塞賦值的區別。 一、Verilog中同步和異步的區別 同步傳輸和異步傳輸是指數據在電路中
    的頭像 發表于 02-22 15:33 ?1785次閱讀

    verilog中function和task的區別

    非常相似,但它們在功能和使用方式上有一些重要的區別。 定義和聲明方式不同: Function:使用關鍵字"function"來定義和聲明。函數可以有一個或多個輸入參數,可以有一個返回值。函數必須在聲明之后直接定義,不能在其他
    的頭像 發表于 02-22 15:40 ?1957次閱讀

    verilog function函數的用法

    Verilog 是一種硬件描述語言 (HDL),主要用于描述數字電子電路的行為和結構。在 Verilog 中,函數 (Function) 是一種用于執行特定任務并返回一個值的可重用代碼
    的頭像 發表于 02-22 15:49 ?5881次閱讀

    verilog task和function區別

    verilog中的task和function都是用于實現模塊中的可重復的功能,并且可以接收參數和返回結果。但是它們在編寫和使用上有一些區別。下面將詳細介紹task和function的區別。 語法結構
    的頭像 發表于 02-22 15:53 ?1145次閱讀
    主站蜘蛛池模板: 亚洲AV噜噜88| 男女作爱在线播放免费网页版观看| 国产精品无码麻豆放荡AV| 国产一区二区内射最近更新 | 偷拍自怕亚洲在线第7页| 在线观看a视频| 国产精品99久久久久久AV色戒| 久久亚洲精品AV成人无| 我的好妈妈8高清在线观看WWW| 99re8在线视频精品| 国产亚洲视频中文字幕| 日本XXXXZZX片免费观看| 伊人成色综合人网| 国产高清亚洲日韩字幕一区| 蜜芽资源高清在线观看| 亚洲欧美日韩在线码不卡| 草莓视频免费看| 麻豆COMCN| 亚洲欧洲日产国产 最新| 国产91青青成人a在线| 欧美日韩一区在线观看| 怡春院院日本一区二区久久| 国产亚洲精品久久久久久无码网站| 日本色女孩影院| 99视频全部看免费观| 久久香蕉国产线看观看| 亚洲区视频在线观看| 国产精品自在在线午夜精品| 日本不卡三卡四卡| 99久久e免费热视频百度| 久久理论片迅播影院一级| 亚洲视频成人| 精选国产AV精选一区二区三区| 午夜免费福利| 国产精品一区二区AV交换| 天天躁日日躁狠狠躁午夜剧场| bl(高h)文| 日本高清无卡码一区二区久久 | 日韩精品在线看| 超碰在线视频caoporn| 秋霞伦理电影在线看|