Portar el archivo de registro completo desde / hasta un modo de verilog

0

¿Cómo puedo portar / en un archivo de registro con Verilog (código capaz de síntesis)? En este código específico, un código de bucle de generación no es viable debido a la arquitectura de un código existente.

Un código de prueba, intentando portar / desde mi módulo un archivo de registro dinámico, con un tamaño basado en un parámetro.

module mux_test (/*AUTOARG*/
   // Outputs
   ro,
   // Inputs
   clk, rst_n, ain, v, din, bias
   ) ;
   parameter D_WIDTH=8;
   parameter A_WIDTH=2;
   localparam N = 1 << A_WIDTH;

   input wire clk, rst_n;
   input wire [A_WIDTH-1:0] ain;
   input wire               v;
   input wire [D_WIDTH-1:0] din;
   input wire [D_WIDTH-1:0] bias[N-1:0];
   output reg [D_WIDTH-1:0] ro[N-1:0];

   wire [D_WIDTH-1:0]       d2s    = din + bias[ain];

   integer                  i;
   always @(posedge clk, negedge rst_n)
     if (!rst_n)
       for(i=0; i<N; i=i+1)
         ro[i] <= 0;
     else if (v)
       ro[ain] <= d2s;

endmodule // mux_test

El modelo-sim me da lo siguiente:

  

- Compilando el módulo mux_test

     

** Error: .... / mux_test.v (3): (vlog-2110) Referencia ilegal a la memoria "ro".

     

** Error: ... / mux_test.v (5): (vlog-2110) Referencia ilegal al "sesgo" de la matriz de red.

    
pregunta tals

2 respuestas

1

Con Verilog no puede tener un puerto de entrada o salida con más de una dimensión, por lo que no puede declarar una matriz 2D como entrada o salida.

En su lugar, debe empaquetar la matriz en una sola dimensión, lo que se puede hacer usando un ciclo de generación.

    
respondido por el Tom Carpenter
1

SystemVerilog permitirá puertos multidimensionales y debería ser sintetizable.

module mux_test #(
parameter D_WIDTH=8,
parameter A_WIDTH=2 )
(  // Outputs
   output reg [D_WIDTH-1:0] ro[N-1:0],
   // Inputs
   input wire clk, rst_n,
   input wire [A_WIDTH-1:0] ain,
   input wire               v,
   input wire [D_WIDTH-1:0] din,
   input wire [D_WIDTH-1:0] bias[N-1:0]
   );

   localparam N = 1 << A_WIDTH;

   always @(posedge clk, negedge rst_n)
     if (!rst_n)
       for(int i=0; i<N; i=i+1)
         ro[i] <= 0;
     else if (v)
       ro[ain] <= d2s;

endmodule : mux_test
    
respondido por el dave_59

Lea otras preguntas en las etiquetas