在verilog中为模块实例中的寄存器赋值

时间:2013-01-21 17:01:13

标签: verilog

我是verilog的初学者。我试图执行此代码以将值存储在另一个模块的实例中的寄存器中。这是两个模块。

module main;
reg [15:0] A;
wire [15:0] B;
initial
begin
    A = 16'h1212;
end
copy a(B,A);
endmodule  

module copy(B,A);
input [15:0] A;
output reg [15:0] B;
initial
   B=A;
endmodule

代码编译良好但在执行时B的值是“未知”。 如果无法进行这样的赋值,是否有其他方法可以为模块实例中的寄存器赋值(从输入到该实例)?

我使用的是ModelSim Altera Web Edition 6.3

1 个答案:

答案 0 :(得分:3)

copy模块中,更改:

initial 
   B=A;

要:

assign B = A;

initial语句仅在模拟开始时评估一次,并且通常不可合并,尽管某些FPGA工具可能会尊重它们。

您想要的是连续分配,这是assign所做的。

这应该让你达到B是你期望的价值的地步。虽然我应该补充一点,这并不意味着你要分配一个实际的硬件寄存器。

编辑:您还需要删除复制模块上reg声明的outout reg [15:0] B部分。您无法在reg类型上进行连续分配。

编辑:要在评论中回答您的问题,如果您想要在程序块中指定reg,例如对输入敏感的always块。

always @(A) begin
  B = A;   // B is declared as a reg
end

仅仅因为B被声明为reg类型并不意味着它是一个物理寄存器。这里的两个例子是等效的,都描述了组合逻辑。如果你真的想要一个触发器,你需要添加一个时钟。