2011-09-30 133 views
3

我对Verilog任务的理解是,它们像子例程一样工作,并能够接受输入和输出参数。使用$display,我可以一路窥探我的寄存器变量的值。出于某种原因,我的输出寄存器似乎不会覆盖参数。这里有一个例子:如何使用Verilog任务将值输出到寄存器?

`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 

这里是icarus-verilog simulator的输出:

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任务叫什么名字?

回答

3

您忘记设置宽度为reg data_reg,因此它的宽度为1位,您恰好为其分配偶数值,因此它为零。

+1

感谢您的支持!这将解释为什么'$ display'只输出一个数字而不是两个数字。 –

相关问题