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