Verilog HDL——任务与函数

任务与函数区别

比较点任务函数
输入、输出可以有任意多个,各种类型的参数至少有一个输入(不能有输出端口,包括inout端口)
调用任务只能在过程语句中调用,不能在连续赋值语句assign中调用函数可以作为赋值操作的表达式,用于过程赋值和连续赋值语句
触发事件控制任务不能出现always语句;可以包含延迟控制语句(#),但只能用于仿真,不克用于综合函数不能出现always、# 语句,要保证函数的执行在零时间内完成
调用其他函数和任务任务可以调用其他任务和函数函数只能调用函数,但不能调用任务
返回值无返回值调用表达式返回一个值
其他说明可以作为一条完整的语句只能作为赋值操作的表达式,不能作为一个独立的语句

任务 TASK

/*
任务调用 -- 4比特全加器实现
*/
module EXAMPLE(
A,B,CIN,S,COUT
);
input[3:0] A,B;
input CIN;
output[3:0] S;
output COUT;

reg[3:0]S;
reg COUT;
reg[1:0]S0,S1,S2,S3;

task ADD;
	input A,B,CIN;
	output[1:0] C;
	
	reg[1:0] C;
	reg S,COUT;
	
	begin
		S = A^B^CIN;
		COUT = (A&B)|(A&CIN)|(B&CIN);
		C = {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);
		S={S3[0],S2[0],S1[0],S0[0]};
		COUT = S3[1];
	end

endmodule

在这里插入图片描述

函数 FUNCTION

  • 函数定义只能做模块中,不能在过程块中;
  • 函数至少有一个端口(不能出现输出端口和双向端口)
  • 函数内可以调用函数不能调用任务;
  • 函数定义结构体中不能出现过程控制语句(always语句)
  • 函数结构中不能使用任何形势的时间控制语句(# wait等),不能使用disable中止语句;
  • 函数调用可以在过程块中完成,也可以在assign的连续语句中完成;
  • 函数调用不能作为单独语句出现,只能作为赋值语句的右端操作数;
/*
函数调用 -- 4比特全加器实现
*/
module comb15(
A,B,CIN,S,COUT
);
input[3:0] A,B;
input CIN;
output[3:0] S;
output COUT;


wire[1:0]S0,S1,S2,S3;

function signed[1:0]ADD;
	input A,B,CIN;
	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),
		S1 = ADD(A[1],B[1],S0[1]),
		S2 = ADD(A[2],B[2],S1[1]),
		S3 = ADD(A[3],B[3],S2[1]),
		S={S3[0],S2[0],S1[0],S0[0]},
		COUT = S3[1];

endmodule

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值