Obtendrá errores de compilación con el código de muestra proporcionado:
-
tree
se redefine en el mismo ámbito
- 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