0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DUT 和 testbench 连接教程

jf_78858299 来源:芯片验证工程师 作者:验证哥布林 2023-03-21 11:20 次阅读

我们知道,不论是哪一级的验证,最终都是通过 pin 连接到 DUT 上向其施加激励,对于 UVM 验证平台中,使用虚接口来实现 DUT 和验证平台的通信

为了简化模块之间的连接和实现类和模块之间的通信,以实现测试平台的可重用性, SV 定义了接口的语法结构。总体来说,接口就是在 testbench 这边定义了访问的 DUT 的管脚的集合,通过对接口中管脚信号的操作,来实现对 DUT 的管脚的操作, 这样能够实现验证平台和待测模块的分离。

验证工程师和设计工程师只要定义好接口关系,就可以分别开展工作。 同时如果设计管脚发生变化,无需改变 testbench 这边的虚接口,只需要在例化待测模块时,给接口绑定对应的待测接口即可。

Testbench 和 DUT 是通过接口进行数据交互的。接口仅仅是信号的一个集合,因此我们可以将 X_MAC 的所有信号定义为一个统一的接口,也可以将一个信号定义一个接口,这样对于 X_MAC 模块,就会有许许多多的接口。另外要注意的是,一个接口要对应一个 driver,因此,接口过多的话,就需要定义很多个 driver。

同样的,如果接口数量过少的话,就只需要定义较少的 driver。接口数量过多或过少,都不利于后期验证工作的开展。为了方面后续的工作,接口的个数合适为宜,总的原则是:

**1. 将相互关系紧密的信号放到同一个接口中。

****2. 要将同一个时钟周期的信号放到同一个接口中。

****3. 将和同一个模块连接的信号要放到同一个接口中。

**上面的三点基本上表达的是同一个意思, 这样有利于后期方便激励。

在接口的定义中需要注意的一个问题是:对于同一个信号,其方向(input/output)对于 DUT 和对于 testbench 来说是相反的, 在接口中需要定义信号的方向是针对 testbench 的方向, 这一点需要注意。

下面是一个接口示例。

interface hello_if(input logic rxc,input logic txc);
logic [7:0] rxd_1;
logic [7:0] rxd_2;
logic rx_dv;
logic [7:0] txd;
logic tx_en;
//from model to DUT
clocking drv_cb @(posedge rxc);
output #1 rxd_1,rxd_2,rx_dv;
endclocking
clocking mon_cb @(posedge txc);
input #1 txd,tx_en;
endclocking
endinterface

首先,我们需要在 tb_top 模块中例化接口和待测 DUT,在例化 DUT 的时候,将 DUT 的接口和接口中定义的管脚绑定即可。如下图所示:

module hello_tb_top;
import uvm_pkg::*;
import hello_pkg::*;
reg clk;
hello_if my_hello_if(clk,clk);//实例化接口
dut my_dut(.clk(clk),
.rxd_1(my_hello_if.rxd_1),
.rxd_2(my_hello_if.rxd_2),
.rx_dv(my_hello_if.rx_dv),
.txd(my_hello_if.txd),
.tx_en(my_hello_if.tx_en)
);//实例化 DUT,并将 DUT 的输入输出端口和 my_hello_if 连接在一起


initial begin//产生 DUT 需要的时钟
  clk = 0;
  forever begin
    #10;clk = ~clk;
  end
end
//assign physical interface to virtual interface
initial begin//通过 config_db 的 set 方式将 my_if 通知 driver 和 monitor
//从而 Driver 和 monitor 可以直接和 DUT 通信。
uvm_config_db#(virtual hello_if)::set(null,"uvm_test_top.env.input_agt.drv","hello_if",my_hello_if);
uvm_config_db#(virtual hello_if)::set(null,"uvm_test_top.env.output_agt.mon","hello_if",my_hello_if);
run_test();//启动 UVM
end
endmodule

在例化 dut 时,我们将 dut 的管脚和虚接口的管脚绑定在一起。这样,我们在 testbench 中对虚接口进行操作,也就对 DUT 的管脚进行了操作。在 testbench 中只有 driver 和 monitor 会对 DUT 进行激励的加载和监听,那么在 driver 和 monitor 那里如何访问到这里的接口?

首先我们看到上面的代码中有如下的语句

uvm_config_db#(virtual hello_if)::set(null,"uvm_test_top.env.input_agt.drv","hello_if",my_hello_if);
uvm_config_db#(virtual hello_if)::set(null,"uvm_test_top.env.output_agt.mon","hello_if",my_hello_if);

我们在 uvm_top 模块中,通过 uvm_config_db 的 set 语句将定义在 driver 中的虚接口和 uvm_top 模块中的接口连接起来。在 driver 中首先需要定义一个虚接口:

virtual hello_if vif;

