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

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

3天内不再提示

在UVM中component之间如何通信呢?

冬至子 来源:多读点书 作者:夕文x 2023-05-26 15:07 次阅读

在简单的测试平台里,component之间通过变量或者config_db机制通信是可行的,但是如果在复杂测试平台中依然使用这种耦合性很强的方式通信的话,就不太行了。

因此,UVM提供了TLM这样的概念。接下来将会从需求出发,逐步引入port、export、imp、analysis端口、uvm_analysis_imp_decl宏以及FIFO等。

1 典型UVM验证平台

图片

2 一对一如何通信(一般方法)

说明:这里以monitor和scoreboard之间的通信为例

  • 方法一 使用全局变量 :在monitor里对此全局变量进行赋值, 在scoreboard里监测此全局变量值的改变
    • 问题:所有模块都可以修改全局变量,合作中他人误修改可能导致致命bug
  • 方法二 A中pulic变量+B对模块A的引用 :scoreboard中使用public类型的变量,然后monitor中使用指向scoreboard的指针对该变量进行赋值
    • 问题:monitor可以修改scoreboard中所有public类型变量
  • 方法三 config机制(类似于在指定模块作用域构建了全局变量) :在base_test中实例化一个config_object,并将其指针通过config_db传递给scoreboard和monitor,然后两个模块就可以对该config_object中变量进行操作
    • 问题1:需要引入一个专门的config_object类
    • 问题2:一定要有base_test(父模块)这个第三方的参与,这样就不能保证某一个从base_test派生而来的类会不会改变这个config_object类中某些变量的值

现有机制更多通信问题

  • 通信需要考虑阻塞和非阻塞的处理方式
  • 如果scoreboard主动要求向monitor请求数据, 这样的行为方式使用systemverilog搭建会非常复杂

3 一对一如何通信(引入TLM)

3.1 新概念

  • TLM:是Transaction Level Modeling( 事务级建模) 的缩写,是将某一特定功能的一组信息封装在一起成为一个类,通过这个类(即事务)进行通信。
  • 三个端口:PORT(发起者)、EXPORT(接收者)、IMP(执行者)
  • 端口方法:put/get/transport/peek/get_peek

3.2 使用举例

说明:以blocking_put系列端口,PORT>EXPORT>IMP的连接举例说明

图片

  • A|PORT发起端口操作put :task A::main_phase中A_port.put(tr);
  • 建立A|PORT和B|EXPORT的连接 :AB的顶层模块my_env::connect_phase中:A_inst.A_port.connect(B_inst.B_export);
  • 建立B|EXPORT和B|IMP的连接 :B::connect_phase中:B_export.connect(B_imp);
  • 建立B|IMP和B中操作put的连接 :B模块定义中:uvm_blocking_put_imp#(my_transaction, B) B_imp;
  • B中操作put的实现 :function void B::put(my_transaction tr);

注意:EXPORT可以省略,即 PORT直接连接到IMP

4 一对多如何通信(引入analysis端口)

4.1 使用举例

图片

  1. A|analysis_port发起端口操作write :task A::main_phase中A_ap.write(tr);

  2. 建立A|analysis_port和(B或C)|analysis_imp,的连接 :A(B或C)的顶层模块my_env::connect_phase中

    A_inst.A_ap.connect(B_inst.B_imp);

    A_inst.A_ap.connect(C_inst.C_imp);

  3. 建立(B或C)|analysis_imp和(B或C)中操作write的连接 :(B或C)模块定义中:

    uvm_analysis_imp#(my_transaction, B) B_imp;或

    uvm_analysis_imp#(my_transaction, C) C_imp;

  4. (B或C)中操作write的实现

    function void B::write

    function void C::write

5 多IMP的模块的通信问题

5.1 问题描述

一个component(my_scoreboard)内有多个IMP时,依据前面知识,component(my_scoreboard)中只能有一个write方法,这如何处理两个imp(来自输出监视monitor 和 来自参考模型model)

5.2 解决方法

方法一:使用宏uvm_analysis_imp_decl

通过宏uvm_analysis_imp_decl,在component(my_scoreboard)中添加不同的后缀以区分两个imp的处理逻辑。具体实现如下:

  1. 通过宏uvm_analysis_imp_decl声明两个后缀_monitor和_model

    uvm_analysis_imp_decl(**_monitor**)
    uvm_analysis_imp_decl( _model )

  2. 使用带后缀的analysis_imp端口类声明两个analysis_imp端口

    uvm_analysis_imp**_monitor**#(my_transaction, my_scoreboard) monitor_imp;

    uvm_analysis_imp**_model**#(my_transaction, my_scoreboard) model_imp;

  3. 使用带后缀的write方法实现analysis_imp对信号的处理逻辑

    extern function void write**_monitor**(my_transaction tr);

    extern function void write**_model**(my_transaction tr);

  4. 宏uvm_analysis_imp_decl的特性会让 相同后缀的 analysis_imp端口 和 write函数 对应上

    function void my_scoreboard ::write_model(my_transaction tr);

    function void my_scoreboard ::write_monitor(my_transaction tr);

方法二:使用FIFO通信

将imp的实现逻辑放在FIFO中,而component(my_scoreboard)作为PORT端,主动请求get到FIFO中的数据,关键代码如下:

// my_scoreboard类中
uvm_blocking_get_port #(my_transaction) exp_port;
uvm_blocking_get_port #(my_transaction) act_port;
// task my_scoreboard::main_phase中
exp_port.get(get_expect); // 获取的数据存到get_expect中
act_port.get(get_actual); // 获取的数据存到get_actual中

