练习七-在Verilog中使用任务task

1,任务目的

(1)掌握任务在verilog模块设计中的应用;
(2)学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法。

当我们希望能够将一些信号进行运算并输出多个结果时,采用函数结构就显得很不方便,但是采用任务结构在这方面优势则十分突出。任务本身并不返回计算值,但它通过类似c语言中的形参和实参的数据交换,非常容易地实现运算结果的调用。
此外,还常利用任务来包装模块设计中的许多复杂任务的过程,将许多复杂的操作步骤用一个命名清晰易懂的任务隐藏起来,大大提高程序的可读性。

2,RTL代码,交换

//	在verilog中 使用任务 task
module	sort4(
ra, rb, rc, rd, 
a,	b,	c,	d
);

input		[3:0]	a, 	b, 	c, 	d;
output	reg	[3:0]	ra, rb, rc, rd;

reg			[3:0]	va,	vb,	vc,	vd;

always@(a or b or c or d)	begin
	{va, vb, vc, vd} = {a, b, c, d};
	sort2(va, vc);		// va, vc 互换
	sort2(vb, vd);		// vb, vd 互换
	sort2(va, vb);		// va, vb 互换
	sort2(vc, vd);		// vc, vd 互换
	sort2(vb, vc);		// vb, vc 互换
	{ra, rb, rc, rd} = {va, vb, vc, vd};	//	从小到大
end

task	sort2;			//	调用任务
inout	[3:0]	x,	y;
reg		[3:0]	tmp;
	if(x > y)	begin	// 判定是否满足条件, 获取小,大值
		tmp = x;		// x与y变量的内容互换,要求顺序执行,则采用阻塞赋值方式
		x	= y;
		y	= tmp;
	end
endtask

endmodule

在这里插入图片描述

3,测试代码


//	测试代码
module	sort4_top;
reg		[3:0]	a, b, c, d;
wire	[3:0]	ra, rb, rc, rd;

initial 	begin
	a = 0;	b = 0;	c = 0;	d = 0;

repeat(50)	
begin
#100	a = {$random}%15;
		b = {$random}%15;
		c = {$random}%15;
		d = {$random}%15;
end

#100	$stop;
end

sort4	u_sort4(
.a		(a),
.b		(b),
.c		(c),
.d		(d),
.ra		(ra),
.rb		(rb),
.rc		(rc),
.rd		(rd)
);


endmodule

4,波形显示

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值