如何使用 Verilog 任务将值输出到寄存器?

Posted

技术标签:

【中文标题】如何使用 Verilog 任务将值输出到寄存器?【英文标题】:How can I output a value to a register with a Verilog task? 【发布时间】:2011-09-30 06:52:46 【问题描述】:

我对 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

为什么在调用copy 任务时寄存器data_reg 没有被覆盖?

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的关注!这可以解释为什么$display 只输出一个数字而不是两个数字。

以上是关于如何使用 Verilog 任务将值输出到寄存器?的主要内容,如果未能解决你的问题,请参考以下文章

在Verilog HDL中如何使用系统任务$readmemb

verilog 如何循环比较数据大小?

verilog中如何实现上电复位给寄存器赋初值?

IC 设计工具篇 -- 寄存器模块生成脚本设计过程(verilog 版)

verilog中数组的索引顺序啥意思?如[N:1]

如何用Verilog 语言描述一个D锁存器