verilog módulo dentro de una sentencia if

0

Tengo que construir un circuito de un operador aritmético de cambio a la derecha en verilog e incluirlo en un código de verilog de una computadora simple. He escrito el código del circuito con un módulo y se compila sin un error, pero cuando intento incluirlo en el código de la computadora (tiene que estar en una sentencia if) se produce un error: "error: sintaxis error, MÓDULO inesperado "¿es posible incluir un módulo en una sentencia if?

 always @(alu_A or alu_B or aluop)
if      (aluop==0)    alu <= alu_A;
else if (aluop==1)    alu <= alu_A + alu_B;
else if (aluop==2)    alu <= alu_A - alu_B;
else if (aluop==3)    alu <= alu_A & alu_B;
else if (aluop==4)    alu <= alu_A ^ alu_B;
else if (aluop==5)    alu <= alu_A << alu_B[3:0];
//else if (aluop==6)    alu <= right_shift(alu_A, alu_B[3:0]);
else 
 begin
 module right_shift (alu_A,alu_B,alu);
input [15:0] alu_A;
input [3:0] alu_B;
output [15:0] alu;

esta es una parte del código: el comentario es la parte antigua del código donde se hace el cambio a la derecha, todo lo que está debajo son los cambios que he hecho. No comenté todo el código porque es muy grande

    
pregunta Maria Tabernig

2 respuestas

1

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.

    
respondido por el Tom Carpenter
0

Use mulitplexers para seleccionar diferentes buses (o códigos de operación), todo el hardware que esté utilizando debe estar allí cuando compile, los FPGA no pueden cambiar su hardware sobre la marcha (aún).

Si realmente desea seleccionar entre diferentes módulos de hardware, puede usar el equivalente de #define en C para seleccionar qué hardware se compila. Pero la selección solo puede ocurrir antes de compilar.

conditional_compilation_directive ::=
ifdef_directive
| ifndef_directive
ifdef_directive ::=
'ifdef text_macro_identifier
ifdef_group_of_lines
{ 'elsif text_macro_identifier elsif_group_of_lines }
[ 'else else_group_of_lines ]
'endif


ifndef_directive ::=
'ifndef text_macro_identifier
ifndef_group_of_lines
{ 'elsif text_macro_identifier elsif_group_of_lines }
[ 'else else_group_of_lines ]
'endif

Más información sobre esto en Este PDF .

    
respondido por el laptop2d

Lea otras preguntas en las etiquetas