2011-09-30 8 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의 출력 다음 copy 작업이 호출 될 때

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 덮어하지 않습니다?

답변

3

너비를 reg data_reg으로 설정하는 것을 잊어 버렸으므로 너비가 1 비트가되도록 설정하고 짝수 값을 할당하면 0이됩니다.

+1

잡기에 감사드립니다. '$ display'가 왜 두 자리 대신에 한 자리 만 출력하는지 설명 할 수 있습니다. –

관련 문제