Pregunta

¿Cómo declarar y utilizar 1D y 2D matrices de bytes en Verilog?

por ejemplo. cómo hacer algo como

byte a_2D[3][3];
byte a_1D[3];

// using 1D
for (int i=0; i< 3; i++)
{
    a_1D[i] = (byte)i;
}

// using 2D
for (int i=0; i< 3; i++)
{
    for (int j=0; j< 3; j++)
    {
        a_2D[i][j] = (byte)i*j;
    }
}
¿Fue útil?

Solución

Verilog piensa en bits, por lo reg [7:0] a[0:3] le dará una matriz de bits 4x8 (4x1 = matriz de bytes). Usted recibe el primer byte de esto con a[0]. El tercer bit del segundo octeto es a[1][2].

Para una matriz 2D de bytes, compruebe en primer lugar el simulador / compilador. Las versiones más antiguas (pre '01, creo) no apoyarán esto. Entonces reg [7:0] a [0:3] [0:3] le dará una matriz 2D de bytes. Un único bit se puede acceder con a[2][0][7] por ejemplo.

reg [7:0] a [0:3];
reg [7:0] b [0:3] [0:3];

reg [7:0] c;
reg d;

initial begin

   for (int i=0; i<=3; i++) begin
      a[i] = i[7:0];
   end

   c = a[0];
   d = a[1][2]; 


   // using 2D
   for (int i=0; i<=3; i++)
      for (int j=0; j<=3; j++)
          b[i][j] = i*j;  // watch this if you're building hardware

end

Otros consejos

Además de la excelente respuesta de Marty, las ofertas de especificación SystemVerilog el tipo de datos byte. El siguiente declara una variable de 4x8 bits (4 bytes), asigna a cada byte de un valor, a continuación, muestra todos los valores:

module tb;

byte b [4];

initial begin
    foreach (b[i]) b[i] = 1 << i;
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]);
    $finish;
end

endmodule

Esto muestra:

Address = 0, Data = 00000001
Address = 1, Data = 00000010
Address = 2, Data = 00000100
Address = 3, Data = 00001000

Esto es similar en concepto a reg [7:0] a [0:3]; de Marty. Sin embargo, byte es un tipo de datos de 2 estados (0 y 1), pero reg es de 4 estados (01xz). Usando byte también requiere su cadena de herramienta (simulador, sintetizador, etc.) para apoyar esta sintaxis SystemVerilog. Tenga en cuenta también la sintaxis de bucle foreach (b[i]) más compacto.

La especificación SystemVerilog compatible con una amplia variedad de tipos de matriz multi-dimensionales. El LRM puede explicar mejor que yo; consulte IEEE Std 1800-2005 , el capítulo 5.

Es simple en realidad, como C programación sólo tiene que pasar los índices de matriz en el lado derecho, mientras declaración. Pero sí la sintaxis será como [0: 3]. Para 4 elementos

reg a[0:3]; 

Esto creará un 1D de la matriz de un solo bit. Del mismo modo matriz 2D se puede crear de esta manera:

reg [0:3][0:2];

Ahora en C supongamos que crea una matriz 2D de int, entonces se creará internamente una matriz 2D de 32 bits. Pero, por desgracia Verilog es un HDL, por lo que piensa en bits en lugar montón de bits (aunque int tipo de datos es allí en Verilog), que puede permitirle crear cualquier número de bits que se almacena dentro de un elemento de la matriz (que no es el caso de C, no se puede almacenar 5-bits en cada elemento de matriz 2D en C). Así que para crear una matriz 2D, en el que cada elemento individual puede llevar a cabo valor de 5 bits, debe escribir lo siguiente:

reg [0:4] a [0:3][0:2];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top