HDL/FPGA學習筆記八:verilog中task與function的使用

萬能的小黑Alex發表於2020-09-23

一、四位二進位制全加器的function形式實現:

module full_adder_4(A,B,CIN,S,COUT);
 
	input[3:0] A;
	input[3:0] B;
	input CIN;
	output[3:0] S;
	output COUT;
	wire[3:0] S0,S1,S2,S3;
 
	function signed[1:0] ADD;
		//port declaration
		 input A;
		 input B;
		 input CIN;
		//internal node signals declaration
		 reg S,COUT;
		 
		 begin
			 S=A^B^CIN;
			 COUT=(A&B)|(A&CIN)|(B&CIN);
			 ADD={COUT,S};
		 end
	 
	 endfunction
 
	 assign S0=ADD(A[0],B[0],CIN);   //第一位求和
	 assign S1=ADD(A[1],B[1],S0[1]); //第二位求和
	 assign S2=ADD(A[2],B[2],S1[1]); //第三位求和
	 assign S3=ADD(A[3],B[3],S2[1]); //第三位求和
	 
	 assign S={S3[0],S2[0],S1[0],S0[0]};
	 assign COUT=S3[1];
 
 endmodule 

二、四位二進位制全加器的task形式實現:

module full_adder(A,B,CIN,S,COUT);
	
	input[3:0] A;
	input[3:0] B;
	input CIN;
	output[3:0] S;
	output COUT;
	reg[3:0] S0,S1,S2,S3;
	 
	task ADD;
 
		input A;
		input B;
		input CIN;
		output[1:0] SUM;
		 
		 
		 
		reg S;
		reg COUT;
		 
		begin
			S=A^B^CIN;
			COUT=(A&B)|(A&CIN)|(B&CIN);
			SUM={COUT,S};
		end
 
	endtask
 
	always@(*) //A or B or CIN
	begin
		ADD(A[0],B[0],CIN,S0);
		ADD(A[1],B[1],S0[1],S1);
		ADD(A[2],B[2],S1[1],S2);
		ADD(A[3],B[3],S2[1],S3);
	end
	assign S={S3[0],S2[0],S1[0],S0[0]};
	assign COUT=S3[1];
endmodule

相關文章