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

在verilog中为模块实例中的寄存器赋值,verilog,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 代码编译良好,但在执行时,

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

,更改:

initial 
   B=A;
致:

初始
语句仅在模拟开始时计算一次,通常不可合成,尽管某些FPGA工具可能会使用它们

您需要的是连续作业,这就是
assign
所做的

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

编辑:您还需要删除复制模块上的
out reg[15:0]B
声明的
reg
部分。不能在
reg
类型上放置连续赋值

编辑:要回答评论中的问题,如果要分配
reg
,则需要在程序块中进行分配,例如,对输入敏感的
始终

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

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

复制
模块中,更改:

initial 
   B=A;
致:

初始
语句仅在模拟开始时计算一次,通常不可合成,尽管某些FPGA工具可能会使用它们

您需要的是连续作业,这就是
assign
所做的

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

编辑:您还需要删除复制模块上的
out reg[15:0]B
声明的
reg
部分。不能在
reg
类型上放置连续赋值

编辑:要回答评论中的问题,如果要分配
reg
,则需要在程序块中进行分配,例如,对输入敏感的
始终

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

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

谢谢,这很有帮助。但有没有办法将当前输入端口值存储在寄存器中?谢谢,这很有帮助。但有没有办法将当前输入端口值存储在寄存器中?