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