diferencia entre el bloqueo y la asignación sin bloqueo Verilog

13

Estaba leyendo esta página enlace cuando encontré lo siguiente:

  

Normalmente, tenemos que restablecer los flip-flops, por lo tanto, cada vez que el reloj realiza la transición de 0 a 1 (posición), verificamos si se restablece (restablecimiento sincrónico), luego seguimos con la lógica normal. Si observamos de cerca, vemos que en el caso de la lógica combinacional teníamos "=" para la asignación, y para el bloque secuencial teníamos el operador "<=". Bueno, "=" está bloqueando la asignación y "<=" es una asignación sin bloqueo. "=" ejecuta el código de forma secuencial dentro de un inicio / final, mientras que el bloqueo sin bloqueo "<=" se ejecuta en paralelo.

Estaba bastante seguro de que las asignaciones sin bloqueo eran secuenciales, mientras que las asignaciones de bloqueo eran paralelas. Después de todo, puede realizar asignaciones de bloqueo con sentencias de asignación fuera de siempre bloques, y todas se ejecutan en paralelo. ¿Es esto un error, o el comportamiento es diferente dentro de un bloque siempre? Y, si el comportamiento ES diferente dentro de un bloque siempre, ¿se pueden hacer asignaciones sin bloqueo fuera de un bloque siempre?

    
pregunta Void Star

3 respuestas

17
  

estaba bastante seguro de que las asignaciones sin bloqueo eran secuenciales, mientras que las asignaciones de bloqueo eran paralelas.

La asignación de bloqueo se ejecuta "en serie" porque una asignación de bloqueo bloquea la ejecución de la siguiente instrucción hasta que se completa. Por lo tanto, los resultados de la siguiente declaración pueden depender de la primera que se complete.

La asignación no bloqueante se ejecuta en paralelo porque describe asignaciones que se producen todas al mismo tiempo. El resultado de una declaración en la segunda línea no dependerá de los resultados de la declaración en la primera línea. En cambio, la segunda línea se ejecutará como si la primera línea aún no hubiera ocurrido.

    
respondido por el The Photon
3

El término Bloqueo de asignación confunde a las personas porque la palabra bloqueo parece sugerir una lógica secuencial en el tiempo. Pero en lógica sintetizada no significa esto , porque todo funciona en paralelo .

Quizás un término menos confuso sería asignación inmediata , que aún diferenciaría los resultados intermedios de la lógica combinatoria de las entradas a los elementos de memoria no transparentes (por ejemplo, registros cronometrados), que pueden tener < em> asignación retrasada .

Desde un punto de vista legalista, todo funciona muy bien. De hecho, puede considerar que = es una operación de bloqueo (secuencial en el tiempo) incluso dentro de las secuencias de always_comb . Sin embargo, la distinción entre tiempo secuencial y paralelo no hace absolutamente ninguna diferencia en este caso porque el bloque always_comb está definido para repetirse hasta que la secuencia de instrucciones converja en un estado estable, que es exactamente lo que el circuito de hardware funcionará (si cumple con los requisitos de tiempo).

El subconjunto sintetizable de Verilog (y especialmente SystemVerilog) es extremadamente simple y fácil de usar, una vez que conozca los modismos necesarios. Solo tiene que pasar por alto el uso inteligente de la terminología asociada con los elementos denominados conductual en el lenguaje.

    
respondido por el nobar
3

Las sentencias de asignación no son "bloqueadas" ni "no bloqueadas", son "continuas". La salida de una declaración de asignación es siempre igual a la función especificada de sus entradas. Las asignaciones de "bloqueo" y "sin bloqueo" solo existen dentro de siempre bloques.

Una asignación de bloqueo tiene efecto inmediatamente después de procesarse. Una asignación sin bloqueo tiene lugar al final del procesamiento del "tiempo delta" actual.

siempre se pueden usar bloques para modelar lógica combinatoria o secuencial (systemverilog tiene always_comb y always_ff para hacer esto explícito). Cuando se modela la lógica combinatoria es generalmente más eficiente usar = pero generalmente no importa realmente.

Al modelar la lógica secuencial (por ejemplo, siempre @ (cliqueo de posición)) normalmente se utilizan evaluaciones sin bloqueo. Esto le permite determinar el "estado después del borde del reloj" en términos de "el estado antes del borde del reloj".

A veces es útil usar asignaciones de bloqueo en bloques secuenciales siempre como "variables". Si haces esto, entonces hay dos reglas clave a tener en cuenta.

  1. No acceda a un registro que está configurado con asignaciones de bloqueo dentro de un bloque siempre secuencial desde fuera del bloque siempre que está asignado.
  2. No mezcle las asignaciones de bloqueo y no bloqueo en el mismo registro.

Es probable que la ruptura de estas reglas provoque fallas en la síntesis y / o diferencias de comportamiento entre la simulación y la síntesis.

    
respondido por el Peter Green

Lea otras preguntas en las etiquetas