Verilog-函數和任務的區別



https://blog.csdn.net/CrazyUncle/article/details/86164830

主要區別

共同點

1、任務和函數必須在module內定義和調用
2、在任務和函數中不能聲明wire
3、所有輸入/輸出都是局部寄存器
4、任務/函數執行完成后才返回結果。例如,若任務/函數中有forever語句,則永遠不會返回結果

任務

1、通常用於調試,或對硬件進行行為描述
2、可以包含時序控制(#延遲,@, wait)
3、可以有input,output,和inout參數
4、可以調用其他任務或函數

函數

1、通常用於計算,或描述組合邏輯
2、不能包含任何延遲;函數仿真時間為0
3、至少含有一個input參數並由函數名返回僅一個結果
4、可以調用其他函數,但不能調用任務

測試代碼

`timescale 1ns / 1ps

module task_and_function(
    );

reg [1:0] a;
reg [1:0] b;
reg clk;
reg [2:0] sum;
reg [2:0] sub;
reg [2:0] sum_func;

reg [31:0] factorial_res; // 階乘結果

initial begin
	clk = 0;
	a = 0;
	b = 0;
	sum_func = function_1(a,b); //第一次調用函數計算和
	task_1(a,b,sum,sub); //第一次調用任務計算和和差
	@(negedge clk);
	a = 2;
	b = 1; 
	sum_func = function_1(a,b); //第二次調用函數計算和
	task_1(a,b,sum,sub);	//第二次調用任務計算和和差
	
	factorial_res = factorial(3); //調用階乘函數
	
end


always #20 clk = ~clk;

//============ 任務和函數的共同點 =========
/*
任務和函數必須在module內定義和調用
在任務和函數中不能聲明wire
所有輸入/輸出都是局部寄存器
任務/函數執行完成后才返回結果。
例如,若任務/函數中有forever語句,則永遠不會返回結果
*/

//============ 任務 =========
/*
1、通常用於調試,或對硬件進行行為描述
2、可以包含時序控制(#延遲,@, wait)
3、可以有input,output,和inout參數
4、可以調用其他任務或函數
*/ 	 
	 
task task_1;
	input [1:0] a;
	input [1:0] b;
	output [2:0] sum;
	output [2:0] sub;
	reg [1:0] i;
	begin
		for(i=0;i<=2;i=i+1) begin
			@(posedge clk);
			$display("i=%d",i); // 經歷3個上升沿出結果
		end
		sum = a + b;
		sub = a - b;
	end
endtask

//============ 函數 =========
/*
1、通常用於計算,或描述組合邏輯
2、不能包含任何延遲;函數仿真時間為0
3、至少含有一個input參數並由函數名返回僅一個結果
4、可以調用其他函數,但不能調用任務
*/ 

function [2:0] function_1;
	input [1:0] a;
	input [1:0] b;
	begin
		function_1 = a + b;  // 延遲為0
	end
endfunction

// 階乘函數
function [31:0] factorial;
	input [3:0] opa;
	integer i;   
	begin
		factorial = 1;
		for(i=2;i<=opa;i=i+1)
			factorial = factorial * i;
	end
endfunction

endmodule

測試波形


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM