Necesito ayuda con la eliminación parcial del elemento secuencial del módulo, incluso si estoy usando completamente [cerrado]

Tengo un módulo simple que divide filas entre diferentes motores. En este módulo, row_start_r es un registro que es un contador que salta el conteo por un desplazamiento específico y finalmente se escribe en un FIFO. El siguiente código funciona en simulación pero no en el FPGA real.

Lo único sospechoso en el informe de síntesis es que la herramienta establece los bits inferiores del registro row_start_r en 0 y da la siguiente advertencia

 INFO: propagating constant 0 across sequential element (i_13/\LOAD_BALANCER/row_start_reg_reg[0]
 INFO: propagating constant 0 across sequential element (i_13/\LOAD_BALANCER/row_start_reg_reg[1] )
 INFO:  propagating constant 0 across sequential element(i_13/\LOAD_BALANCER/row_start_reg_reg[2] )

El siguiente es mi código.

`timescale 1 ns / 1 ps

module split_rows #(
     parameter NUM_ENGINES               = 2
)(
   input  wire                  clk,
   input  wire                  rst,
   output wire                  done,
   input  wire [63:0]           num_rows,
   output wire                  ready_out,
   input  wire [NUM_ENGINES-1:0] engine_ready_in,
   output   [63:0]              start_row_pos_out,
   output   [63:0]              end_row_pos_out,
   output  [NUM_ENGINES-1:0] engine_select_wr_out

);
reg [2:0]                  engine_id; /// num_engines
wire                       fifo_empty_s;
wire                       fifo_full_s;
reg                        fifo_rd_en;
wire                       fifo_wr_en;
reg [NUM_ENGINES-1:0]      engine_select_s;

reg  [63:0]              row_start_r;
wire [63:0]                row_start_out;
reg  [63:0]             start_row_pos_out_s;
wire [63:0]             end_row_pos_out_s;

always @(posedge clk)
 begin
  if (rst == 1'd1)           engine_id <= 3'd0;
  else if (engine_id ==  NUM_ENGINES-1) engine_id <= 3'd0;
  else                       engine_id <= engine_id + 3'd1;
end
always @(posedge clk)
begin
        if(rst) begin
                row_start_r <= 64'd0;
        end
        else if (fifo_wr_en) begin
                row_start_r <= row_start_r + 64'd32; //skip_offset ;
        end
end
assign fifo_wr_en = !rst && !fifo_full_s && (row_start_r < num_rows);

fifo #(.DEPTH(64), .WIDTH(64), .AFULLCNT(60), .RAM_STYLE("block") ) offset_holder (
    .clk    (clk),
    .reset  (rst),
    .push   (fifo_wr_en),
    .din    (row_start_r),
    .afull  (fifo_full_s),
    .full   (),
    .cnt    (),
    .oclk   (clk),
    .pop    (fifo_rd_en), // from write engine
    .dout   (row_start_out),
    .empty  (fifo_empty_s),
    .rcnt   ()
   );

always @(*)
   begin
      engine_select_s = 0;
      fifo_rd_en      = 0;
      start_row_pos_out_s = 64'd0;
      if ( !rst &&  engine_ready_in[engine_id] == 1  && !fifo_empty_s  )
      begin
         engine_select_s[engine_id] = 1;
         fifo_rd_en = 1;
         start_row_pos_out_s = row_start_out;
      end
end
 assign end_row_pos_out_s = (start_row_pos_out_s + 64'd32 >= num_rows) ? num_rows: row_start_out + 64'd32;
     assign ready_out            =  !rst && !fifo_empty_s;

assign start_row_pos_out        =  start_row_pos_out_s;
assign end_row_pos_out          =  end_row_pos_out_s  ;
assign engine_select_wr_out     =  engine_select_s    ;

done_stall #(
      .LENGTH                 (4)
   ) DONE_OUT (
      .clk                    (clk),
      .rst                    (rst),
      .done_in                (fifo_empty_s),
      .done_out               (done)
   );
endmodule

Si alguien puede revisarlo y señalar el error, sería de gran ayuda. Gracias.

Haga una pregunta específica real, además, este no es un servicio de verificación de código
Entonces mi pregunta es qué hace que el registro row_start_r se inicialice a cero durante la síntesis. Siento que se está inicializando y utilizando correctamente.

Respuestas (1)

Lo que estás viendo es completamente esperado.

En su código para row_start_r, usted hace:

always @(posedge clk)
begin
        if(rst) begin
                row_start_r <= 64'd0;
        end
        else if (fifo_wr_en) begin
                row_start_r <= row_start_r + 64'd32; //skip_offset ;
        end
end

Así que lo estableces en 0 durante el reinicio, está bien. Luego, cuando no está en reinicio, cada ciclo agrega 32 ( 64'b0100000) cuando fifo_wr_enestá alto. También está bien.

Sin embargo, en todo esto, observe los 5 bits inferiores. Inicialmente se establecen en 0, y luego se les agrega 0 o se les permite mantener el mismo valor. Nunca se establecerán en otra cosa que no sea 0, por lo que el sintetizador los optimizará.

La eliminación de estos bits no afectará el comportamiento de lo que describió, es simplemente la forma que consume menos recursos para lograr su requisito; después de todo, para eso está el sintetizador, para optimizar.

Sí, eso tiene sentido. Sin embargo, no veo este registro mencionado en la información del componente. Obtengo lo siguiente: codeMódulo split_rows__4 Información detallada del componente RTL: +---Agregadores: 2 sumadores de entrada de 64 bits:= 2 2 sumadores de entrada de 3 bits:= 1 +---Registros: ** Registros de 3 bits:= 1** +---Muxes : 2 Muxes de 64 bits de entrada := 1 2 Muxes de 3 bits de entrada := 1