Estaba leyendo esta página http://www.asic-world.com/verilog/verilog_one_day3.html cuando me encontré con lo siguiente:
Normalmente tenemos que reiniciar los flip-flops, por lo tanto, cada vez que el reloj realiza la transición de 0 a 1 (posedge), verificamos si se reafirma el reinicio (reinicio sincrónico), luego continuamos con la lógica normal. Si miramos 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, "=" es una tarea de bloqueo y "<=" es una tarea sin bloqueo. "=" ejecuta código secuencialmente dentro de un inicio / fin, mientras que el no bloqueo "<=" se ejecuta en paralelo.
Estaba bastante seguro de que las tareas sin bloqueo eran secuenciales mientras que las tareas de bloqueo eran paralelas. Después de todo, puede hacer asignaciones de bloqueo con instrucciones de asignación fuera de los bloques siempre, y todos 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 realizar asignaciones sin bloqueo fuera de un bloque siempre?
assign
declaraciones ocurren fuera de los bloques siempre y generalmente se usan para describir la lógica combinatoria (no bloqueada) (mientras que los bloques, con algunas excepciones, describen la lógica secuencial). AFAIK, lasassign
declaraciones siempre se ejecutan "en paralelo" cuando su LHS tiene un cambio de valor.Las declaraciones de asignación no son "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 tareas de "bloqueo" y "no bloqueo" solo existen dentro de los bloques siempre.
Una asignación de bloqueo surte efecto de inmediato cuando se procesa. 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 hacerlo explícito). Cuando se modela la lógica combinatoria, generalmente es más eficiente usar = pero, en general, realmente no importa.
Al modelar la lógica secuencial (p. Ej., Siempre @ (posedge clk)), normalmente utiliza 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 usar asignaciones de bloqueo en bloques secuenciales siempre como "variables". Si haces esto, entonces hay dos reglas clave a tener en cuenta.
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.
fuente
El término asignación de bloqueo confunde a las personas porque la palabra bloqueo parece sugerir 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 la asignación inmediata , que aún diferenciaría los resultados intermedios de la lógica combinacional de las entradas a elementos de memoria no transparentes (por ejemplo, registros cronometrados), que pueden tener una 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 lasalways_comb
secuencias. Sin embargo, la distinción entre secuencial y paralela en el tiempo no hace absolutamente ninguna diferencia en este caso porque elalways_comb
bloque está definido para repetirse hasta que la secuencia de instrucciones converja en un estado estable, que es exactamente lo que hará la circuitería de hardware (si cumple con el tiempo requisitos).El subconjunto sintetizable de Verilog (y especialmente SystemVerilog) es extremadamente simple y fácil de usar, una vez que conoce los modismos necesarios. Solo tiene que superar el uso inteligente de la terminología asociada con los llamados elementos de comportamiento en el lenguaje.
fuente
initial
declaraciones dentro de losprogram
bloques, utiliza exclusivamente la asignación de bloqueo (secuencial) . Esto es útil para el diseño de banco de pruebas , pero generalmente no para la especificación RTL.