Verilog test bench incorrectamente leyendo el vector de prueba

2

Estoy intentando usar un banco de pruebas para simular una función XOR de 4 entradas. He especificado las entradas de prueba y las salidas esperadas en un archivo de vector de prueba. Esto no es tarea, solo para el interés personal. Para las primeras 8 entradas (0000 a 0111), la salida esperada se está interpretando erróneamente en el vector de prueba. Los últimos 8 están bien.

Utilicé el banco de pruebas para verificar un circuito combinado diferente, y funcionó bien. Modifiqué ligeramente para simular mi función XOR, y ahora no funciona como se esperaba.

Cualquier ayuda, comentarios, sugerencias, etc. son apreciados!

módulo XOR:

module xor_4(input [3:0] a, 
                output y);

assign y = ^a;

endmodule

Testbench:

module testbench3();
reg clk, reset;
reg a, b, c, d, yexpected;
wire y;
reg [31:0] vectornum, errors;
reg [3:0] testvectors [10000:0];

// instantiate device under test
xor_4 dut({a, b, c, d}, y);

// generate clock
always
    begin
        clk = 1; #5; clk = 0; #5;
    end

// at start of test, load vectors
// and pulse reset
initial
    begin
        $readmemb("xor_4.tv", testvectors);
        vectornum = 0; errors = 0;
        reset = 1; #27; reset = 0;
    end

// apply test vectors at rising edge of clock
always @ (posedge clk)
    begin
        #1; {a, b, c, d, yexpected} = 
              testvectors[vectornum];

    end

// check results at falling edge of clock
always @ (negedge clk)
    if (~reset) begin
        if (y !== yexpected) begin
            $display ("Error: inputs = %b", {a, b, c, d});
            $display (" outputs = %b (%b expected)", y, yexpected);
            errors = errors + 1;
        end
        //$display (" %b %b %b %b %b ", a, b, c, d, yexpected);
        vectornum = vectornum + 1;
        if (testvectors[vectornum] === 4'bx) begin
            $display ("%d tests completed with %d errors", vectornum, errors);

            $finish;
        end
    end

endmodule

Vector de prueba:

0000_0
0001_1
0010_1
0011_0
0100_1
0101_0
0110_0
0111_1
1000_1
1001_0
1010_0
1011_1
1100_0
1101_1
1110_1
1111_0

Salida del script iverilog:

C:\iverilog>iverilog -o test testbench3.v xor_4.v
C:\iverilog>vvp test
 WARNING: testbench3.v:17: $readmemb: Standard inconsistency, following 1364-200
.
 WARNING: testbench3.v:17: $readmemb(xor_4.tv): Not enough words in the file for
the requested range [0:10000].
Error: inputs = 0000
  outputs = 0 (1 expected)
Error: inputs = 0001
 outputs = 1 (0 expected)
Error: inputs = 0010
 outputs = 1 (0 expected)
Error: inputs = 0011
 outputs = 0 (1 expected)
Error: inputs = 0100
 outputs = 1 (0 expected)
Error: inputs = 0101
 outputs = 0 (1 expected)
Error: inputs = 0110
 outputs = 0 (1 expected)
Error: inputs = 0111
 outputs = 1 (0 expected)
        16 tests completed with          8 errors
    
pregunta Danny

1 respuesta

2

La pista está en los mensajes de advertencia al comienzo de la simulación:

  

ADVERTENCIA: testbench3.v: 17: $ readmemb: inconsistencia estándar, después de 1364-200.
  ADVERTENCIA: testbench3.v: 17: $ readmemb (xor_4.tv): No hay suficientes palabras en el archivo para el rango solicitado [0: 10000].

Cada entrada de testvector tiene 4 bits de ancho, sin embargo, xor_4.tv es de 5 bits y {a,b,c,d,yexpected} también es de 5 bits.

Cambia reg [3:0] testvector [10000:0]; a reg [4:0] testvector [0:10000];

    
respondido por el Greg

Lea otras preguntas en las etiquetas