Verilog HDL系统任务说明语句task

task说明语句
如果传给任务的变量和任务完成后接受任务的变量已定义,就可以用一条语句启动任务,任务完成以后控制传回启动的过程。
1.1任务的定义
定义任务的语法如下:

task<任务名>
	<端口及数据类型声明语句>
	<语句1>
	<语句2>
	...
	<语句3>
endtask	

1.2任务的调用及变量的传递
任务调用:

<任务名>(端口名1,端口名1...端口名n)

1.3例子
用两种不同的方法设计一个功能相同的模块,完成一个四个8位2进制输入数据冒泡排序。一种方法是组合逻辑实现,另一种是时钟触发任务实现,每个时钟周期完成一次数据交换。
第一种方法:
设计代码:

module compare(
	a,
	b,
	c,
	d,
	ra,
	rb,
	rc,
	rd
);
	
	input [7:0] a,b,c,d;
	output reg [7:0] ra,rb,rc,rd;
	
	reg [7:0]va,vb,vc,vd;
	
	always @(*) begin
		{va,vb,vc,vd}={a,b,c,d};
		
		change(va,vb);
		change(vb,vc);
		change(vc,vd);
		change(va,vb);
		change(vb,vc);
		change(va,vb);
		
		{ra,rb,rc,rd}={va,vb,vc,vd};
	end
	
	task change;
		inout [7:0]x,y;
		reg [7:0] temp;
		
		if(x>y) begin
			temp=y;
			y=x;
			x=temp;
		end
	endtask


endmodule 

testbench:

`timescale 1ns/1ns
module compare_tb;
	reg clk,clk1;
	reg [7:0] a,b,c,d;
	
	wire[7:0]ra,rb,rc,rd;
	
	initial begin
		clk=0;
		clk1=0;
		a=0;
		b=0;
		c=0;
		d=0;
	end
	
	always #20 clk=~clk;
	always #50 clk1=~clk1;
	
	always@(posedge clk1) begin
		a={$random}%255;
		b={$random}%255;
		c={$random}%255;
		d={$random}%255;
	end

compare u(
	a,
	b,
	c,
	d,
	ra,
	rb,
	rc,
	rd
 );
endmodule 

仿真波形:
请添加图片描述

第二种方法:
设计代码:

module compare_2(
	clk,
	rst,
	a,
	b,
	c,
	d,
	ra,
	rb,
	rc,
	rd
);
	output reg[7:0] ra,rb,rc,rd;
	input[7:0] a,b,c,d;
	input clk,rst;
	
	reg[7:0] va=0;
	reg[7:0]vb=0;
	reg[7:0]vc=0;
	reg[7:0]vd=0;
	reg[2:0]state;
	
	parameter IDLE=0 ,s0=1,s1=2,s2=3,s3=4,s4=5,s5=6,s6=7;
	always @ (posedge clk)
	begin
	 
		 if(!rst)
		 begin
			  va<=0;
			  vb<=0;
			  vc<=0;
			  vd<=0;
			  state<=IDLE;
		 end
	else begin
		case(state)
			IDLE:begin va<=a;
						  vb<=b;
						  vc<=c;
						  vd<=d;
						  state<=s0;end
			s0:begin change(va,vb);state<=s1 ; end
			s1:begin change(vb,vc);state<=s2 ;end
			s2:begin change(vc,vd);state<=s3;end
			s3:begin change(va,vb);state<=s4; end
			s4:begin change(vb,vc);state<=s5;end
			s5:begin change(va,vb);state<=s6; end
			s6:begin ra<=va;
						rb<=vb;
						rc<=vc;
						rd<=vd;
						state<=IDLE;end
			default: state<=IDLE;
		endcase
		end
	end
	
	task change;   
	inout[7:0] x,y;  
	reg[7:0] tmp;
		 if(x>y)
			  begin
					tmp = y  ;
					  y = x   ;
					  x = tmp ;
			  end
	endtask

endmodule 

testbench:

`timescale 1ns/1ns
module compare_tb;
	reg clk,clk1;
	
	reg rst;
	reg [7:0] a,b,c,d;
	
	wire[7:0]ra,rb,rc,rd;
	
	initial begin
		clk=0;
		clk1=0;
		a=0;
		b=0;
		c=0;
		d=0;
		rst=1;
		#10 rst=0;
		#20 rst=1;
	end
	
	always #20 clk=~clk;
	always #50 clk1=~clk1;
	
	always@(posedge clk1) begin
		a={$random}%255;
		b={$random}%255;
		c={$random}%255;
		d={$random}%255;
	end

	compare_2 m1(
		.clk(clk),
		.rst(rst),
		.a(a),
		.b(b),
		.c(c),
		.d(d),
		.ra(ra),
		.rb(rb),
		.rc(rc),
		.rd(rd)
	);
endmodule 

仿真波形:
请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值