Синтез застревает и не заканчивается из-за этого блока кода verilog… есть идеи, почему?

#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 блок. Если у вас все еще есть проблемы, попробуйте уменьшить размер буфера, чтобы помочь вам выполнить отладку.