Excel2016打印預覽表格的教程是什么(excel2016怎么看打印預覽)">Excel2016打印預覽表格的教程是什么(excel2016怎么看打印預覽)
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初級教程(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小時內刪除侵權內容。