这里的虚接口的意思是,这个接口在 driver 这里是不存在的,这里只是一个句柄,通过虚接口, testbench 能访问到 uvm_top 中定义的实体接口,从而访问到DUT。随后在 driver 中通过 uvm_config_db 的 get 操作将 driver 中的虚接口和uvm_top 中的实体接口连接起来。

if(!uvm_config_db#(virtual hello_if)::get(this,"","hello_if", vif))
`uvm_fatal("hello_driver","Error in Geting interface");

这样, driver 通过虚接口实现了对 DUT 的操作。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UVM
    UVM
    +关注

    关注

    0

    文章

    182

    浏览量

    19189
  • PIN
    PIN
    +关注

    关注

    1

    文章

    305

    浏览量

    24338
  • DUT
    DUT
    +关注

    关注

    0

    文章

    189

    浏览量

    12419
收藏 人收藏

    评论

    相关推荐

    第一次写Testbench文件,不知道哪里错了,请大侠指点。

    Testbench代码:module fulladd4_tb;reg [3:0] a,b;reg cin;wire [3:0] sum;wire cout;fulladd4_dut (.sum(sum
    发表于 04-04 19:00

    testbench设置的问题

    本帖最后由 平漂流 于 2017-5-21 11:09 编辑 如图,看Verilog仿真视频教程里面,在testbench设置时候,直接复制“blocking_vlg_tst”到top
    发表于 05-21 11:04

    请问怎么测量DUT的S参数?

    论文和应用笔记。但是没有详细描述如何进行后校准计算。他们只提到了所需的标准。 TRL =通过反射线。直通:我已经连接了没有DUT的波导并测量了S参数(S11,S12,S21,S22)反射:将一个短路板
    发表于 08-19 13:24

    LFSR testbench V1.2

    LFSR testbench The LFSR testbench can help you understand the LFSR basics: 1. Change
    发表于 05-14 11:18 50次下载

    Writing Testbench

    Writing Testbench:The Quebec Bridge Company was formed in 1887 and for the nextthirteen years, very
    发表于 07-10 17:30 0次下载
    Writing <b class='flag-5'>Testbench</b>

    编写高效率的testbench

    编写高效率的testbench,学习编写测试文件的小伙伴们。
    发表于 05-11 16:40 16次下载

    testbench_book

    verilog Testbench
    发表于 12-13 22:20 3次下载

    testbench怎么写_testbench经典教程VHDL

     testbench是一种验证的手段。首先,任何设计都是会有输入输出的。但是在软环境中没有激励输入,也不会对你设计的输出正确性进行评估。那么此时便有一种,模拟实际环境的输入激励和输出校验的一种“虚拟
    发表于 12-01 17:22 5.6w次阅读
    <b class='flag-5'>testbench</b>怎么写_<b class='flag-5'>testbench</b>经典教程VHDL

    简单的Testbench设计

    testbench是一种验证的手段。首先,任何设计都是会有输入输出的。但是在软环境中没有激励输入,也不会对你设计的输出正确性进行评估。那么此时便有一种,模拟实际环境的输入激励和输出校验的一种“虚拟
    的头像 发表于 03-08 14:35 2500次阅读

    DUT输入定向或随机的激励

    TestBench即测试平台,是为了检验待测设计(design under test,DUT)而搭建的验证环境。
    的头像 发表于 02-24 17:19 993次阅读
    对<b class='flag-5'>DUT</b>输入定向或随机的激励

    UVM验证平台顶层有什么作用

    因为DUT是一个静态的内容,所以testbench理应也是静态的,其作为uvm验证环境和DUT的全局根结点。
    的头像 发表于 03-21 11:33 1317次阅读

    典型的UVM Testbench架构

    UVM类库提供了通用的代码功能,如component hierarchy、transaction level model(TLM),configuration database等等,使用户能够创建任何类型的Testbench架构。
    的头像 发表于 05-22 10:14 2144次阅读
    典型的UVM <b class='flag-5'>Testbench</b>架构

    芯片验证需要围绕DUT做什么?

    TestBench即测试平台,是为了检验待测设计(design under test,DUT)而搭建的验证环境。
    的头像 发表于 06-12 17:38 2243次阅读
    芯片验证需要围绕<b class='flag-5'>DUT</b>做什么?

    testbench是什么? testbench测试的机制是什么?

    废话不多说直接上干货,testbench就是对写的FPGA文件进行测试的文件,可以是verilog也可以是VHDL。
    的头像 发表于 06-28 16:44 4897次阅读
    <b class='flag-5'>testbench</b>是什么? <b class='flag-5'>testbench</b>测试的机制是什么?

    编写高效Testbench的指南和示例

    Testbench是验证HDL设计的主要手段,本文提供了布局和构建高效Testbench的指南以及示例。另外,本文还提供了一种示例,可以为任何设计开发自检Testbench
    的头像 发表于 10-29 16:14 305次阅读
    编写高效<b class='flag-5'>Testbench</b>的指南和示例