我对Verilog任务的理解是它们就像子程序一样,能够接受输入和输出参数。使用$display
,我可以一路查看寄存器变量的值。由于某种原因,我的输出寄存器似乎没有覆盖参数。这是一个例子:
`timescale 1 ps / 1 ps
`default_nettype none
module testbench;
reg clk;
reg data_reg = 8'h00;
always begin // 100MHz clock
clk = 1'b1;
#(5000);
clk = 1'b0;
#(5000);
end
task copy(input reg [7:0] din, output reg [7:0] dout);
begin
$display("copy: before: din=%h, dout=%h",din,dout);
@(negedge clk);
dout = din;
@(negedge clk);
$display("copy: after: din=%h, dout=%h",din,dout);
end
endtask
initial
begin
$display("data_reg=%h",data_reg);
copy(8'hBC, data_reg);
$display("data_reg=%h",data_reg);
copy(8'h00, data_reg);
$display("data_reg=%h",data_reg);
$display("done");
$finish;
end
endmodule
的输出
data_reg=0
copy: before: din=bc, dout=xx
copy: after: din=bc, dout=bc
data_reg=0
copy: before: din=00, dout=bc
copy: after: din=00, dout=00
data_reg=0
done
为什么在调用data_reg
任务时,注册表copy
不会被覆盖?
答案 0 :(得分:3)
您忘记设置reg data_reg
的宽度,因此宽度为1位,您恰好为其分配了一个偶数值,因此它为零。