HDLCompiler: 251 - No se puede acceder a la memoria directamente Error

0

Le estoy dando una matriz 2d a un módulo VHDL. Esta matriz 2d se valora en un módulo verilog. El error que está dando ISE es que la matriz 2d se asume una memoria y no se puede acceder. He buscado en Google el error pero no hubo respuestas para este caso específico. Por favor ayúdame con esto. Aquí está la definición de la matriz 2d.

wire [IN_FIFO_DEPTH_BIT:0]  depth_of_fifo[NUM_QUEUES-1:0];//storing the depth of all FIFOs  
wire [IN_FIFO_DEPTH_BIT - 1:0] packet_size_temp[NUM_QUEUES-1:0];

Aquí está la parte de mi código de verilog que es la fuente del error.

Deficit_Round_Robbin_algorithem
#(
.Quantom(),
.Num_queues(NUM_QUEUES),
.IN_FIFO_DEPTH_BIT(IN_FIFO_DEPTH_BIT)
 )
algorithem_module(
.clk(axi_aclk),
.axi_resetn(axi_resetn),
.m_axis_tready(m_axis_tready),
.packet_size(packet_size_temp),  //Line 247
.fifo_out_tlast(fifo_out_tlast),
.empty(empty),
.rd_en(rd_en),
.pkt_fwd(pkt_fwd)
 );

Y aquí está el mensaje de error

ERROR:HDLCompiler:251 - "K:/final project/codes/v3/input_arbiter.v" Line 247: Cannot access memory packet_size_temp directly
ERROR:HDLCompiler:598 - "K:/final project/codes/v3/input_arbiter.v" Line 46: Module <input_arbiter> ignored due to previous errors.
    
pregunta user2988239

1 respuesta

0

Verilog no admite matrices bidimensionales o matrices desempaquetadas como puertos; SystemVerilog hace. Verilog admite una matriz empaquetada (también conocida como vector) como un puerto.

Para verilog, necesitas pasar el índice. Ejemplos: .packet_size(packet_size_temp[0]), o .packet_size(packet_size_temp[reg_or_wire_of_index]), .
Si necesita pasar toda la matriz, deberá aplanarla en un gran vector y cortarla en el otro lado:

...
reg [NUM_QUEUES*IN_FIFO_DEPTH_BIT - 1:0] packet_size_temp__packed;
always @* begin
   for(idx=0; idx<NUM_QUEUES; idx=idx+1) begin
     packet_size_temp__packed[idx*IN_FIFO_DEPTH_BIT +: IN_FIFO_DEPTH_BIT] = packet_size_temp[idx];
   end
end
...
Deficit_Round_Robbin_algorithem
  #(
    ...
  )
  algorithem_module(
    ...
    .packet_size(packet_size_temp_packed),
    ...
  );
...

Revise en +: stackoverflow: Indexación de vectores y matrices con +: y ¿Qué es +: y - :?

Habilitar SystemVerilog es una alternativa, ya que admite puertos de matriz. Para hacerlo, se recomienda cambiar la extensión del archivo de .v a .sv . La mayoría de los simuladores y sintetizadores analizarán correctamente el archivo con solo la extinción correcta. Otro enfoque es establecer un indicador de compilador que sea dependiente de la herramienta (generalmente -sv o -sverilog), pero esto generalmente obligará a que todos los archivos de Verilog sean tratados como SystemVerilog, que puede tener conflictos de nombres con las palabras clave SystemVerilog.     

respondido por el Greg

Lea otras preguntas en las etiquetas