2011-03-09 73 views
0

我的代碼由兩個文件組成。一個文件包含所有模塊,一個文件包含測試臺。當我嘗試運行在試驗檯上模擬中,我得到了我的模塊之一在這條線的未解決的引用錯誤:我的測試平臺調用模塊中發生Verilog代碼編譯但爲什麼不能運行?

Add_half (p[3], g[3], in_a[3], in_b[3]); 

這條線。

可能是什麼問題?

這是測試平臺的代碼。 `時間表1ns的/ 100PS

module CARRYLOOKAHEAD_TB; 

reg [3:0] in_a_tb; 
reg [3:0] in_b_tb; 
reg in_c0_tb; 
wire [3:0] s_tb; 
wire c4_tb; 

CarryLookAheadAdder DUT (.in_a(in_a_tb), .in_b(in_b_tb), .in_c0(in_c0_tb), .out_s(s_tb), .out_c4(c4_tb)); 
initial 
begin 
in_a_tb = 4'b0000; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b0; 
#50 
in_a_tb = 4'b0000; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b1; 
#50 
in_a_tb = 4'b0001; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b0; 
#50 
in_a_tb = 4'b1111; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b0; 
#50 
in_a_tb = 4'b1111; 
in_a_tb = 4'b0000; 
in_c0_tb = 1'b1; 
#50 $stop; 
#20 $finish; 
end 
endmodule 

這是模塊

module Add_half (sum, c_out, a, b); 
input a, b; 
output c_out, sum; 
assign sum = a^b; 
assign c_out = a & b; 
endmodule 

代碼這是得到由試驗檯名爲

module CarryLookAheadAdder (in_a, in_b, in_c0, out_s, out_c4); 
input [3:0] in_a; 
input [3:0] in_b; 
input in_c0; 
output reg [3:0] out_s; 
output reg out_c4; 
reg [3:0] p; 
reg [3:0] g; 
reg [3:0] c; 
[email protected](in_a, in_b, in_c0) 
begin 
out_s[0] = (in_a[0]^in_b[0])^in_c0; 
Add_half (p[3], g[3], in_a[3], in_b[3]); 
Add_half (p[2], g[2], in_a[2], in_b[2]); 
Add_half (p[1], g[1], in_a[1], in_b[1]); 
Add_half (p[0], g[0], in_a[0], in_b[0]); 
out_c4 = c[4]; 
out_s[3] = p[3]^c[3]; 
out_s[2] = p[2]^c[2]; 
out_s[1] = p[1]^c[1]; 
out_s[0] = p[0]^c[0]; 
end 
endmodule 
+0

如果您發佈了所有有問題的代碼(Add_half的定義)以及錯誤消息和您正在使用的工具,這將非常有幫助。 – 2011-03-09 04:13:37

+0

我收到的錯誤消息是「未解決的對Add_half的引用」。我正在使用Modelsim。 – 2011-03-09 04:24:03

+0

發表包含語句「Add_half(p [3],g [3],in_a [3],in_b [3]); 」 – 2011-03-09 05:27:56

回答

2

你錯過了一個實例名稱。您的模擬器可能認爲該語句是一個UDP實例,因此它在設計細化時會給出未解決的參考錯誤。編譯不會使用定義來解析模塊/ UDP實例,因此這些錯誤不會導致編譯失敗。

嘗試

Add_half add_half_inst(對[3],G [3],IN_A [3],IN_B [3]);

編輯: Add_half不是功能或任務並且不能被放置在一個總是阻塞。它是一個模塊,因此被實例化,而不是被調用。請記住,您正在爲這裏的邏輯電路建模。

Add_half add_half_0(p[3], g[3], in_a[3], in_b[3]); 
Add_half add_half_1(p[3], g[3], in_a[3], in_b[3]); 
... 

注意每個實例都有唯一的名稱。您將同一個電路連接4次,並簡單地連接輸入和輸出。實例名稱是必需的,所以它們可以使用層次標識符唯一解析。

這會不會爲C的工作[3:0]

out_c4 = c[4]; 

有人可能會提到一個循環,但我想你應該忽視那些現在即使他們是適當的位置。

+0

當我嘗試獲取這些錯誤消息:Undefined variable:Add_half。接近「add_half_inst」:語法錯誤,意外的「IDENTIFIER」 – 2011-03-09 05:21:22

+0

現在編譯器會抱怨Add_half的敏感列表中的第二個參數。它說非法輸出或「端口」c_out'「的端口連接。我不明白爲什麼當它沒有提到第一個參數時會抱怨第二個參數。 – 2011-03-09 07:21:07

1

除了ADAM12的回答中提到的步驟(添加實例名稱,搬出總是塊),你需要改變你的連接線類型。

reg [3:0] p; 
reg [3:0] g; 

應該是

wire [3:0] p; 
wire [3:0] g; 

這是因爲這些是直接連接到模塊上的端口。你只能使用reg在always塊中分配的東西。

2

除了ADAM12 & GuanoLoco,只是一些常規注意事項:

您是分配out_s [0]兩次您CarryLookAheadAdder模塊

out_s[0] = (in_a[0]^in_b[0])^in_c0;
...
out_s[0] = p[0]^c[0];

你沒有使用你的 「G」 變量任何地方輸出你可能希望這是你的「c」,因爲我猜這是你的攜帶。