本文对软件验证流程做一下简要介绍,并通过软件进行示例。
参考资料: 数字IC验证基础入门
1 芯片软件验证概述
验证是确保芯片设计和实现的功能与规格一致的关键步骤。它是芯片开发流程中的一部分,旨在检测和纠正设计中的错误,确保芯片在实际运行中达到预期的性能和功能。
2 DUT的实现
我们先用verilog语言实现一个简单的输入选择器,如下图所示
verilog代码如下:
// mux2to1_1.v
module mux2tol_1(A, B, SEL, F);
input A;
input B;
input SEL;
output F;
assign F = (SEL==0) ? A : B;
endmodule
2 验证方式testbench
Testbench是通过仿真代码产生预先设计好的输入激励给被测模块DUV,然后观察输出。如下图所示:
因此我们进行验证的时候需要遵循以下几个步骤:
- 建立testbench的模块
- 实例化DUV模块
- 设计测试向量
- 利用代码将测试向量输入给DUV
- 通过波形观察DUV的输出是否正确
2.1 建立testbench的模块以及实例化DUV模块
我们的testbench也是用verilog代码所形成的module,并实例化我们的DUV,如下所示
// mux2to1_1_tb.v
module mux2tol_1_tb();
reg sig_a;
reg sig_b;
reg sig_sel;
wire sig_f;
mux2tol_l abcd (
.A ( sig_a),
.B ( sig_b),
.SEL ( sig_sel),
.F ( sig_f)
);
endmodule
2.2 设计测试向量以及将测试向量输入给DUV
首先我们需要明白选择器的功能,
当sel = 0
的时候,F输出A的信号,表示我们选择了A作为输出,此时B是什么信号我们不关注。当sel = 1
的时候,F输出B的信号,表示我们选择了B作为输出,此时A是什么信号我们不关注。
// mux2to1_1_tb.v
reg sig_a;
reg sig_b;
reg sig_sel;
wire sig_f;
mux2tol_l abcd (
.A ( sig_a),
.B ( sig_b),
.SEL ( sig_sel),
.F ( sig_f)
);
// when sel = 0, F = A, A = 0/1, B = X, B do not care;
// when sel = 1, F = B, B= 0/1, A = X, A do not care
module mux2tol_1_tb();
// 需要完全覆盖所有的功能, 不能有所遗漏
initial begin
sig_sel = 1'b0;
sig_a = 1'b0;
sig_b = 1'bx;
// 延时10ns
#10;
sig_a = 1'b1;
#10;
sig_sel = 1'b1;
sig_a = 1'bx;
sig_b = 1'b0;
#10;
sig_b = 1'b1;
#10;
// 为调试方便,让仿真最后停在这边。如果上面的代码出现死循环,我们就比较容易发现。
$stop;
end
endmodule
2.3 波形观察
整个操作流程是参考后面的视频链接,我这边只是将其转为简单的文字描述,更多细节可以查看视频。数字验证零基础入门 006 案例1 组合逻辑2输入选择器 05
这部分我们所做的是在仿真工具里面查看DUV的输出是不是正常的。使用的软件是questasim-64,2020.1的版本。
-
首先将文件加载
-
编译
在底下会输出我们的编译结果。
-
开始仿真
我们选择之前创建的工程
work
目录,并选择mux2to1_1_tb
,使其作为仿真的最顶层。点击
optimize option
,选择第二个选项,表示我仿真的结果会输出所有的波形。所有配置完成之后,我们点击ok。 之后我们选择我们的testbench,然后选择所有的信号,右键
Add to -> Wave -> Selected Signals
,表明我们需要查看这些信号的波形。 -
查看波形 显示界面如下,此时我们还没有开始仿真,因此还没有任何波形输出。点击鼠标位置的
Run All
,开始仿真。
最终,我们看到的波形输出如下,当sel信号为0的时候,F的波形和A是相同的,而当sel信号为1的时候,F的波形和B是相同的。
3 总结
我们使用了一个小例子来说明了整个testbench的流程,其关键点在于我们在设计测试向量的时候,如何能够将所有的场景覆盖。整个verilog语言是不难理解的,我们可以参照C/C++的单元测试来理解,DUV是芯片设计者所提供的类,而我们验证实现自己的类,在该类中实例化整个DUV,提供输入,并检查输出的结果是否符合预期。