Creando una matriz multidimensional en el sistema verilog

2

Quiero crear una matriz en systemverilog que tenga n entradas de m bits.

logic [n-1:0] arr [m-1:0]; (a)

¿Es esta la manera correcta de hacerlo? ¿Qué pasa si cambio el orden de colocación del rango?

Por ejemplo. logic arr [n-1:0] [m-1:0]; (b)

¿Representa la misma matriz que (a)?

También quiero crear una matriz de máquinas de estado con n entradas, representando cada entrada Un estado de los 4 estados.

typedef enum logic [n-1:0][1:0]{S0,S1,S2,S3} statetype;
statetype state,nextstate;

¿Es la forma correcta anterior de hacerlo? Si es así, ¿cómo voy a acceder exactamente a los elementos? de esta matriz.

    

1 respuesta

7

En primer lugar, es una práctica común que los parámetros sean mayúsculas. Al leer el código, esto ayuda a identificar las constantes de las variables. Para las matrices, consulte IEEE Std 1800-2012 § 7.4 Arreglos empaquetados y no empaquetados .

  • Empaquetado significa que se puede acceder a todos los bits a la vez o troceados
  • Desempaquetado significa que cada índice debe seleccionarse individualmente.

Los siguientes tienen las mismas dimensiones:

  • logic [N-1:0] arr_up [M-1:0]; es M matrices desempaquetadas, cada una con N bits empaquetados
  • logic arr_uu [M-1:0] [N-1:0]; es M matrices desempaquetadas, cada una con N matrices de bits individuales desempaquetadas
  • logic [M-1:0] [N-1:0] arr_pp; es una matriz empaquetada M por N, se puede leer una porción de N bits del índice M

Las matrices desempaquetadas se pueden inicializar con un solo dígito: logic [N-1:0] arr_up [M]; es equivalente a logic [N-1:0] arr_up [0:M-1]; . Tenga en cuenta que el [M] es [0:M-1] no [M-1:0] .

Las diferencias están en el acceso. Todos pueden acceder a un solo bit, pero solo los bits empaquetados pueden acceder a un segmento.

arr_up[M-2] = {{N{1'b0}}}; // legal
arr_uu[M-2] = {{N{1'b0}}}; // illegal, assigning packed to unpacked
arr_pp[M-2] = {{N{1'b0}}}; //legal'

arr_up[M-1:M-4] = {{3*N{1'b1}}}; // illegal, unpacked cannot use sliced array
arr_uu[M-1:M-4] = {{3*N{1'b1}}}; // illegal, unpacked cannot use sliced array
arr_pp[M-1:M-4] = {{3*N{1'b1}}}; // legal

arr_up[M-2][N-5] = 1'b0; // legal
arr_uu[M-2][N-5] = 1'b0; // legal
arr_pp[M-2][N-5] = 1'b0; // legal

arr_up[M-2][N-5:4] = {{N-9{1'b1}}}; // legal
arr_uu[M-2][N-5:4] = {{N-9{1'b1}}}; // illegal, unpacked cannot use sliced array
arr_pp[M-2][N-5:4] = {{N-9{1'b1}}}; // legal

Si el simulador solo está accediendo a un solo bit o índice, las matrices desempaquetadas darán un mejor rendimiento. Esto se debe a que las matrices empaquetadas se acceden en conjunto incluso si solo se está utilizando un bit. Hay un equilibrio entre la sobrecarga de búsqueda de simuladores y el número de operaciones de búsqueda. En general, las matrices 2-D son matrices desempaquetadas de matrices empaquetadas. Añadir dimensiones es normal en el lado desempaquetado. Los bytes, los enteros, las palabras y los buses de datos están empaquetados.

Con typedef enum logic [N-1:0][1:0]{S0,S1,S2,S3} statetype; , tenga en cuenta que esto está creando la definición del tipo de estado. Es crear una matriz de 2 * N bits pero solo permite 4 valores.

Para una matriz de máquinas de estado de 4 estados, recomendaría:

typedef enum logic [1:0]{S0,S1,S2,S3} state_et;
state_et state[N], nextstate[N];
    
respondido por el Greg

Lea otras preguntas en las etiquetas