Intento diseñar un sumador completo de n
operandos de entrada, cada uno con precisión bitDepth
, he escrito el siguiente módulo en Verilog:
module nInputAdder
#(parameter n = 2,
parameter bitDepth = 1)
(input [n * bitDepth - 1:0] IN,
output reg [bitDepth - 1:0] OUT,
output reg C);
integer i;
reg [bitDepth - 1:0] SUM;
reg Ci;
always @(*) begin
SUM = {(bitDepth){1'b0}}; //Inicialmente cero
Ci = 1'b0;
for (i = 1; i <= n; i = i + 1)
{Ci, SUM} = SUM + IN[bitDepth*i - 1:bitDepth*(i-1)] + Ci;
OUT = SUM;
C = Ci;
end
endmodule //nInputAdder
Sin embargo, este código no funciona. El compilador, cuando se instancia el módulo en un testBench
, arroja cuatro errores del tipo Part select expressions must be constant
en la línea de actualización de suma:
InputAdder.v:29: error: Part select expressions must be constant.
nInputAdder.v:29: : This lsb expression violates the rule: (bitDepth)*((i)-('sd1))nInputAdder.v:29: error: Part select expressions must be constant.
nInputAdder.v:29: : This msb expression violates the rule: ((bitDepth)*(i))-('sd1)nInputAdder.v:29: error: Part select expressions must be constant.
nInputAdder.v:29: : This lsb expression violates the rule: (bitDepth)*((i)-('sd1))nInputAdder.v:29: error: Part select expressions must be constant.
nInputAdder.v:29: : This msb expression violates the rule: ((bitDepth)*(i))-('sd1)
Actualmente estoy aprendiendo Verilog y tengo ciertas dudas con lo que se debe hacer al diseñar este módulo o similares:
- ¿Qué puedo hacer para solucionar el error? ¿Qué está indicando el error? (Agradecería una buena explicación)
- ¿Hay una manera adecuada para describir módulos genéricos de
n
entradas, sin tener que usar una única entrada que abarque todos los bits necesitados? - ¿Es correcto intentar hacer la suma de las
n
entradas en unfor
como el utilizado?
Acá los módulos de prueba:
module testBench;
parameter n = 4;
parameter bitDepth = 4;
wire [n * bitDepth - 1:0] IN = 0;
wire [bitDepth - 1:0] OUT;
wire C;
// Conectar modulos
nInputAdder#(n, bitDepth) adder(IN, OUT, C);
test#(n, bitDepth) testAdder(IN, OUT, C);
endmodule //testBench
module test
#(parameter n = 2,
parameter bitDepth = 1)
(output reg [n * bitDepth - 1:0] IN = 0,
input [bitDepth - 1:0] OUT,
input C);
initial begin
$dumpfile("test.vcd");
$dumpvars(0,test);
#200 $finish;
end
always #10 IN = IN - bitDepth/2;
endmodule //test
Para compilar el testBench
uso el siguiente script de Bash:
#!/bin/bash
rm testBench test.vcd
iverilog -o testBench nInputAdder.v
./testBench
gtkwave test.vcd
Software necesario: iVerilog y GTKWave para visualizar las trazas generadas, si la compilación es exitosa.