En primer lugar, deseche este concepto de 'instrucciones'. No existen en Verilog. Nada se ejecuta. Verilog, VHDL, SystemVerilog, etc. son lo que se llaman lenguajes de descripción de hardware. No son ejecutados. No se interpretan. Definen componentes de hardware (puertas lógicas, flip flops, registros, etc.) y sus interconexiones. (Supongo que no es del todo exacto; pero no se ejecutará ni interpretará el único verilog que se puede poner en un FPGA (verilog sintetizable). Los bancos de pruebas son un animal diferente.)
Los relojes se utilizan para controlar chanclas y registros. Los datos se pueden cambiar a flip flops y registros en los bordes del reloj. Por lo tanto, dentro de un bloque always @ (posedge clk), todas las declaraciones se 'ejecutarán' simultáneamente y los resultados se guardarán en los registros en el borde del reloj, de acuerdo con las reglas de cómo se interpretan las declaraciones HDL. Sin embargo, tenga mucho cuidado con el uso de = y < =. El significado de estas dos operaciones de asignación es muy diferente dentro de un bloque siempre. La idea básica es que todas las operaciones = se tratan primero en orden de aparición. Esto sucede a la velocidad de propagación de las puertas. Luego, todas las < = se tratan al mismo tiempo, almacenando el argumento en un registro. Lo único que afecta el reloj en este caso es precisamente cuando se actualizan los registros. Si está ejecutando una simulación, no importará cuántas operaciones deban ocurrir entre registros, pero en un FPGA el reloj tendrá que ser lo suficientemente lento para asegurarse de que cualquier cambio haya podido propagarse a través de la lógica.
Se pueden generar relojes más rápidos utilizando un dispositivo llamado bucle de bloqueo en fase (PLL). Los PLL no se pueden sintetizar en verilog, pero generalmente hay una manera de crear una instancia de un componente PLL dedicado en el FPGA que está utilizando. En realidad, lo retiro, ciertamente puede hacer un PLL digital en verilog, pero solo puede usarlo para generar señales más bajas que la frecuencia de reloj. Un PLL contiene un oscilador controlado por voltaje, uno o más divisores de frecuencia, un comparador de fase y algunos circuitos de control. La salida del VCO se divide y se compara en fase con la frecuencia de entrada. La tensión de control VCO se ajusta hasta que la salida VCO dividida a la baja coincide exactamente con la frecuencia y la fase de la señal de referencia. Si configura el divisor en 5 y usa 50 MHz para la frecuencia de referencia, el PLL generará una señal de 250 MHz que está precisamente sincronizada con la referencia de 50 MHz. Hay varias razones para hacer esto. El uso de un PLL permite la generación de múltiples relojes para que se pueda ejecutar una lógica diferente a diferentes velocidades, por ejemplo. Para interfaces periféricas específicas o para lógica combinatoria lenta y compleja. También puede permitir que el dispositivo controle su propia frecuencia de reloj para ahorrar energía.
Las instrucciones de bloqueo dentro de bloques siempre generarán lógica combinatoria. De nuevo, esta lógica generalmente siempre será 'ejecutada' independientemente del reloj porque define las puertas lógicas reales. Puede ser beneficioso utilizar algunas variables temporales, pero se debe tener cuidado para asegurarse de que no haya tanta lógica adicional que no se cumplan los requisitos de tiempo.