Verilog anidado para un bucle que no se comporta como se espera

0

Estoy teniendo problemas con una simulación de un sumador completo de 8 bits que escribí en verilog. Básicamente tengo dos enteros que introduzco en el sumador completo, los sumo y verifico si el resultado es el esperado. Aquí está el código:

full_adder_Nb_tb.v:

'timescale 1ns / 1ps
'include "config.v"

module full_adder_Nb_tb #(parameter  N = 8)();
reg [N-1:0] a;
reg [N-1:0] b;
wire [N-1:0] s;
wire co;
integer i, j;
integer error_cnt;

full_adder_Nb #(N) test_module (a, b, s, co); 

initial
begin
    $display("TESTING full_adder_Nb.v");
    error_cnt = 0;
    for (i = 0; i < 2^(N-1); i=i+1) begin : outer_loop
        a = i;
        for (j = 0; j < 2^(N-1); j=j+1) begin : inner_loop
            b = j;
            #5;

            if (s != (i+j)%(2^(N-1)) || co != (i+j)/(2^(N-1)))
            begin
                error_cnt = error_cnt + 1;
                'ifdef VERBOSE
                    $display("There was an ERROR. Inputs: a=%d,b=%d, outputs: s=%d, co=%d. Expecected value: s=%d, co=%d", a, b, s, co, (i+j)%(2^(N-1)), (i+j)/(2^(N-1)));
                'endif  
            end        
        end : inner_loop        
    end : outer_loop

    // SIMULATION FINAL OUTPUT
    if (error_cnt == 0)
    begin
        $display("full_adder_Nb.v WORKS correctly.");
    end
    else
    begin
        $display("full_adder_Nb.v does NOT WORK. It has %d errors!", error_cnt);
    end

    #20;
    $finish;

end
endmodule

Este es el resultado de la simulación:

Como puede ver, los enteros i y reg a están atascados en 0, mientras que j y b se están comportando como entendido. Me doy cuenta de que esto no prueba completamente este circuito (tengo la intención de agregar simulación de números negativos).

Estoy agradecido por cualquier sugerencia.

    
pregunta Jure Vreča

1 respuesta

3

Tiene problemas con la precedencia del operador .

La comparación ( < ) tiene mayor precedencia que su operador EXOR ( ^ ).

Por lo tanto, el primer j < 2 se calcula como verdadero (1) o falso (0).
Entonces eso es EXOR-ed con 7, lo que da 6 o 7.
Pero nunca da 0 (falso) por lo que el bucle no termina.

Prueba: j < (2^(N-1)) o lo que probablemente quieras: j < (1<<(N-1))

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas