Verilog 使用测试向量文件的ALU测试台不工作

Verilog 使用测试向量文件的ALU测试台不工作,verilog,hdl,modelsim,test-bench,alu,Verilog,Hdl,Modelsim,Test Bench,Alu,我是新手,这个问题可能看起来很傻,但我花了几个小时在这个问题上,测试台只是不想在执行算术之前将正确的值加载到寄存器中 下面是我运行模拟时发生的情况 # [ 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 #

我是新手,这个问题可能看起来很傻,但我花了几个小时在这个问题上,测试台只是不想在执行算术之前将正确的值加载到寄存器中

下面是我运行模拟时发生的情况

# [         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
矢量文件

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

我做错了什么?非常感谢您的帮助。

您不能依靠
\u
将每行分隔为5个数字。这个
2_00000000_FFFFFFFF_FFFFFFFF_0
1104位十六进制数

当执行
{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

中,您不能依靠
\uu
将每行分隔为5个数字。这个
2_00000000_FFFFFFFF_FFFFFFFF_0
1104位十六进制数

当执行
{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
net由
alu
zero
输出和
testbench
中的
始终
块驱动,您需要将
f[2:0]
的声明更改为
f[3:0]
,与
zero[3:0]
的声明相同。另外,开始在代码中使用正确的非阻塞分配,否则您可能会有一个时钟周期中断的风险。您需要将
f[2:0]
的声明更改为
f[3:0]
,与
zero[3:0]
的声明相同。另外,开始在代码中使用正确的非阻塞分配,否则您将面临一个时钟周期的风险。