iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
自我挑戰組

硬體學習日記系列 第 7

Day-7 Verilog介紹-3 function & task

  • 分享至 

  • xImage
  •  

今天要來介紹的是verilog的function和task~他們用來定義可重複使用區塊,可以在module內呼叫使用。這兩者有點相似,今天就要來介紹他們在功能和使用場景的不同之處~

function

這些是使用function要注意的部分:

  1. 只能有一個輸出:也就是函數的return value。
  2. 不能包含時間控制敘述:eg. delay、wait、@等、不能使用posedge和negedge。且function只能使用在組合邏輯,不能用在時序邏輯。
  3. 只能使用「=」賦值。
  4. 不能包含「<=」:「<=」只能在always或initial的區塊中使用。
  5. 不能調用task,只能調用其他function。
  6. 不能有內部靜態變量:function中的變量在每一次的呼叫都會重新初始化,不能保持靜態的狀態。
  7. 不能包含輸入及輸出文件操作:文件操作非verilog語法的一部份,他屬於系統任務,所以不能在function內使用。
  8. 必須在module內定義,不能在module外獨立定義。

function的結構大致如下:

module newwork(/*訊號列表*/);
	//一些定義
	
	function [return value位寬] name_of_function;
		input [位寬] 參數1,參數2,...;
		
		begin
			//function body
			name_of_function = 表達式;
		end
	endfunction
	
	//一些指令
	name_of_function(參數1,參數2,...);
	
endmodule

練習寫了一下function(雖然沒有特定意思,就是去加深使用的方法):

module newwork(C);
	output C;
	reg max;

	function [3:0] min;
	
		input [3:0]a,b;
		begin
			if( a < b )
				max = a;
			else
				max = b;
		end
	endfunction
	
	reg [3:0] num1, num2, result;
	always @(*)
		begin
			num1 = 4'b0111; //7
			num2 = 4'b0101; //5
			result = min( num1, num2 );
		end
	
	assign C = result;
	
endmodule

好啦,function大概介紹好了,接著來看task的部分,task跟function差異有些大~

task

他的特點大概有這些:

  1. 可以有多個輸入、輸出及雙向端口。
  2. 可以包含時間控制敘述,eg. delay、wait、@等。
  3. 不能使用posedge和negedge。
  4. 可以使用「=」及「<=」。
  5. 可以調用其他task及function。
  6. 作為語法調用,不能在表達式中使用。
  7. 只能在module、interface、package中定義,不能在模塊外部獨立定義。

task的結構如下:

module newwork(/*訊號列表*/);
	//一些定義

	task name_of_task;
		input [位寬] 輸入參數1,輸入參數2,...;
		output [位寬] 輸出參數1, 輸出參數2,...;
		inout [位寬] 雙向參數1, 雙向參數2,...;
		//宣告內部變量
	
		begin
			//task body
		end
	
	endtask
	
	//一些指令
	
endmodule

然後練習用看看(一樣沒什麼特別的意思,就是練習然後加深印象):

module newwork(C);
	output C;
	reg clk;
	
	task add;
		input [3:0] a,b;
		output [4:0] sum;
		begin
			sum <= a + b;
		end
	endtask
	
	reg [3:0] num1, num2;
	reg [3:0] result;
	
	always @(posedge clk)
		begin
			add(num1, num2, result);
		end
	
	initial begin
		num1 = 4'b0101; //5
		num2 = 4'b0110; //6
	end

endmodule

function與task的比較

最後來個小小的比較表:

特性 function task
時間控制敘述 不允許 允許
返回值 一個 多個
調用方式 在表達式中使用 作為語句調用
內部靜態變量 不允許 允許
輸入/輸出文件操作 不允許 允許
可否使用「<=」 不允許 允許
調用task 不允許 允許
調用function 不允許 允許

今天就先到這邊~


上一篇
Day-6 Verilog介紹-2 變數
下一篇
Day-8 verilog介紹-4 logic gate
系列文
硬體學習日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言