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

Nag*_*raj 0 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
Run Code Online (Sandbox Code Playgroud)

代码编译良好,但执行时 B 的值是“未知”。如果这样的分配不可能,是否有其他方法可以将值分配给模块实例中的寄存器(从该实例的输入)?

我正在使用 ModelSim Altera 网络版 6.3

dwi*_*kle 5

在您的copy模块中,更改:

initial 
   B=A;
Run Code Online (Sandbox Code Playgroud)

到:

assign B = A;
Run Code Online (Sandbox Code Playgroud)

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

你想要的是一个连续的任务,这正是它的assign作用。

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

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

编辑:要回答您在评论中的问题,如果您想分配a,reg您需要在程序块中执行此操作,例如always对输入敏感的块。

always @(A) begin
  B = A;   // B is declared as a reg
end
Run Code Online (Sandbox Code Playgroud)

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