Очень запутанная ошибка без указания причины

Может кто-нибудь сказать мне, почему я получаю эту ошибку? Я все еще очень плохо знаком с 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];
Другие вопросы по тегам