Очень запутанная ошибка без указания причины
Может кто-нибудь сказать мне, почему я получаю эту ошибку? Я все еще очень плохо знаком с 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
: ОШИБКА:Xst:917 - необъявленный сигнал<>. FATAL_ERROR:Xst: переносимость /export/Port_Main.h:127:1.13 - это приложение обнаружило исключительное состояние, из которого оно не может восстановиться. Процесс прекратится.
Спасибо за ваше время!
2 ответа
Попробуй поменять порядок строк 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 в будущем.
Больше вопросов, чем ответов:
Какой инструмент вы используете? Поддерживает ли инструмент синтезирование массива регистров?
Вы должны использовать неблокирующие назначения для последовательной логики:
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];