¿Cómo genero las siguientes declaraciones en SystemVerilog usando un bucle?

0
parameter WIDTH = 512;

wire [0][(WIDTH-1)/1:0][15:0] tree;
wire [1][(WIDTH-1)/2:0][15:0] tree;
wire [2][(WIDTH-1)/4:0][15:0] tree;
wire [3][(WIDTH-1)/8:0][15:0] tree;
wire [4][(WIDTH-1)/16:0][15:0] tree;
wire [5][(WIDTH-1)/32:0][15:0] tree;
wire [6][(WIDTH-1)/64:0][15:0] tree;
wire [7][(WIDTH-1)/128:0][15:0] tree;
wire [8][(WIDTH-1)/256:0][15:0] tree;
wire [9][(WIDTH-1)/512:0][15:0] tree;
    
pregunta geft

1 respuesta

3

Obtendrá errores de compilación con el código de muestra proporcionado:

  1. tree se redefine en el mismo ámbito
  2. La dimensión empaquetada debe especificar un rango
    • wire [1][(WIDTH-1)/1:0][15:0] tree; es ilegal
    • wire [1:1][(WIDTH-1)/1:0][15:0] tree; es legal

Debe usar la construcción generada adoptada de IEEE1364-2001 que se ha extendido a SystemVerilog. Vea IEEE Std 1800-2012 § 27 Generate construct para obtener todos los detalles en uso.

El uso de un ciclo de generación dará un control de alcance del nombre tree , ya que cada ciclo es un ámbito secundario que evita el conflicto de nombres. agregar una etiqueta al bucle permite una fácil referencia al alcance deseado. Lo que buscas es probable:

for(genvar i=0; i<10;i++) begin : label
  wire [(WIDTH-1)/(2**i):0][15:0] tree;
end

Puede acceder a cada etiqueta a través del índice de bucle del identificador de etiqueta. Ejemplo:

  • label[0].tree tiene [511/1:0][15:0] tree
  • label[1].tree tiene [511/2:0][15:0] tree
  • ...
  • label[8].tree tiene [511/256:0][15:0] tree
  • label[9].tree tiene [511/512:0][15:0] tree

Si necesita el primer índice, puede intentarlo:

for(genvar i=0; i<10;i++) begin : label
  wire [i:0][(WIDTH-1)/(2**i):0][15:0] tree; //packed range
end

o:

for(genvar i=0; i<10;i++) begin : label
  wire [(WIDTH-1)/(2**i):0][15:0] tree [i+1]; //packed range, "tree[i+1]" equiv "tree[i:0]"
end
    
respondido por el Greg

Lea otras preguntas en las etiquetas