2013-01-21 155 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