25 votos

Diferencia entre asignación bloqueante y no bloqueante Verilog

Estaba leyendo esta página http://www.asic-world.com/verilog/verilog_one_day3.html cuando me encontré con lo siguiente:

Normalmente tenemos que resetear los flip-flops, por lo que cada vez que el reloj hace la transición de 0 a 1 (posedge), comprobamos si el reset está afirmado (reset síncrono), luego seguimos con la lógica normal. Si nos fijamos bien 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 "<=". Pues bien, "=" es asignación bloqueante y "<=" es asignación no bloqueante. "=" ejecuta el código secuencialmente dentro de un principio / fin, mientras que "<=" no bloqueante lo ejecuta en paralelo.

Estaba bastante seguro de que las asignaciones no bloqueantes eran secuenciales mientras que las bloqueantes eran paralelas. Después de todo, puedes hacer asignaciones bloqueantes con sentencias assign fuera de los bloques always, y todas ellas se ejecutan en paralelo. ¿Es un error, o el comportamiento es diferente dentro de un bloque always? Y, si el comportamiento ES diferente dentro de un bloque always, ¿pueden hacerse asignaciones no bloqueantes fuera de un bloque always?

27voto

RWH Puntos 21

estaba bastante seguro de que las asignaciones no bloqueantes eran secuenciales mientras que las bloqueantes eran paralelas.

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

La asignación no bloqueante se ejecuta en paralelo porque describe asignaciones que ocurren todas al mismo tiempo. El resultado de una sentencia en la 2ª línea no dependerá de los resultados de la sentencia en la 1ª línea. En su lugar, la 2ª línea se ejecutará como si la 1ª línea no hubiera ocurrido todavía.

10voto

Peter Green Puntos 1888

Las sentencias Assign no son "bloqueantes" ni "no bloqueantes", son "continuas". La salida de una sentencia assign es siempre igual a la función especificada de sus entradas. Las asignaciones "bloqueantes" y "no bloqueantes" sólo existen dentro de bloques siempre.

Una asignación bloqueante tiene efecto inmediatamente después de ser procesada. Una asignación no bloqueante tiene lugar al final del procesamiento del "delta de tiempo" actual.

Los bloques always pueden usarse para modelar lógica combinatoria o secuencial (systemverilog tiene always_comb y always_ff para hacer esto explícito). Cuando se modela lógica combinatoria suele ser más eficiente usar =, pero normalmente no importa.

Cuando se modela lógica secuencial (por ejemplo, siempre @(posedge clk) ) normalmente se utilizan asignaciones no bloqueantes. Esto permite determinar el "estado después del flanco de reloj" en términos del "estado antes del flanco de reloj".

A veces resulta útil utilizar asignaciones de bloqueo en bloques siempre secuenciales como "variables". Si lo hace, debe tener en cuenta dos reglas fundamentales.

  1. No acceda a un reg establecido con asignaciones de bloqueo dentro de un bloque siempre secuencial desde fuera del bloque siempre en el que está asignado.
  2. No mezclar asignaciones bloqueantes y no bloqueantes al mismo reg.

Si se infringen estas reglas, es probable que se produzcan fallos en la síntesis y/o diferencias de comportamiento entre la simulación y la síntesis.

7voto

oeda Puntos 199

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

Quizás un término menos confuso sería asignación inmediata que seguiría diferenciando los resultados intermedios de la lógica combinacional de las entradas a elementos de memoria no transparentes (por ejemplo, registros con reloj), que pueden tener asignación retrasada .

Desde un punto de vista legalista, todo funciona muy bien. De hecho, se puede considerar = ser un bloqueo (secuencial en el tiempo) incluso dentro de always_comb secuencias. Sin embargo, la distinción entre tiempo-secuencial y paralelo no hace absolutamente ninguna diferencia en este caso porque el always_comb se define para que se repita hasta que la secuencia de instrucciones converja en un estado estable, que es exactamente lo que hará el circuito de hardware (si cumple los requisitos de temporización).

El subconjunto sintetizable de Verilog (y especialmente SystemVerilog) es extremadamente sencillo y fácil de usar, una vez que se conocen los modismos necesarios. Sólo hay que superar el uso ingenioso de la terminología asociada a la llamada comportamiento elementos de la lengua.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X