// my_env类中
uvm_tlm_analysis_fifo #(my_transaction) agt_scb_fifo;
uvm_tlm_analysis_fifo #(my_transaction) agt_mdl_fifo;
uvm_tlm_analysis_fifo #(my_transaction) mdl_scb_fifo;
// function void my_env::connect_phase中
i_agt.ap.connect(agt_mdl_fifo.analysis_export);
mdl.port.connect(agt_mdl_fifo.blocking_get_export);
mdl.ap.connect(mdl_scb_fifo.analysis_export);
scb.exp_port.connect(mdl_scb_fifo.blocking_get_export);
o_agt.ap.connect(agt_scb_fifo.analysis_export);
scb.act_port.connect(agt_scb_fifo.blocking_get_export);

注意:FIFO中的analysis_export和blocking_get_export虽然名字中有关键字export, 但是其类型却是IMP

5.3 用FIFO还是用IMP

个人推荐使用FIFO,尤其是对于使用端口数组的情况。因为ap与imp直接相连不能使用for循环(write函数需要一个一个写,没法用数组),会导致代码量增加,理解困难。

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

    关注

    0

    文章

    181

    浏览量

    18965
  • TLM
    TLM
    +关注

    关注

    1

    文章

    32

    浏览量

    24676
  • IMP
    IMP
    +关注

    关注

    0

    文章

    10

    浏览量

    8317
  • FIFO存储
    +关注

    关注

    0

    文章

    102

    浏览量

    5895
收藏 人收藏

    评论

    相关推荐

    IC验证"为什么要学习UVM"

    的产品验证过程能最大程度使用前一代产品的代码。同样的一件事情有多种实现方式,这多种方式之间分别都有哪些优点和缺点,权衡利弊之下哪种是最合理的。一些OVM用法的遗留问题。可以说,
    发表于 12-01 15:09

    IC验证"一个简单的UVM验证平台"是如何搭建的(六)

    级别。验证平台中,某些信息是非常关键的,这样的信息可以设置为UVM_LOW,而有些信息可有可无,就可以设置为 UVM_HIGH,介于两者之间的就是
    发表于 12-04 15:48

    IC验证"UVM验证平台加入factory机制"(六)

    平台,因为UVM的特性几乎一 点都没有用到。像上节my_driver的实例化及drv.main_phase的显式调用,即使不使用UVM,只使用简单的SystemVerilog也可以完 成。本节将会
    发表于 12-08 12:07

    数字IC验证之“什么是UVM”“UVM的特点”“UVM提供哪些资源”(2)连载...

    。可以不改变平台代码的基础上改变平台的行为,以产生不同类型的激励。平台可以不同的验证工程之间进行移植,善于利用uvm提供的各种机制。可以使验证平台具有极强的可重用性。
    发表于 01-21 16:00

    数字IC验证之“典型的UVM平台结构”(3)连载...

    应用的过程,将uvm的组件封装起来,可以将这些封装的组件作为一个整体进行重用,进行芯片级或者是系统级验证的时候,往往会出现多个模块的验证。  此时,测试平台的结构会发生变化,图中
    发表于 01-22 15:32

    数字IC验证之“构成uvm测试平台的主要组件”(4)连载...

    的基类。验证工程师搭建验证平台的时候,每一个组件需要从相应的基类进行扩展。  来看一下uvm提供了哪些基类,以及这些基类和平台中的各个组件之间的关系。  uvm
    发表于 01-22 15:33

    数字IC验证之“搭建一个可以运行的uvm测试平台”(5)连载...

    的transaction,以及创建用于产生事物的事物发生器sequence。  uvm验证平台中穿梭各个组件之间的基本信息单元是一个被称为transaction的数据对象,也就是我们前面所说的事物
    发表于 01-26 10:05

    什么是uvmuvm的特点有哪些

    直观的印象,就是uvm验证平台,它是分层的结构。图中的每一个巨型框都代表着平台的一个构成元素。这些元素,我们称为平台组建,下面来简单的分析一下。从最底层上来看,agent 包含了driver,monitor和sequence
    发表于 02-14 06:46

    请问一下UVM的UVMsequences是什么意思啊

    UVM方法学,UVMsequences 是寿命有限的对象。UVM sequences从uvm_sequence_item基类扩展得到,
    发表于 04-11 16:43

    谈谈UVMuvm_info打印

    上有\`uvm_file和\`uvm_line的传参,它们定义如下:  `define uvm_file `__FILE__  `define uvm_line `__LINE__  
    发表于 03-17 16:41

    UVMseq.start()和default_sequence执行顺序

    和seq2谁会先启动?  // Method1: using build-in start() method of sequence  task run_phase(uvm_phase phase
    发表于 04-04 17:15

    我的第一个UVM代码——Hello world

    Ctrl-V!) 几点说明: 为了使用UVM库里的函数和宏定义,需要先import uvm_pkg和include uvm_macros。 testbench的顶层(module
    发表于 11-03 10:18

    典型的UVM Testbench架构

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

    UVM TLM的基本概念介绍

    UVM中,transaction 是一个类对象,它包含了建模两个验证组件之间通信所需的任何信息。
    的头像 发表于 05-24 09:17 1214次阅读
    <b class='flag-5'>UVM</b> TLM的基本概念介绍

    UVM学习笔记(一)

    driver应该派生自uvm_driver,而uvm_driver派生自uvm_component
    的头像 发表于 05-26 14:38 885次阅读
    <b class='flag-5'>UVM</b>学习笔记(一)