task2:Verilog编写的设计模块在模块内部直接调用task

Verilog编写的设计模块在模块内部直接调用task

  • 1,概念
  • 2,模块设计
    • 2.1,RTL设计
    • 2.2,tb测试代码
    • 2.3,sim仿真输出

参考文献:
1,练习七-在Verilog中使用任务task

1,概念

在模块设计中,直接在内部模块使用调用task任务,然后通过task任务中的变量(包括:输入和输出)来调用task任务的工作。

2,模块设计

2.1,RTL设计

//
//	针对一个 task 来写一个模块调用
module	mod_use_task(	//	加法器
input				i_rst,
input				i_clk,
input	[1:0]		a,
input	[1:0]		b,

output	reg [2:0]		out
);

reg	[1:0]			cnt;
reg	[7:0]			d;

always@(posedge i_clk or negedge i_rst)		begin
	if(!i_rst)	begin
		out			<= 2'd0;
		cnt			<= 2'd0;
		end
	else	begin		//	adder.
		out			<= a + b;
		cnt			<= cnt + 1'd1;
		end

end

//	output results.
always@(cnt)		begin
	if(cnt == 2'd3)
		rest(cnt, d);
	else 
		stop_work(cnt, d);
end

task	rest;
input	[1:0] cnt1;		//	 task 从 mod 模块 中 输入.
output	[7:0]	d1;			
		d1	= 8'd100;
endtask

task	stop_work;
input	cnt2;
output	[7:0]	d2;
	d2	= 8'b0;
endtask

endmodule

2.2,tb测试代码

//		测试信号
module	tb_mod_use_task;
reg				i_rst;
reg				i_clk;
reg		[1:0]	a;
reg		[1:0]	b;

wire	[2:0]	out;

always #10	i_clk = ~i_clk;		//	T = 20.

initial		begin
i_clk	= 1'b1;
i_rst	= 1'b0;

#40;
i_rst	= 1'b1;
end

initial		begin
a		= 2'd0;
b		= 2'd0;

#20
a 		= 2'd1;
b		= 2'd2;

#10
a		= 2'd2;
b		= 2'd3;

#40
a		= 2'd3;
b		= 2'd3;

//	repeat(10)	begin
//	a 		= {$random}%2;
//	b		= {$random}%2;
//	end

end

mod_use_task	u1_mod_use_task(
.i_clk			(i_clk			),
.i_rst			(i_rst			),
.a				(a				),
.b				(b				),

.out			(out			)
);

endmodule

2.3,sim仿真输出

task2:Verilog编写的设计模块在模块内部直接调用task_第1张图片

你可能感兴趣的:(fpga开发,Verilog语法)