Saltar al contenido

Diferencia entre asignación de bloqueo y no bloqueo Verilog

Solución:

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 bloques ejecución de la siguiente instrucción hasta que se complete. Por lo tanto, los resultados de la siguiente declaración pueden depender de que se complete la primera.

La asignación sin bloqueo se ejecuta en paralelo porque describe asignaciones que ocurren 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 sucedido.

Las sentencias de asignación no son ni “bloqueantes” ni “no bloqueantes”, son “continuas”. La salida de una instrucción de asignación siempre es igual a la función especificada de sus entradas. Las asignaciones “bloqueantes” y “no bloqueantes” solo existen dentro de los bloques siempre.

Una asignación de bloqueo entra en vigor inmediatamente después de su procesamiento. Una asignación sin bloqueo tiene lugar al final del procesamiento del “delta de tiempo” actual.

Los bloques always se pueden usar 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, generalmente es más eficiente usar = pero generalmente no importa.

Cuando se modela lógica secuencial (por ejemplo, always @ (posedge clk)) normalmente se utilizan asignaciones 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 utilizar asignaciones de bloqueo en bloques siempre secuenciales como “variables”. Si hace esto, hay dos reglas clave a tener en cuenta.

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

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

El término Asignación de bloqueo confunde a la gente porque la palabra bloqueo parecería sugerir una lógica secuencial en el tiempo. Pero en lógica sintetizada no significa esto, porque todo opera 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 combinacional de las entradas a los elementos de memoria no transparentes (por ejemplo, registros sincronizados), que pueden tener asignación retrasada.

Desde un punto de vista legalista, todo funciona muy bien. De hecho, puede considerar la = ser un bloqueo operación (secuencial en el tiempo) incluso dentro always_comb secuencias. Sin embargo, la distinción entre secuencial y paralelo en el tiempo no hace ninguna diferencia en este caso porque el always_comb El bloque está definido para repetirse hasta que la secuencia de instrucciones converja en un estado estable, que es exactamente lo que hará el circuito de hardware (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 superar el uso inteligente de la terminología asociada con los llamados conductual elementos en el idioma.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *