2013-05-26 66 views
1

有人可以告訴我爲什麼我得到這個錯誤嗎?我對Verilog仍然很陌生,所以請原諒任何明顯的缺陷。謝謝!非常令人困惑的錯誤,沒有提到原因

module func(clk,d,out); 
input [3:0] d; 
input clk; 

reg [3:0] q[1:0]; 
output [3:0] out; 
always @(posedge clk) 
begin 
q[0][3:0]=d[3:0]; 
q[1][3:0]=d[3:0]; 

end 
assign out=q[0]^q[1]; 

endmodule 

:ERROR:Xst:917 - Undeclared signal <>. FATAL_ERROR:Xst:Portability/export/Port_Main.h:127:1.13 - This application has discovered an exceptional condition from which it cannot recover. Process will terminate.

感謝您的時間!

+0

您正在使用哪個版本的ISE?我已經在ISE 14.2中試過你的代碼,它工作正常。在我看來,你好像在你的ISE版本中發現了一個錯誤。 (順便說一句:你應該使用非阻塞賦值(<=),而不是在這個always塊中阻塞賦值(=)以避免合成模擬不匹配) – CliffordVienna

回答

0

更多問題比回答:

你使用什麼工具?該工具是否支持合成寄存器陣列?

,您應該使用非阻塞賦值時序邏輯:

always @(posedge clk) begin 
    q[0][3:0] <= d[3:0]; 
    q[1][3:0] <= d[3:0]; 
end 

記憶通常用0聲明冒號的左側和最後的位置向右:

reg [3:0] q [0:1]; 
1

嘗試切換線路reg [3:0] q[1:0];output [3:0] out;的順序。

您的代碼在我的模擬器上編譯,所以我猜這是您模擬器中的一個錯誤。但是,一般建議是在所有內部值之前始終聲明input/output/inout

我建議您將端口語法更改爲IEEE Std 1364-2001風格。例如:

module func(
    input  clk, 
    input [3:0] d, 
    output [3:0] out); 

至於其他的建議,你應該將always塊內開關聯鎖分配(=)非阻塞 - 分配(<=)。這個修復不是編譯問題,但它會讓你變成一個更好的編碼風格,並且可以幫助你從簡單的合成中解脫出來,而不是在將來與RTL頭疼的事情相匹配。