SystemVerilog TestBench

测试平台(testbench)的目的是什么?

测试平台使我们能够通过仿真来验证设计的功能。 是一个放置设计并通过不同的输入激励驱动的容器。
【1】产生不同类型的输入刺激;
【2】利用生成的激励来驱动设计输入;
【3】允许设计处理输入并提供输出;
【4】检查预期行为的输出以发现功能缺陷;
【5】如果发现了功能性错误,请更改设计以修复该错误;
【6】执行以上步骤,直到不再有功能缺陷为止;

测试平台的组成

组件 描述
Generator 产生不同的输入激励以驱动至DUT
Interface 包含可以驱动或监视的设计信号
Driver 驱动生成的激励到设计
Monitor 监视设计输入输出端口以捕获设计活动
Scoreboard 检查具有预期行为的设计输出
Environment 包含上述所有验证组件
Test 包含可以使用不同配置设置进行调整的环境

在这里插入图片描述

DUT是什么?

DUT代表测试中的设计,是用Verilog或VHDL编写的硬件设计。DUT是一个术语,通常用于芯片制造后的硅验证。在预验证中,也称为验证设计,简称DUV。

// 所有验证组件都放在此顶层测试平台模块中
module tb_top;
 
  //声明需要连接到设计实例的变量;
  // 这些变量被分配了一些值,这些值又作为输入传递给设计,因为它们与设计中的端口相连;
  reg clk;        
  wire en;     
  wire wr;
  wire data;
 
  //实例化设计模块,并将上面声明的变量与设计中的端口连接
  design myDsn (
  				 .clk (clk),
                 .en  (en),
                 .wr  (wr),
                 . ...
                 .rdata);
endmodule

什么是interface?

如果设计包含数百个端口信号,则连接,维护和重新使用这些信号将很麻烦。 相反,我们可以将所有设计输入/输出端口放入一个容器中,该容器成为DUT的接口。 然后可以通过该接口以值驱动设计。

什么是driver?

驱动程序是验证组件,它通过接口中定义的任务来完成DUT的引脚摆动。 当驱动程序必须为设计驱动一些输入值时,它仅需在接口中调用此预定义任务,而无需实际知道这些信号之间的时序关系。 定时信息在界面提供的任务中定义。 这是使测试平台更加灵活和可扩展所需的抽象级别。 将来,如果接口更改,则新驱动程序可以调用相同任务并以不同方式驱动信号。

为什么需要显示器(monitor)?

到目前为止,已经讨论了如何将数据驱动到DUT。 但这只是一半,因为我们的主要目的是验证设计。 DUT处理输入数据并将结果发送到输出引脚。 监视器将拾取处理后的数据,将其转换为数据对象,然后将其发送到记分板。

scorebord的目的是什么?

记分板可以具有行为与DUT相同的参考模型。 该模型反映了DUT的预期行为。 发送到DUT的输入也将发送到该参考模型。 因此,如果DUT存在功能性问题,则DUT的输出将与参考模型的输出不匹配。 因此,比较设计和参考模型的输出将告诉我们设计中是否存在功能缺陷。 这通常在计分板上完成。

为什么需要环境(environment)?

由于可以为将来的项目将更多组件插入相同的环境,因此它使验证更加灵活和可扩展。

测试(test)做什么?

测试将实例化环境的一个对象,并按照测试所需的方式对其进行配置。 请记住,我们很可能会有成千上万的测试,并且每个测试都不能直接更改环境。 相反,我们希望环境中的某些旋钮/参数可以针对每个测试进行调整。 这样,测试将对刺激物产生有更高的控制力,并且将更加有效。

在这里,我们讨论了一个简单的测试平台的外观。 在实际的项目中,将插入许多这样的组件,以在更高的抽象级别上执行各种任务。 如果我们必须验证一个简单的数字计数器,最多包含50行RTL代码,是的,那么就足够了。 但是,当复杂性增加时,将需要处理更多的抽象。

什么是抽象级别?

在前言中,您看到我们使用单独的信号切换了设计。

#5  resetn <= 0;
#20 resetn <= 1;

相反,如果将这两个信号放在一个任务中并将其称为“ apply_reset”任务,则您刚刚创建了一个可以重用的组件,并且隐藏了发出信号的详细信息以及发出信号的时间间隔。 这是我们在开发测试平台时希望拥有的功能-隐藏细节-这样测试编写者无需费心如何使用这些任务,而只需关注何时以及为什么要使用这些任务。 最后,测试编写者使用任务,配置环境并编写代码以测试设计。

 
module tb_top;
 
  bit resetn;
 
  task apply_reset ();
    #5  resetn <= 0;
    #20 resetn <= 1;
  endtask
 
  initial begin
    apply_reset();  
  end
endmodule
 

参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-datatypes

发布了91 篇原创文章 · 获赞 7 · 访问量 5273

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104437241