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

1

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 omite la cuenta 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 que sería realmente útil. Gracias.

    
pregunta prerna B

1 respuesta

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 configuras a 0 durante el reinicio, está bien. Luego, cuando no está en reinicio, cada ciclo que agrega 32 ( 64'b0100000 ) cuando fifo_wr_en es alto. También bien.

Sin embargo, en todo esto, mire los 5 bits más bajos. Inicialmente se establecen en 0, y luego les agrega 0 o les permite mantener el mismo valor. Nunca se configurarán con un valor distinto de 0, por lo que el sintetizador los optimizará.

Eliminar estos bits no afectará el comportamiento de lo que describió, es simplemente la forma que menos recursos consume para cumplir sus requisitos. Después de todo, eso es lo que el sintetizador debe hacer, optimizar.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas