Verificación del valor de entrada de la matriz Verilog

0

¿Cómo puedo verificar el valor de la entrada de matriz en Verilog? Intenté este código pero recibí un error " op_code no es una constante "

module mutlti_proccessor(data_out, flags, data_1, data_2, op_code);
    input [7:0]data_1;
    input [7:0]data_2;      
    input [3:0]op_code;

    output [7:0]data_out;
    output [4:0]flags;
    /* flags[0]:ZF "Zero Flag", flags[1]:SF "Sign Flag", flags[2]:CF "Carry Flag", 
       flags[3]:OF "Overflow Flag", flags[4]:COF "Compare Flag" */

    wire carry;

    /* Set falgs to zero */
    assign {flags[0], flags[1], flags[2], flags[3], flags[4]} = {1'b0, 1'b0, 1'b0, 1'b0, 1'b0 };

    if(op_code==00000)
        Ripple_Adder RA1(data_out, carry, data_1, data_2, 0);


endmodule


Donde Ripple_ADD es otro módulo que resume dos números de 8 bits.
Nota : no hay reloj .

Gracias ....

    
pregunta White159

1 respuesta

0

Su problema está en la línea de código:

if(op_code==00000)
     Ripple_Adder RA1(data_out, carry, data_1, data_2, 0);

No parece haber entendido que Verilog es un "lenguaje de descripción de hardware", no un lenguaje de programación de procedimientos. No no ejecuta el código línea por línea, sino que se sintetiza en hardware según lo que está describiendo.

Está intentando usar una instrucción if incorrectamente. Lo que su código describe es que si el op_code es 0, cree un hardware llamado Ripple_Adder . Sin embargo, ¿qué sucede si op_code no es 0? ¿Necesita inferir el sumador? ¿Debería eliminar el sumador?

Respuesta simple, no se puede. El hardware está resuelto en la síntesis, no se pueden agregar o eliminar partes de él cuando se ejecuta. Es por esto que se queja de que op_code no es una constante, no sabe si se debe incluir o no Ripple_Adder .

La solución es incluir siempre el hardware y luego inferir un multiplexor para seleccionar si se usa o no la salida del mismo. Algo como esto:

wire [7:0] ripple_data_out; //Output data for the ripple adder
Ripple_Adder RA1(ripple_data_out, carry, data_1, data_2, 0); //Infer the ripple adder

always @ * begin
    case (op_code)
        5'b00000: data_out = ripple_data_out; //If the op_code matches, connect ripple_data_out to data_out through the mux.
        //... Add more cases here for other op_code values ...
        default: data_out = 8'b0;
    endcase
end
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas