2013-01-21 80 views
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 

代码编译得很好,但执行时B的值是'unknown'。 如果这样的分配是不可能的,是否有任何其他方式为模块实例中的寄存器(从输入到该实例)分配一个值?

我使用的ModelSim Altera网络版6.3

回答

2

在你copy模块,更改:

initial 
    B=A; 

要:

assign B = A; 

模拟开始时initial语句只计算一次,通常不可合成,尽管一些FPGA工具可能会对它们表示敬意。

你想要的是连续赋值,这就是assign所做的。

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

编辑:您还需要删除副本模块上outout reg [15:0] B声明的reg部分。您不能在reg类型上放置连续分配。

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

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

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

+0

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

+0

@Nagaraj我更新了我的答案,以解决您的问题。 – dwikle