¿Qué es el locking inferido y cómo se crea cuando falta la instrucción else en if condition? ¿Alguien puede explicar brevemente?

Traté de descubrir el locking inferido y por qué es necesario internamente, pero no pude encontrar ningún recurso con suficiente detalle.

Se invoca un latch dentro de un bloque combinatorio donde la red no está asignada a un valor conocido. Asignar una red a sí mismo aún generará un locking. Los cierres también se pueden inferir por las señales faltantes de una lista de sensibilidad y circuitos de retroalimentación.

La forma correcta de inferir un locking previsto en Verilog / SystemVerilog es:

/* Verilog */ //// /* SystemVerilog */ always @* //// always_latch begin //// begin if (en) q = d; //// if (en) q = d; end //// end 

Los pestillos de formas se infieren accidentalmente:

  • Falta la (s) señal (es) para la lista de sensibilidad (esta es la razón por la cual se debe usar @* ):

     always @(a or b) // inferred latch :: "c" missing for the sensitivity list. begin out = a + b + c; end 
  • Condición perdida:

     always @* begin case(in[1:0]) 2'b00: out = 1'b0; 2'b01: out = 1'b1; 2'b10: out = 1'b1; // inferred latch "out" :: missing condition 2'b11/default endcase end always @* begin next0 = flop0; next1 = flop1; // inferred latch "next2" :: missing initial condition next3 = flop3; case(a[2:0]) 3'b001: next0 = in; 3'b010: if(b) next1 = in; 3'b100: if(c) next2 = in; default: if(!b&&!c) next3 = in; endcase end 
  • Bucle de retroalimentación:

     assign out = en ? in : out; // inferred latch "out" :: feedback to mux assign a = en ? z : c; // ... any amount of code between ... assign z = en ? a : y; // inferred latch "a" :: feedback chain 
    • Los ciclos de retroalimentación pueden atravesar la jerarquía y el diseño.

Cómo mitigar el riesgo de pestillos involuntarios:

  • Haga que los cierres previstos sean simples e identificables:
    • Coloque los pestillos previstos en sus propios bloques siempre con la menor lógica combinatoria posible; idealmente ponga la lógica combinatoria de los latches en su propio bloque siempre separado. Sea tan explícito e identifique los pestillos previstos. Use comentarios, tags y, si es posible, use SystemVerilog always_latch .
  • Todos los bloques lógicos combinatorios deben definirse con always @* o SystemVerilog’s always_comb .
  • Asegúrese de que todas las variables asignadas en un bloque lógico combinatorio tengan una asignación inicial o predeterminada.
    • case declaraciones de case deben tener una condición default .
    • if declaraciones deben tener un else correspondiente.
    • Cuando los bloques lógicos combinatorios asignan muchas variables, le dan a cada variable un valor inicial al comienzo del bloque (antes de cualquier case o if ).
  • Sepa de dónde provienen las entradas y hacia dónde se dirigen las salidas.
    • Las entradas de la lógica combinatoria deben ser flops o las salidas de lógica combinatoria deben ser flops.
  • Realice revisiones de códigos, use herramientas de borrado y herramientas de comprobación de equivalencia lógica.
    • La revisión del código requiere que el revisor (o revisores) sepa dónde se pueden ocultar los pestillos.
    • El uso de always_comb de SystemVerilog puede ayudar a identificar los pestillos inferidos con las always_comb de always_comb y comprobación de equivalencia lógica.

En el peor de los casos, coloque toda la lógica dentro de los bloques sincrónicos. Todos los pestillos inferidos se convierten en flip-flops inferidos. Suele ser una mala idea porque puede boost innecesariamente el número de puertas, crear más rutas y afectar el tiempo.

Se invoca un latch cuando la salida de la lógica combinatoria tiene estados indefinidos, es decir, debe mantener su valor anterior.

La lógica combinatoria no tiene ningún flip-flop para mantener el estado, por lo tanto, la salida siempre debe estar definida por las entradas.

Un breve ejemplo podría ser:

 always @* begin if (a == 1'b1) begin b = x|y|z; end end 

¿Qué es b cuando a == 1'b0 . b no se está anulando así que mantendría su valor. ¿Cómo puede algo tener su valor cuando no tiene el concepto de estado? Tienes que introducir el estado al inferir un pestillo. Esto es normalmente algo realmente malo.

Puede implicar pestillos y tener cuidado con el tiempo, etc. pero los pestillos inferidos son nominalmente del código con errores.

Los pestillos solo se generan con bloques combinacionales siempre. La lógica secuencial nunca generará un enganche.

Para obtener más información, lea acerca de cómo se crean los pestillos transparentes y cómo evitar los pestillos inferir