Es importante recordar que con Verilog está describiendo hardware, no escribiendo software. Los módulos son instancias de hardware. No se les puede llamar y no devuelven un valor.
No puede crear una instancia condicional de un módulo dentro de las declaraciones if (*), y definitivamente no puede crear una instancia dentro de los bloques de procedimientos. Si considera lo que tal declaración describiría, queda claro por qué no. Con una instanciación de módulo dentro de una sentencia if, básicamente estás diciendo:
Si la señal es alta, haga aparecer algún hardware; de lo contrario, elimine el hardware.
Los FPGA no pueden funcionar así. Todo el hardware está descrito y arreglado en la síntesis.
En su lugar, lo que debe hacer es crear una instancia de su hardware (en este caso, el módulo de cambio a la derecha) no dentro de la instrucción if o el bloque de procedimientos. Conecte la salida de ese módulo a un cable. Ahora su hardware está siempre presente, independientemente de las señales de control. Entonces, ¿cómo usarlo condicionalmente?
Esto es bastante simple. Dentro de la sentencia if puedes usar tu cable. Si se cumple una condición, asigne el cable a cualquier señal que esté controlando. De lo contrario, asigna alguna otra señal.
wire module_output_wire;
...
always @ (...) begin
...
if (some_condition) begin
some_signal <= module_output_wire;
end else begin
some_signal <= something_else;
end
end
...
your_module (
.whatever(module_output_wire)
);
La razón por la que esto funciona ahora es porque en lugar de intentar inferir hardware transitorio, ahora está inferiendo un multiplexor simple. Las entradas al multiplexor son module_output_wire
y something_else
, la señal de selección es some_condition
y la salida del multiplexor es some_signal
. El hardware siempre existe, pero no siempre es necesario utilizar el valor de salida.
Como alternativa, puede hacer que su código de cambio correcto sea una función. Se puede llamar a una función en Verilog en la forma en que se muestra en la línea comentada en su código. En el caso de la función, usted está inferiendo el hardware que siempre está allí y la salida del hardware es un cable (el valor de retorno de la función) que luego puede usar en un bloque siempre.
(*) Con la excepción de las declaraciones Generar de Verilog 2001, pero en ese caso la condición se conoce en el momento de la compilación, no depende del valor de una señal.