You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Verilog/SystemVerilog测试平台创建数组存储错误匹配的整数值

问题解决思路

1. 纯Verilog实现错误存储

Verilog本身没有动态数组,但你这个场景下总测试用例只有2048个,完全可以提前定长开数组存储错误值:

  • 定义一个足够大的定长数组存错误的Accel_Data,同时记录错误计数
  • 测试结束后遍历数组打印所有错误值即可

2. SystemVerilog更优实现方案

SystemVerilog专门为验证做了很多特性,完全可以满足你的需求,相关特性包括:

  • 动态数组/队列:不需要提前指定大小,可以随时用push_back()方法添加错误值,不需要提前预估错误数量
  • 带格式的打印函数$sformatf、$display可以更方便输出错误详情
  • 断言(Assertion)可以更简洁的做比较校验,不需要写大量if判断

修改后的可实现错误定位的测试平台代码(SystemVerilog版本,兼容绝大多数主流仿真器如VCS、Modelsim/Questasim、Xcelium)

module Binary_to_Decimal_TB();

reg [15:0] Accel_Data = 16'd0;

wire [3:0] ones;
wire [3:0] tens;
wire [3:0] hundreds;
wire [3:0] thousands;
wire negative;

wire [9:0] Decimal_Data;

integer i;
integer mismatch_cnt = 0;
// 用队列存错误的Accel_Data和对应的期望输出,自动扩容
reg [15:0] error_accel_val[$];
int error_expect_val[$];

Binary_to_Decimal BtD (
    .Accel_Data(Accel_Data), .Decimal_Data(Decimal_Data),
    .ones(ones), .tens(tens), .hundreds(hundreds), .thousands(thousands), 
    .negative(negative)
); 

initial
begin
    for (i = 0; i < 2047; i = i + 1)
    begin
        Accel_Data = i;
        #2;
        int actual_val = ones + tens*10 + hundreds*100 + thousands*1000;
        int expect_val;
        
        // 计算期望值
        if (Decimal_Data < 512) begin
            expect_val = 4 * Decimal_Data;
        end else if (Decimal_Data == 512) begin
            expect_val = 0;
        end else begin
            expect_val = 2048 - (4 * (Decimal_Data - 512));
        end
        
        // 不匹配时存储错误信息
        if (actual_val != expect_val) begin
            mismatch_cnt++;
            error_accel_val.push_back(Accel_Data);
            error_expect_val.push_back(expect_val);
            // 也可以实时打印错误,方便调试
            $display("ERROR: Accel_Data = 0x%h, 实际输出 = %0d, 期望输出 = %0d, 正负标识 = %0b", Accel_Data, actual_val, expect_val, negative);
        end
    end
    
    // 测试结束打印汇总
    $display("\n测试结束,总不匹配数量: %0d", mismatch_cnt);
    if(mismatch_cnt > 0) begin
        $display("所有错误的输入值如下:");
        foreach(error_accel_val[idx]) begin
            $display("第%0d个错误:输入Accel_Data = 0x%h,期望输出 = %0d", idx+1, error_accel_val[idx], error_expect_val[idx]);
        end
    end else begin
        $display("所有用例测试通过!");
    end
    $finish;
end
endmodule

如果你必须用纯Verilog实现,参考代码如下:

module Binary_to_Decimal_TB();

reg [15:0] Accel_Data = 16'd0;

wire [3:0] ones;
wire [3:0] tens;
wire [3:0] hundreds;
wire [3:0] thousands;
wire negative;

wire [9:0] Decimal_Data;

integer i;
integer mismatch_cnt = 0;
// 定长数组,最多存2048个错误,覆盖所有测试场景
reg [15:0] error_accel_val[0:2047];
integer error_expect_val[0:2047];

Binary_to_Decimal BtD (
    .Accel_Data(Accel_Data), .Decimal_Data(Decimal_Data),
    .ones(ones), .tens(tens), .hundreds(hundreds), .thousands(thousands), 
    .negative(negative)
); 

initial
begin
    for (i = 0; i < 2047; i = i + 1)
    begin
        Accel_Data = i;
        #2;
        integer actual_val = ones + tens*10 + hundreds*100 + thousands*1000;
        integer expect_val;
        
        if (Decimal_Data < 512) begin
            expect_val = 4 * Decimal_Data;
        end else if (Decimal_Data == 512) begin
            expect_val = 0;
        end else begin
            expect_val = 2048 - (4 * (Decimal_Data - 512));
        end
        
        if (actual_val != expect_val) begin
            error_accel_val[mismatch_cnt] = Accel_Data;
            error_expect_val[mismatch_cnt] = expect_val;
            mismatch_cnt = mismatch_cnt + 1;
            $display("ERROR: Accel_Data = 0x%h, 实际输出 = %0d, 期望输出 = %0d, 正负标识 = %0b", Accel_Data, actual_val, expect_val, negative);
        end
    end
    
    $display("\n测试结束,总不匹配数量: %0d", mismatch_cnt);
    if(mismatch_cnt > 0) begin
        $display("所有错误的输入值如下:");
        for(i = 0; i < mismatch_cnt; i = i +1) begin
            $display("第%0d个错误:输入Accel_Data = 0x%h,期望输出 = %0d", i+1, error_accel_val[i], error_expect_val[i]);
        end
    end else begin
        $display("所有用例测试通过!");
    end
    $finish;
end
endmodule

内容的提问来源于stack exchange,提问作者turkishjedi21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:39:02