34

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 un for 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.

osjerick
  • 959
  • 1
  • 9
  • 21

0 Answers0