Este código es legal. Dentro de un bloque always
, el orden de las declaraciones importa; por lo tanto, en su caso, la asignación de counter <= 0
en el caso de que se establezca la señal reset
anulará la asignación de counter <= counter + 1
.
¿El compilador convertiría la asignación inicial en un condicional o aumentaría primero el contador, luego se restablecería a 0?
Lo más probable es que se realice como una lógica con el registro counter
de actualización de la señal de selección de fuente.
Si esto se ejecuta de forma secuencial, ¿cómo se representan estas relaciones secuenciales en el hardware?
No no ejecutado . Verilog no es un lenguaje de programación, está describiendo hardware - circuitos electrónicos. Por lo tanto, este código que escribió se convertirá en elementos lógicos y registros, no en códigos de operación para ejecutar.
El orden de las declaraciones en el bloque always
es tratado por Verilog compiler de forma secuencial. Dos ejemplos
always @ (posedge clk) begin
counter <= counter + 1;
if (reset)
counter <= 0;
end
con counter <= 0
anulando counter <= counter + 1
si reset
es 1;
always @ (posedge clk) begin
if (reset)
counter <= 0;
counter <= counter + 1;
end
con el contador que siempre termina con counter <= counter + 1
porque esta declaración aparece después de la declaración condicional anterior. Creo que el compilador debe lanzar una advertencia para este código porque debe ver que la declaración anterior nunca está vigente.
Más aún, este orden de declaración en always
es una función, y puede usarlo para su beneficio teniendo alguna acción predeterminada en el registro (como en el caso de aumentar el valor de registro), y anular acciones en circunstancias específicas (como en su caso, restablecer este registro).