reg bidimensionales arreglos array arrays byte verilog

arrays - bidimensionales - verilog array 2d



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

Además de la excelente Respuesta de Marty, la especificación SystemVerilog ofrece el tipo de datos de byte . Lo siguiente declara una variable de 4x8 bits (4 bytes), asigna un valor a cada byte y luego 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 imprime:

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

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

La especificación SystemVerilog admite una amplia variedad de tipos de matrices multidimensionales. El LRM puede explicarlos mejor que yo; Consulte IEEE Std 1800-2005 , capítulo 5.

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

p.ej. como 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; } }


En realidad, es simple, como la programación en C, solo necesita pasar los índices de matriz en el lado derecho durante la declaración. Pero sí, la sintaxis será como [0: 3] para 4 elementos.

reg a[0:3];

Esto creará una 1D de matriz de un solo bit. Similarmente la matriz 2D se puede crear así:

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

Ahora, en C, suponga que crea una matriz 2D de int, entonces creará internamente una matriz 2D de 32 bits. Pero, desafortunadamente, Verilog es un HDL, por lo que piensa en bits en lugar de en grupos de bits (aunque el tipo de datos int está en Verilog), puede permitirle crear cualquier número de bits que se almacenarán dentro de un elemento de matriz (que no es el En el caso de C, no puede almacenar 5 bits en cada elemento de la matriz 2D en C). Entonces, para crear una matriz 2D, en la que cada elemento individual puede contener un valor de 5 bits, debe escribir esto:

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


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

Para una matriz 2D de bytes, primero verifique su simulador / compilador. Las versiones anteriores (antes del ''01, creo) no son compatibles con esto. Luego reg [7:0] a [0:3] [0:3] le dará una matriz 2D de bytes. Se puede acceder a a[2][0][7] solo bit 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