Как вывести значение в регистр с помощью задачи Verilog? - PullRequest
3 голосов
/ 30 сентября 2011

Мое понимание задач 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

А вот и вывод 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?

1 Ответ

3 голосов
/ 30 сентября 2011

Вы забыли установить ширину для reg data_reg, чтобы она была шириной в 1 бит, и вам присвоено четное значение, так что оно равно нулю.

...