Tratar con arreglos en HDL

(Supongamos Mux4Wayque ya se ha implementado)

/**
 * 4-way 16-bit multiplexor:
 * out = a if sel == 00
 *       b if sel == 01
 *       c if sel == 10
 *       d if sel == 11
 */

CHIP Mux4Way16 {
    IN a[16], b[16], c[16], d[16], sel[2];
    OUT out[16];

    PARTS:
    // Put your code here:
    Mux4Way(a=a[0],b=b[0],c=c[0],d=d[0],sel=sel,out=out[0]);
    Mux4Way(a=a[1],b=b[1],c=c[1],d=d[0],sel=sel,out=out[1]);
    Mux4Way(a=a[2],b=b[2],c=c[2],d=d[0],sel=sel,out=out[2]);
    Mux4Way(a=a[3],b=b[3],c=c[3],d=d[0],sel=sel,out=out[3]);
    Mux4Way(a=a[4],b=b[4],c=c[4],d=d[0],sel=sel,out=out[4]);
    Mux4Way(a=a[5],b=b[5],c=c[5],d=d[0],sel=sel,out=out[5]);
    Mux4Way(a=a[6],b=b[6],c=c[6],d=d[0],sel=sel,out=out[6]);
    Mux4Way(a=a[7],b=b[7],c=c[7],d=d[0],sel=sel,out=out[7]);
    Mux4Way(a=a[8],b=b[8],c=c[8],d=d[0],sel=sel,out=out[8]);
    Mux4Way(a=a[9],b=b[9],c=c[9],d=d[0],sel=sel,out=out[9]);
    Mux4Way(a=a[10],b=b[10],c=c[10],d=d[0],sel=sel,out=out[10]);
    Mux4Way(a=a[11],b=b[11],c=c[11],d=d[0],sel=sel,out=out[11]);
    Mux4Way(a=a[12],b=b[12],c=c[12],d=d[0],sel=sel,out=out[12]);
    Mux4Way(a=a[13],b=b[13],c=c[13],d=d[0],sel=sel,out=out[13]);
    Mux4Way(a=a[14],b=b[14],c=c[14],d=d[0],sel=sel,out=out[14]);
    Mux4Way(a=a[15],b=b[15],c=c[15],d=d[0],sel=sel,out=out[15]);
}

Como puede ver, este código parece bastante poco elegante. ¿Cómo puedo lidiar con este código repetitivo? Soy nuevo en HDL, así que me disculpo por esta pregunta trivial. ¿Existe el concepto de bucles (o algo parecido) en HDL?

La mayoría de los lenguajes tienen una construcción que le permite crear instancias de matrices de entidades. Por ejemplo, VHDL tiene una instrucción "generar". No reconozco tu HDL, ¿qué idioma estás usando?

Respuestas (2)

En verilog usas un generar como:

   genvar i;

   generate

     for (i = 0; i < 16 ; i = i + 1) begin: muxes
          Mux4Way m(.a(a[i]),.b(b[i]),.c(c[i]),.d(d[i]),.sel(sel),.out(out[i]));
     end

  endgenerate

La mejor manera de implementar un mux es usar el operador de subíndice de matriz (no necesitamos construir un mux más grande usando otros más pequeños, el sintetizador HDL lo hace por nosotros). El código SystemVerilog se vería así:

logic  [1:0] select;     // Two bit array index
logic [15:0] in[3:0];    // Four 16-bit numbers
logic [15:0] out;        // 16-bit output

always_comb out = in[sel];

/* If the array "in" is not available, you can create it as:

   always_comb in[0] = a;
   always_comb in[1] = b;
   ...
   always_comb in[3] = d;
*/