Circuito iterativo de Verilog

1

Encontré esta descripción en un libro para un comparador de magnitud, y no entiendo la explicación o por qué funciona. He comentado todo lo que entendí, pero esa única línea me mata:

//Behavioral Magnitude Comparator

module MagComp(a,b,gt);

  parameter k = 8;
  input [k-1:0] a,b;
  output gt;
  wire[k-1:0] eqi = a~^b; // returns 1 whenever corresponding bits in a and b are equal
  wire[k-1:0] gti = a&~b; // returns 1 whenever an a-bit is greater than a b-bit
  wire[k:0] gtb = {   (   (eqi[k-1:0] & gtb[k-1:0])  |  gti[k-1:0]   ) , 1'b0   }; // ?? 
  assign gt = gtb[k]; // returns 1 if a>b

endmodule

Parece que está asignando gtb de forma recursiva. ¿Cómo puede funcionar esto si gtb ni siquiera se declara en una primera instancia? ¿Por qué está concatenando un 0 al final? ¿Cómo puede haber algún tipo de recursión si no hay comandos secuenciales?

    
pregunta triplebig

1 respuesta

2

No está iterando, solo está calculando los bits de gtb en paralelo. El cálculo de algunos bits de gtb depende de otros bits de gtb .

Podríamos reescribir la línea cuestionada (haciendo que la sustitución sea k = 8 por simplicidad) como

gtb[8] = ( eqi[7] & gtb[7] ) | gti[7];
gtb[7] = ( eqi[6] & gtb[6] ) | gti[6];
// ...
gtb[1] = ( eqi[0] & gtb[0] ) | gti[0];
gtb[0] = 1'b0;

Tenga en cuenta que esta estructura significa que un cambio en los bits bajos de a o b podría afectar a todos los bits de mayor significado de gtb . Y que estos cambios tendrán que pasar por varias puertas para ripple hasta los bits de alto orden de gtb . Como tal, esta estructura producirá retardos de ruta cada vez más largos a medida que aumenta el ancho ( k ).

Puede ver un comportamiento similar en un riple-carry adder

    
respondido por el The Photon

Lea otras preguntas en las etiquetas