使用测试向量文件的 ALU 测试台不起作用
ALU test bench using test vector file not working
我是新手,这个问题可能看起来很愚蠢,但我已经花了几个小时在这上面,测试平台只是不想在执行算术之前将正确的值加载到寄存器中。
这是我去 运行 模拟时发生的事情
# [ 0]Success: inputs: a=00000000 | b=00000000 | f=0
# outputs: y=00000000 | y_ex=00000000 | zero=1
# [ 1]Error: inputs: a=00000007 | b=ffffffff | f=0
# outputs: y=00000007 | y_ex=fffffff8 | zero=0
# [ 2]Error: inputs: a=0000000f | b=fffffff8 | f=0
# outputs: y=00000008 | y_ex=00000000 | zero=1
# [ 3]Error: inputs: a=000007f8 | b=00000008 | f=0
# outputs: y=00000008 | y_ex=00000800 | zero=0
# [ 4]Success: inputs: a=00000000 | b=00000000 | f=0
# outputs: y=00000000 | y_ex=00000000 | zero=1
# [ 5]Error: inputs: a=00000007 | b=fffffff8 | f=0
# outputs: y=00000000 | y_ex=00000008 | zero=0
# [ 6]Error: inputs: a=00000008 | b=00000008 | f=0
# outputs: y=00000008 | y_ex=00000000 | zero=0
# [ 7]Error: inputs: a=00000800 | b=00000008 | f=0
# outputs: y=00000000 | y_ex=000007f8 | zero=1
# 8 tests completed with 6 errors
如您所见,用于指定 ALU 将执行哪种操作的 f 值总是错误的。 a 和 b 值也读错了。不过,阅读似乎还不错。我已经测试过了。
这是我的 ALU 代码
module alu(input logic [31:0] a, b,
input logic [2:0] f,
output logic [31:0] y,
output logic zero
);
always @*
begin
if (f == 3'h0) //AND
y = a & b;
else if (f == 3'h1) //OR
y = a | b;
else if (f == 3'h2) //ADD
y = a + b;
else if (f == 3'h4) //AND NOT
y = a & ~b;
else if (f == 3'h5) //OR NOT
y = a | ~b;
else if (f == 3'h6) //SUBTRACT
y = a - b;
else if (f == 3'h7) //SET LESS THEN
y =(a<b)?32'h00000001:32'h00000000;
begin
if (y == 32'h00000000)
zero = 1;
else
zero = 0;
end
end
endmodule
测试平台代码
module testbench();
logic clk;
logic [31:0] a, b;
logic [2:0] f;
logic [31:0] y;
logic zero;
logic [31:0] y_ex;
logic [31:0] vectornum, errors;
logic [103:0] testvectors[10000:0];
alu dut(a, b, f, y, zero);
always
begin
clk = 1; #5; clk = 0; #5;
end
initial
begin
$readmemh("alu.tv", testvectors); //f,a,b, y_ex, zero
vectornum = 0; errors = 0;
end
always @(posedge clk)
begin
#1; {f, a, b, y_ex, zero} = testvectors[vectornum];
end
always @(negedge clk) begin
if (y == y_ex) begin
$display("[%d]Success: inputs: a=%h | b=%h | f=%h",vectornum, a, b, f);
$display(" outputs: y=%h | y_ex=%h | zero=%b", y, y_ex, zero);
end
else if (y !== y_ex) begin
$display("[%d]Error: inputs: a=%h | b=%h | f=%h", vectornum, a, b, f);
$display(" outputs: y=%h | y_ex=%h | zero=%b", y, y_ex, zero);
errors = errors + 1;
end
vectornum = vectornum + 1;
if (testvectors[vectornum] === 104'bx) begin
$display("%d tests completed with %d errors", vectornum, errors);
$stop;
end
end
endmodule
矢量文件
2_00000000_00000000_00000000_1
2_00000000_FFFFFFFF_FFFFFFFF_0
2_00000001_FFFFFFFF_00000000_1
2_000000FF_00000001_00000100_0
6_00000000_00000000_00000000_1
6_00000000_FFFFFFFF_00000001_0
6_00000001_00000001_00000000_1
6_00000100_00000001_000000FF_0
我做错了什么?非常感谢您的帮助。
您不能依赖 _
将每行分隔成 5 个数字。这个2_00000000_FFFFFFFF_FFFFFFFF_0
是一个的104位十六进制数。
执行{f, a, b, y_ex, zero} = testvectors[1];
时,实际上是:
hex | bin | hex | bin | hex | bin | hex | bin
2 | 000 0 | 0000000 | 111 1 | FFFFFFF | 111 1 | FFFFFFF | 000 0
| --- ----------------- ----------------- ----------------- -
| f a b y_ex zero
| 3'h0 32'h7 32'hffff_ffff 32'hffff_fff8 0
V
not used
赋值时需要指定范围:
assign tmp = testvectors[vectornum];
assign zero = tmp[...];
assign y_ex = tmp[...];
或者更改zero
/y_ex
/...的位宽声明,就像@Serge在评论中提到的那样。
还有一个问题。 testbench
中的 zero
网络由 alu
的 zero
输出和 testbench
中的 always
块驱动。
我是新手,这个问题可能看起来很愚蠢,但我已经花了几个小时在这上面,测试平台只是不想在执行算术之前将正确的值加载到寄存器中。
这是我去 运行 模拟时发生的事情
# [ 0]Success: inputs: a=00000000 | b=00000000 | f=0
# outputs: y=00000000 | y_ex=00000000 | zero=1
# [ 1]Error: inputs: a=00000007 | b=ffffffff | f=0
# outputs: y=00000007 | y_ex=fffffff8 | zero=0
# [ 2]Error: inputs: a=0000000f | b=fffffff8 | f=0
# outputs: y=00000008 | y_ex=00000000 | zero=1
# [ 3]Error: inputs: a=000007f8 | b=00000008 | f=0
# outputs: y=00000008 | y_ex=00000800 | zero=0
# [ 4]Success: inputs: a=00000000 | b=00000000 | f=0
# outputs: y=00000000 | y_ex=00000000 | zero=1
# [ 5]Error: inputs: a=00000007 | b=fffffff8 | f=0
# outputs: y=00000000 | y_ex=00000008 | zero=0
# [ 6]Error: inputs: a=00000008 | b=00000008 | f=0
# outputs: y=00000008 | y_ex=00000000 | zero=0
# [ 7]Error: inputs: a=00000800 | b=00000008 | f=0
# outputs: y=00000000 | y_ex=000007f8 | zero=1
# 8 tests completed with 6 errors
如您所见,用于指定 ALU 将执行哪种操作的 f 值总是错误的。 a 和 b 值也读错了。不过,阅读似乎还不错。我已经测试过了。
这是我的 ALU 代码
module alu(input logic [31:0] a, b,
input logic [2:0] f,
output logic [31:0] y,
output logic zero
);
always @*
begin
if (f == 3'h0) //AND
y = a & b;
else if (f == 3'h1) //OR
y = a | b;
else if (f == 3'h2) //ADD
y = a + b;
else if (f == 3'h4) //AND NOT
y = a & ~b;
else if (f == 3'h5) //OR NOT
y = a | ~b;
else if (f == 3'h6) //SUBTRACT
y = a - b;
else if (f == 3'h7) //SET LESS THEN
y =(a<b)?32'h00000001:32'h00000000;
begin
if (y == 32'h00000000)
zero = 1;
else
zero = 0;
end
end
endmodule
测试平台代码
module testbench();
logic clk;
logic [31:0] a, b;
logic [2:0] f;
logic [31:0] y;
logic zero;
logic [31:0] y_ex;
logic [31:0] vectornum, errors;
logic [103:0] testvectors[10000:0];
alu dut(a, b, f, y, zero);
always
begin
clk = 1; #5; clk = 0; #5;
end
initial
begin
$readmemh("alu.tv", testvectors); //f,a,b, y_ex, zero
vectornum = 0; errors = 0;
end
always @(posedge clk)
begin
#1; {f, a, b, y_ex, zero} = testvectors[vectornum];
end
always @(negedge clk) begin
if (y == y_ex) begin
$display("[%d]Success: inputs: a=%h | b=%h | f=%h",vectornum, a, b, f);
$display(" outputs: y=%h | y_ex=%h | zero=%b", y, y_ex, zero);
end
else if (y !== y_ex) begin
$display("[%d]Error: inputs: a=%h | b=%h | f=%h", vectornum, a, b, f);
$display(" outputs: y=%h | y_ex=%h | zero=%b", y, y_ex, zero);
errors = errors + 1;
end
vectornum = vectornum + 1;
if (testvectors[vectornum] === 104'bx) begin
$display("%d tests completed with %d errors", vectornum, errors);
$stop;
end
end
endmodule
矢量文件
2_00000000_00000000_00000000_1
2_00000000_FFFFFFFF_FFFFFFFF_0
2_00000001_FFFFFFFF_00000000_1
2_000000FF_00000001_00000100_0
6_00000000_00000000_00000000_1
6_00000000_FFFFFFFF_00000001_0
6_00000001_00000001_00000000_1
6_00000100_00000001_000000FF_0
我做错了什么?非常感谢您的帮助。
您不能依赖 _
将每行分隔成 5 个数字。这个2_00000000_FFFFFFFF_FFFFFFFF_0
是一个的104位十六进制数。
执行{f, a, b, y_ex, zero} = testvectors[1];
时,实际上是:
hex | bin | hex | bin | hex | bin | hex | bin
2 | 000 0 | 0000000 | 111 1 | FFFFFFF | 111 1 | FFFFFFF | 000 0
| --- ----------------- ----------------- ----------------- -
| f a b y_ex zero
| 3'h0 32'h7 32'hffff_ffff 32'hffff_fff8 0
V
not used
赋值时需要指定范围:
assign tmp = testvectors[vectornum];
assign zero = tmp[...];
assign y_ex = tmp[...];
或者更改zero
/y_ex
/...的位宽声明,就像@Serge在评论中提到的那样。
还有一个问题。 testbench
中的 zero
网络由 alu
的 zero
输出和 testbench
中的 always
块驱动。