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