如何在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
相关产品推荐
相关产品推荐

