#verilog #fpga #vivado
Вопрос:
Это блок кода, из-за которого синтез застревает
always @ (posedge M_AXIS_ACLK) begin
if(force_enable amp;amp; !stop_signal) begin
for (j=0; j <31; j = j 2)begin
buffer_data[j buffer_counter] <= (eqed_valid[j/2]) ? {23'b0 , eqed_vals[j]} : 64'b0 ;
buffer_data[j buffer_counter 1] <= (eqed_valid[j/2]) ? {23'b0 , eqed_vals[j 1]} : 64'b0 ;
end
buffer_counter <= buffer_counter 32;
end
end
Это блок кода, который настраивает force_enable и stop_signal, которые останавливают запуск счетчика буфера и цикла
/*
SET THE BUFFER WIDTH FOR THE AXI STREAM. LETS HAVE 1024 BE DEFAULT VAL.
Set the reset as well
*/
reg [31:0] buffer_max_counter;
always @ (posedge M_AXIS_ACLK) begin
if(!M_AXIS_ARESETN) begin
buffer_max_counter <= 32'b0;
end
buffer_max_counter <= ( buffer_width > 16384 || buffer_width < 1024) ? buffer_width_default: buffer_width;
end
always @ (posedge M_AXIS_ACLK) begin
if(!M_AXIS_ARESETN) begin
counter_to_force_enable <= 0;
stop_signal <= 0;
force_enable <= 0;
for (i=0; i < 8192; i = i 1)begin
buffer_data[i] <= 0 ;
end
valid_counter <= 0;
eq_counter <= 0;
buffer_counter <=0;
end
else begin
if (M_AXIS_TLAST)begin
stop_signal <= 0;
buffer_counter <= 0;
end
if (enable_generator amp;amp; !force_enable amp;amp; !stop_signal) // staart the counter delay
counter_to_force_enable <= counter_to_force_enable 1;
if (counter_to_force_enable >= 10 amp;amp; (buffer_counter 32) < buffer_max_counter )begin //begin filling buffer
force_enable <=1;
stop_signal <=0;
end else if (counter_to_force_enable >= 10 amp;amp; (buffer_counter 32) >= buffer_max_counter ) begin
force_enable <= 0;
stop_signal <= 1;
counter_to_force_enable <= 0 ;
end else begin
//do nothing
force_enable <= force_enable;
end
end
end
Я предполагаю, что проблема здесь в buffer_counter, так как я использую его для индексации массива buffer_data, а не его константы.
Комментарии:
1. Никаких ошибок, он просто выполнял синтез в течение последних 4 часов. Если я прокомментирую блок кода, который вызывает это, синтез завершится менее чем за 10 минут. Никаких ошибок или предупреждений
2. еще не запустил моделирование для этого, но могу проверить
3. моделирование работает нормально, и логика выглядит хорошо
4.
buffer_counter
иbuffer_data
назначаются двумя различнымиalways
блоками, что не является законным для синтеза. Это должно быть ошибкой, а не зависанием.buffer_data
использует много переворотов (похоже на предварительную оптимизацию 512 К). Показанный код не выглядит так, как будто его легко сопоставить с оперативной памятью. Таким образом, может возникнуть проблема с ресурсами или маршрутизацией. Просто угадайте, не видя полного кода. Попробуйте поместить всеbuffer_counter
иbuffer_data
задания в одинalways
блок. Если у вас все еще есть проблемы, попробуйте уменьшить размер буфера, чтобы помочь вам выполнить отладку.