Verilog初級教程(18)Verilog中的函數與任務

      網友投稿 1089 2022-05-30

      文章目錄

      前言

      正文

      函數

      語法

      函數聲明

      從函數中返回一個值

      函數調用

      函數規則

      任務

      語法

      任務調用

      全局任務

      函數與任務之間的區別

      往期回顧

      參考資料及推薦關注

      前言

      函數與任務是仿真中常用的語法,但合理使用也可以在設計中使用,可以綜合。

      正文

      函數

      很多時候我們會發現某些代碼是重復的,在RTL中被多次調用。它們大多不消耗仿真時間,可能涉及復雜的計算,需要用不同的數據值來完成。在這種情況下,我們可以聲明一個函數,將重復的代碼放在函數里面,讓它返回結果。這將大大減少RTL中的行數,因為現在你需要做的就是進行函數調用,并傳遞需要在其上進行計算的數據。事實上,這與C語言中的函數非常相似。

      函數的目的是返回一個要在表達式中使用的值。一個函數定義總是以關鍵字function開始,后面是返回類型、名稱和用括弧括起來的端口列表。當Verilog找到endfunction關鍵字時,就知道一個函數定義結束了。注意,一個函數至少要聲明一個輸入,如果函數沒有返回任何東西,則返回類型為void。

      function [automatic] [return_type] name ([port_list]); [statements] endfunction

      1

      2

      3

      關鍵字automatic將使函數重入,在任務中聲明的項目被動態分配,而不是在任務的不同調用之間共享。這對于遞歸函數,以及當同一個函數在分叉時被N個進程并發執行時,將非常有用。

      有兩種方式來聲明函數的輸入。

      function [7:0] sum; input [7:0] a, b; begin sum = a + b; end endfunction function [7:0] sum (input [7:0] a, b); begin sum = a + b; end endfunction

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      函數定義將隱含地創建一個與函數同名的內部變量。因此,在函數的作用域內聲明另一個同名的變量是非法的。返回值是通過將函數結果賦值給內部變量來初始化的。

      sum = a + b;

      1

      函數調用是一個帶有表達式的操作數,其語法如下圖所示。

      reg [7:0] result; reg [7:0] a, b; initial begin a = 4; b = 5; #10 result = sum (a, b); end

      1

      2

      3

      4

      5

      6

      7

      8

      函數不能包含任何時間控制的語句,如#, @, wait, posedge, negedge

      函數不能調用任務,因為它可能會消耗仿真時間,但可以調用其他函數。

      函數應該至少有一個輸入

      函數不能有非阻塞性的賦值或force…release或assign…deassign。

      函數不能有任何觸發器

      函數不能有output或者inout

      任務

      函數的作用是對輸入進行一些處理,并返回一個單一的值,而任務則更為通用,它可以計算出多個結果值,并使用output和inout類型的參數返回。任務可以包含@、posedge等仿真耗時元素。任務有兩種寫法,我們接下來會看到。

      // Style 1 task [name]; input [port_list]; inout [port_list]; output [port_list]; begin [statements] end endtask // Style 2 task [name] (input [port_list], inout [port_list], output [port_list]); begin [statements] end endtask

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      關鍵字automatic將使任務重入,否則它將默認為靜態的。如果一個任務是靜態的,那么它的所有成員變量將在同一任務的不同調用中被共享,該任務已被啟動為并發運行。注意,auomatic任務項不能通過層次引用來訪問。

      如果任務不需要任何參數,那么可以避免使用參數列表。如果任務需要參數,則可以在調用任務時在同一條語句中提供參數。

      task sum (input [7:0] a, b, output [7:0] c); begin c = a + b; end endtask // or task sum; input [7:0] a, b; output [7:0] c; begin c = a + b; end endtask initial begin reg [7:0] x, y , z; sum (x, y, z); end

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      任務使能參數(x,y,z)對應于任務定義的參數(a,b,c)。由于a和b是輸入,x和y的值將分別放在a和b中。由于c被聲明為輸出,并且在調用過程中與z連接,所以總和將自動從c傳遞到變量z中。

      在所有模塊之外聲明的任務稱為全局任務,因為它們具有全局范圍,可以在任何模塊中調用。

      // This task is outside all modules task display(); $display("Hello World !"); endtask module des; initial begin display(); end endmodule

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      仿真結果:

      Hello World !

      1

      往期回顧

      Verilog初級教程(17)Verilog中的case語句

      Verilog初級教程(16)Verilog中的控制塊

      Verilog初級教程(15)Verilog中的阻塞與非阻塞語句

      Verilog初級教程(14)Verilog中的賦值語句

      Verilog初級教程(13)Verilog中的塊語句

      Verilog初級教程(12)Verilog中的generate塊

      Verilog初級教程(11)Verilog中的initial塊

      Verilog初級教程(10)Verilog的always塊

      Verilog初級教程(18)Verilog中的函數與任務

      Verilog初級教程(9)Verilog的運算符

      Verilog初級教程(8)Verilog中的assign語句

      Verilog初級教程(7)Verilog模塊例化以及懸空端口的處理

      Verilog初級教程(6)Verilog模塊與端口

      Verilog初級教程(5)Verilog中的多維數組和存儲器

      Verilog初級教程(4)Verilog中的標量與向量

      Verilog初級教程(3)Verilog 數據類型

      Verilog初級教程(2)Verilog HDL的初級語法

      Verilog初級教程(1)認識 Verilog HDL

      芯片設計抽象層及其設計風格

      Verilog以及VHDL所倡導的的代碼準則

      FPGA/ASIC初學者應該學習Verilog還是VHDL?

      參考資料及推薦關注

      Verilog Functions

      Verilog Task

      交個朋友

      IDE

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:C語言學習第11篇---union enum, sizeof, typedef 分析
      下一篇:【直播預告】2021華為智能協作春季發布會,3月17日來云市場直播間,免費抽華為手環、榮耀耳機!
      相關文章
      亚洲精品美女久久久久99| 亚洲AV伊人久久青青草原| 在线精品亚洲一区二区三区| 豆国产96在线|亚洲| 亚洲宅男精品一区在线观看| 亚洲日韩乱码中文无码蜜桃| 亚洲一本综合久久| 亚洲成熟xxxxx电影| 久久九九亚洲精品| 国产精品久久久亚洲| 亚洲成A人片在线观看无码不卡| 久久亚洲精品无码播放| 亚洲中文字幕无码爆乳AV| 亚洲愉拍99热成人精品热久久| 久久久亚洲精品蜜桃臀| 亚洲色欲一区二区三区在线观看| 亚洲中文字幕无码久久综合网| 国产亚洲婷婷香蕉久久精品 | 久久久久亚洲爆乳少妇无| 国产精品亚洲二区在线观看| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 国产亚洲成人在线播放va| 亚洲人成伊人成综合网久久久| 亚洲精品无码久久久久| 亚洲AV日韩精品久久久久久久 | 亚洲日本在线电影| 亚洲成a人无码亚洲成www牛牛| 亚洲a∨无码精品色午夜| 国产精品亚洲专区无码WEB| 在线看亚洲十八禁网站| 久久精品国产亚洲精品| 亚洲精品乱码久久久久久自慰| 久久精品亚洲综合专区| 91亚洲导航深夜福利| 亚洲国产成人九九综合| 亚洲国产精品18久久久久久| 亚洲av无码不卡私人影院| 在线A亚洲老鸭窝天堂| 亚洲激情在线观看| 亚洲人成电影在线观看网| 色欲aⅴ亚洲情无码AV蜜桃|