芯片软件验证概述

本文对软件验证流程做一下简要介绍,并通过软件进行示例。

参考资料: 数字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,然后观察输出。如下图所示:

因此我们进行验证的时候需要遵循以下几个步骤:

  1. 建立testbench的模块
  2. 实例化DUV模块
  3. 设计测试向量
  4. 利用代码将测试向量输入给DUV
  5. 通过波形观察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的版本。

  1. 首先将文件加载

  2. 编译 在底下会输出我们的编译结果。

  3. 开始仿真 我们选择之前创建的工程work目录,并选择mux2to1_1_tb,使其作为仿真的最顶层。 点击optimize option,选择第二个选项,表示我仿真的结果会输出所有的波形。 所有配置完成之后,我们点击ok。 之后我们选择我们的testbench,然后选择所有的信号,右键Add to -> Wave -> Selected Signals,表明我们需要查看这些信号的波形。

  4. 查看波形 显示界面如下,此时我们还没有开始仿真,因此还没有任何波形输出。点击鼠标位置的Run All,开始仿真。

最终,我们看到的波形输出如下,当sel信号为0的时候,F的波形和A是相同的,而当sel信号为1的时候,F的波形和B是相同的。

3 总结

我们使用了一个小例子来说明了整个testbench的流程,其关键点在于我们在设计测试向量的时候,如何能够将所有的场景覆盖。整个verilog语言是不难理解的,我们可以参照C/C++的单元测试来理解,DUV是芯片设计者所提供的类,而我们验证实现自己的类,在该类中实例化整个DUV,提供输入,并检查输出的结果是否符合预期。

Tags: 芯片验证
Share: X (Twitter) Facebook LinkedIn