iverilog no puede enlazar el parámetro

-1

Al usar iverilog para compilar un script, aparece el siguiente error:

./alu.v:14: error: Unable to bind parameter 'sel' in 'alu_tb.x1'
./alu.v:14: error: Cannot evaluate genvar case expression: sel
2 error(s) during elaboration.

El código de problema es el siguiente:

module alu(
a,
b,
sel,
out
);

input[7:0] a, b;
input[2:0] sel;
wire a,  b, sel;
output[7:0] out;
reg out;

case(sel)
    3'b000: assign out = a + b;
    3'b001: assign out = a - b;
    3'b010: assign out = a * b;
    3'b011: assign out = a / b;
    3'b100: assign out = a & b;
    3'b101: assign out = a | b;
    3'b110: assign out = a ^ b;
    3'b111: assign out = ~a;
endcase

endmodule

¿Alguien puede ver cuál es el problema aquí? Soy bastante nuevo para verilog. Si ve algo que se pueda hacer mejor, agradecería la orientación.

    
pregunta Tim Oliver

3 respuestas

0

La declaración caso es una declaración secuencial, no una declaración concurrente, por lo que debe estar dentro de un bloque siempre

Si planea sintetizar este código, debe agregar una cláusula predeterminada a la declaración de caso . También es posible que tenga problemas para sintetizar los operadores de multiplicación y división, según su objetivo.

    
respondido por el Elliot Alderson
0

No puede cambiar el ancho cuando declara una entrada o salida como reg o wire. Agregue anchos que coincidan con los utilizados anteriormente. O incluso mejor, combínelos en una declaración (salida reg [7: 0] out;) en lugar de salida separada y reg. Cable es el valor predeterminado, por lo que no necesita declaraciones de cable para las entradas.

    
respondido por el Matt
0

Desea un caso procesal, que debe definirse dentro de un bloque procesal. En su caso, lo desea en un bloque combinado que debería ser always @* o, también, always @(*) cuando se siguen las directrices modernas de codificación de Verilog. Además, en Verilog, reg no puede asignarse mediante una declaración assign (SystemVerilog lo permite).

always @* begin
  case(sel)
    3'b000: out = a + b;
    3'b001: out = a - b;
    3'b010: out = a * b;
    3'b011: out = a / b;
    3'b100: out = a & b;
    3'b101: out = a | b;
    3'b110: out = a ^ b;
    3'b111: out = ~a;
  endcase
end

Cuando se declara case fuera del bloque always , se genera un caso que se evalúa solo durante la elaboración. Su entrada solo puede ser un parameter , un genvar o una constante literal. Esta es una característica útil para los usuarios avanzados, pero es un escollo común para las personas que simplemente aprenden el idioma.

Otra nota. El encabezado de su módulo está escrito en el estilo no ANSI que se requiere en IEEE1364-1995. Desde IEEE1364-2001, el encabezado de estilo ANSI prefirió porque es menos tipográfico, más fácil de leer y, por lo tanto, menos propenso a errores cuando la lista de puertos se alarga.

ANSI (IEEE1364-2001 y superior):

module alu(
  input [7:0] a, b,
  input [2:0] sel,
  output reg [7:0] out
);

no ANSI (requerido para IEEE1364-1995; compatible con versiones anteriores para todas las demás versiones):

module alu(
  a,
  b,
  sel,
  out
);

input  [7:0] a, b;
input  [2:0] sel;
output [7:0] out;
reg    [7:0] out;
    
respondido por el Greg

Lea otras preguntas en las etiquetas