0

我是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 网络版 6.3

4

1 回答 1

5

在您的copy模块中,更改:

initial 
   B=A;

到:

assign B = A;

initial语句仅在仿真开始时评估一次,并且通常不可综合,尽管一些 FPGA 工具可能会支持它们。

你想要的是一个连续的分配,这就是什么assign

这应该使您达到 B 是您期望的值的程度。虽然我应该补充一点,这并不意味着您正在分配一个实际的硬件寄存器。

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

编辑:要在评论中回答您的问题,如果您想分配 areg您需要在程序块中这样做,例如always对输入敏感的块。

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

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

于 2013-01-21T17:34:22.807 回答