RTL 与验证
测试平台(testbench)
在真正信任一个新电路设计之前,你会想把它放到工作台上,给它的输入端接上信号发生器,再用示波器盯着它的输出——向它喂入你能控制的输入,确认它做了该做的事。测试平台就是这张工作台,只不过是用代码写出来的。它是一段 HDL,包裹住你的设计——也就是被测设计(DUT)——向它的输入端施加激励,并检查从输出端返回的结果,整个过程都在仿真中完成,不涉及任何实体硬件。
测试平台最根本的特征是它不可综合:它永远不会变成芯片上的门电路。而这份自由恰恰是它的全部意义所在。你的设计只能使用硬件真正能搭建出来的结构,而测试平台却可以使用文件读写、`wait` 语句、以纳秒计的延迟、循环以及打印消息——只要能模拟外部世界、能对设计作出判断,怎么写都行。一个典型的测试平台会例化 DUT,生成时钟和复位信号,施加一串输入,然后对每个结果进行检查——把 DUT 的输出与独立算出的期望值相比较,并把任何不一致标记出来。
正是这种检查,把真正的测试平台和演示区分开来。一个只会拨动输入、却把波形留给你用肉眼去比对的平台几乎什么都抓不到;而好的平台自己就带着对"正确"的判断标准——一个参考模型、一组期望值,或是若干断言——一旦现实与之偏离,它就会高声报错。随着设计规模增大,这些平台会扩展成完整的验证环境,把自检与约束随机激励结合起来,去探索那些人工绝不会想到手动键入的边角情形。
module tb;
reg [7:0] a, b;
wire [7:0] sum;
dut u_dut (.a(a), .b(b), .sum(sum));
initial begin
a = 8'd3; b = 8'd4; #10;
if (sum !== 8'd7) $error("got %0d, expected 7", sum);
$finish;
end
endmodule一个最小的自检测试平台——先声明信号,再驱动已知输入,然后断言输出与期望值一致。
"测试平台"直接借用了实验台的比喻:在电子领域,工作台(bench)就是你探测和测量器件的那张工作桌。HDL 版本沿用了这个名字,尽管此时的工作台、探针和器件全都只是代码而已。
又称
另见