Estoy tratando de probar si un cable (s) está encendido o no para indicar si hay un error / desbordamiento en mi código alu. Dado este código:

output reg[3:0]x;                       // line 149
output wire error;
output wire overflow;

always @* begin
    if(error || overflow) begin         
        assign x = 4'b1111;             // line 155
        assign error = ~error;
        assign overflow = ~overflow;
    end else begin
        assign x = opcode;
    end
end

Recibo los siguientes mensajes de error:

Errors

uut es mi unidad de creación de instancias en mi banco de pruebas llamada main

0
SasaS 15 nov. 2017 a las 02:29

2 respuestas

La mejor respuesta

El código del ejemplo tiene varios problemas.

1) intentó usar 'asignaciones de procedimiento', que es un tema de verilog avanzado. En otras palabras, instrucción assign dentro de un bloque always. Esto no se puede sintetizar, solo se puede usar en tipos reg y está en verilog para casos muy especiales. No lo use.

Sus mensajes de error provienen del hecho de que error y overflow se declaran como wire.

2) está tratando de asignarse una versión invertida de un valor a sí mismo en una lógica no sincronizada. No se comportará de la manera esperada. Dependiendo del uso, puede no alternar o provocará un bucle de retardo cero infinito o, en su caso, podría generar un error.

Entonces, potencialmente, su código debería tener un aspecto similar al siguiente:

input wire clk; // << you need clock
output reg[3:0]x;                       // line 149
output wire error;
output wire overflow;

reg error_reg, overflow_reg; 

 always @(posedge clk) begin
    if(error || overflow) begin         
        x <= 4'b1111;             // line 155
        error_reg <= ~error;
        overflow_reg <= ~overflow;
    end else begin
        x <= opcode;
    end
 assign error = error_reg;
 assign overflow = overflow_reg;
end
0
Serge 15 nov. 2017 a las 11:00

Estás usando la asignación de forma incorrecta. Eso se puede usar fuera de un proceso always, pero no dentro de uno.
Además, el tipo de cable, es necesario para asignar

wire [3:0] x;
assign x = 4'b1111;

Dentro del proceso always, elimine la declaración de asignación y solo diga

reg [3:0] x;  // Note that this is assigned as a reg now
 always @* begin
    if(blah) begin 
       x = 4'b1111;
    end else begin
       x = opcode;
    end
 end
0
Rich Maes 14 nov. 2017 a las 23:41