当前位置: 首页 > news >正文

【UVM】TLM通信机制

基本概念

TLM(transaction level modeling)是一个基于事务(transaction)的通信方式,每次传输一个transaction,一个transaction就是把具有某一特定功能的一组信息封装在一起而成为的一个类。

通信对象

  • 发起者:数据的请求方,也就是initiator
  • 响应者:数据的响应方,也就是target
  • 注:发起者和响应者不代表数据的流向性。initiator:永远有主动权,不论时请求数据还是主动发送数据,永远是发起的那一方;target:永远时被动的,只能被动的接收数据,或者被通知需要发送数据;

传输方式

put操作

单向传输,通信动作发起者A把一个transaction发送给B,数据流从A流向B

get操作

单向传输,通信动作发起者A向B索取一个transaction,数据流从B流向A

transport操作

双向传输,又称做request-response操。相当于一次put操作加一次get操作,这两次操作的“发起者”都是A,目标都是B,数据从A流到B,再从B流向A。

通信端口

端口定义

  • port端口:initiator的端口,有阻塞赋值和非阻塞赋值的区分
  • export端口:initiator和target的中转端口,有阻塞赋值和非阻塞赋值的区分
  • imp端口:target端口,有阻塞赋值和非阻塞赋值的区分
  • 注意:
    • 端口优先级:port > export > imp
    • 在connect_phase中使用connect()建立连接关系时,只有优先级高的才能调用connect()做连接(即port可以连接port、export或者imp;export可以连接export或者imp;imp只能作为数据传送的重点,无法扩展连接)
    • 在UVM中,只有IMP才能作为连接关系的终点

UVM常见端口

PORT端口
//blocking阻塞;nonblocking非阻塞;不含这两者表示既可以阻塞也可以非阻塞 uvm_blocking_put_port#(T); uvm_nonblocking_put_port#(T); uvm_put_port#(T); uvm_blocking_get_port#(T); uvm_nonblocking_get_port#(T); uvm_get_port#(T); uvm_blocking_peek_port#(T); uvm_nonblocking_peek_port#(T); uvm_peek_port#(T); uvm_blocking_get_peek_port#(T); uvm_nonblocking_get_peek_port#(T); uvm_get_peek_port#(T); uvm_blocking_transport_port#(REQ, RSP); uvm_nonblocking_transport_port#(REQ, RSP); uvm_transport_port#(REQ, RSP);
EXPORT端口
uvm_blocking_put_export#(T); uvm_nonblocking_put_export#(T); uvm_put_export#(T); uvm_blocking_get_export#(T); uvm_nonblocking_get_export#(T); uvm_get_export#(T); uvm_blocking_peek_export#(T); uvm_nonblocking_peek_export#(T); uvm_peek_export#(T); uvm_blocking_get_peek_export#(T); uvm_nonblocking_get_peek_export#(T); uvm_get_peek_export#(T); uvm_blocking_transport_export#(REQ, RSP); uvm_nonblocking_transport_export#(REQ, RSP); uvm_transport_export#(REQ, RSP);
IMP端口
//IMP定义中的blocking、nonblocking、put、get、peek、get_peek、transport等关键字的意思并不是它们发起做相应类型的操作,而只意味着它们可以和相应类型的PORT或者EXPORT进行通信 //每一个IMP需要和一个component相对应 uvm_blocking_put_imp#(T, IMP); uvm_nonblocking_put_imp#(T, IMP); uvm_put_imp#(T, IMP); uvm_blocking_get_imp#(T, IMP); uvm_nonblocking_get_imp#(T, IMP); uvm_get_imp#(T, IMP); uvm_blocking_peek_imp#(T, IMP); uvm_nonblocking_peek_imp#(T, IMP); uvm_peek_imp#(T, IMP); uvm_blocking_get_peek_imp#(T, IMP); uvm_nonblocking_get_peek_imp#(T, IMP); uvm_get_peek_imp#(T, IMP); uvm_blocking_transport_imp#(REQ, RSP, IMP); uvm_nonblocking_transport_imp#(REQ, RSP, IMP); uvm_transport_imp#(REQ, RSP, IMP);

通信方式

一对一通信(port-export-imp)

基本概念

类型

  • port-imp互联
  • export-imp互联
  • port-port互联,PORT与PORT之间的连接可以有无限多层。
  • export-export互联,EXPORT与EXPORT之间的连接可以有无限多层

端口互联对应关系

发起者(port/export/transport)类型imp中对应的任务/函数
blocking_putput
nonblocking_puttry_put和can_put
putput、try_put和can_put
blocking_getget
nonblocking_gettry_get和can_get
getget、try_get和can_get
blocking_peekpeek
nonblocking_peektry_peek和can_peek
peekpeek、try_peek和can_peek
blocking_get_peekget和peek
nonblocking_get_peektry_get和can_get、try_peek和can_peek
get_peekget和peek、try_get和can_get、try_peek和can_peek
blocking_transporttransport
nonblocking_transportnb_transport
transporttransport和nb_transport

注:对于blocking的端口,可以定义相应的任务或函数;对于nonblocking端口,只能定义函数

一对多通信(analysis_port/analysis_export/analysis_imp)

基本概念

  • 一个analysis_port(analysis_export)可以连接多个analysis_imp
  • 对于analysis_port和analysis_export来说,没有阻塞和非阻塞的概念
  • analysis_port如果和analysis_export直接相连也会出错,只有在analysis_export后面再连接一级uvm_analysis_imp,才不会出错

端口互联对应关系

analysis_port和analysis_export类型analysis_imp对应函数
*write

注:对于同一个component下需要用到多个uvm_analysis_imp的场景,解决方式可通过定义宏`uvm_analysis_imp_decl(_xxx),声明多个后缀不一样的imp,UVM会根据后缀内建不同的imp。

//my_scoreboard.sv `uvm_analysis_imp_decl(_monitor) `uvm_analysis_imp_decl(_model) class my_scoreboard extends uvm_scoreboard; my_transaction expect_queue[$]; uvm_analysis_imp_monitor#(my_transaction, my_scoreboard) monitor_imp; uvm_analysis_imp_model#(my_transaction, my_scoreboard) model_imp; ... extern function void write_monitor(my_transaction tr); extern function void write_model(my_transaction tr); extern virtual task main_phase(uvm_phase phase); endclass function void my_scoreboard::write_model(my_transaction tr); expect_queue.push_back(tr); endfunction function void my_scoreboard::write_monitor(my_transaction tr); my_transaction tmp_tran; bit result; if(expect_queue.size() > 0) begin ... end endfunction

FIFO通信

基本概念

  • uvm_analysis_fifo,本质是一块缓存加两个imp

类型

端口类型区别

uvm_tlm_fifo

无以下
uvm_tlm_analysis_fifo

有一个analysis_export端口,及其配套的write函数

FIFO端口

  • FIFO中端口有关键字export,但是其类型却是IMP。如analysis_export的原型如下:
    uvm_analysis_imp #(T, uvm_tlm_analysis_fifo #(T)) analysis_export;
  • FIFO中的get端口,get任务被调用时,FIFO内部缓存中会少一个transaction
  • FIFO中的peek端口,peek任务被调用时,FIFO会把transaction复制一份发送出去,其内部缓存中的transaction数量并不会减少
  • 当FIFO中的put端口被连接时,FIFO内部被定义的put任务被调用,它把传递过来的transaction放在FIFO内部的缓存里,同时,把这个transaction通过put_ap使用write函数发送出去
    virtual task put( input T t ); m.put( t ); put_ap.write( t ); endtask
  • 与put_ap相似,当FIFO的get任务被调用时,同样会有一个transaction从get_ap上发出
    virtual task get( output T t ); m_pending_blocked_gets++; m.get( t ); m_pending_blocked_gets--; get_ap.write( t ); endtask

FIFO调试函数

函数作用
used查询FIFO缓存中有多少transaction
is_empty判断当前FIFO缓存是否为空
is_full判断当前FIFO缓存是否为满
flush清空FIFO缓存中的所有数据,它一般用于复位等操作
//FIFO的new函数原型 function new(string name, uvm_component parent = null, int size = 1); //第三个参数size,用于设定FIFO缓存的上限,默认的情况下为1。若要把缓存设置为无限大小,将传入的size参数设置为0即可。通过size函数可以返回这个上限值。

FIFO与IMP对比

  • FIFO对于初学者,使用方式比IMP简洁易上手

  • FIFO连接的方式增加了env中代码的复杂度

  • 对于使用端口数组的情况,FIFO要优于IMP

http://www.jsqmd.com/news/1242266/

相关文章:

  • 上海拒执罪刑事律师事务所推荐:刑民交叉案件的选型参考 - 品牌深度评测
  • 029、YOLOv8改进实战:CA坐标注意力机制原理与C2f_CA模块代码实现
  • 3个实用技巧:让Sandboxie在Windows 11 24H2上重获新生
  • 速度最快的网线已经来了,为什么大多数家庭依然不用它
  • 开勒环境江苏分部:深耕江苏,以本地化服务驱动工业通风变革 - 速递信息
  • TI处理器GPIO寄存器级编程与NAND Flash 4位ECC机制深度解析
  • VirtualBox下Ubuntu SDK跨平台开发环境搭建指南
  • TI-RTOS 2.16在CC32xx无线MCU开发中的核心应用与实战指南
  • 惠州哪里陈皮正宗?古法生晒与自然陈化优劣分析
  • 升级车灯时,推荐哪些价位的产品和品牌? - 速递信息
  • 北京精雕SurfMill曲面造型技术指南:曲面裁剪核心技巧与支架模型建模实战 - 橡果教育Acorn
  • 卓旭科技全品牌OEM贴牌服务选购指南:实力解析与靠谱吗? - 企业数据分析
  • 从665552条记录解读2024年中国行政区划数据:技术架构与深度应用指南
  • AI搜索不是选模型,而是选架构!资深搜索架构师首曝内部选型checklist(含法律合规、多模态扩展、审计追踪3大隐性门槛)
  • 【UE5】在材质Custom写函数的方法:结构体封装法 泡芙注入法
  • 东莞松山湖回收卡地亚首饰,拒绝虚高报价到店恶意压价 - 融媒生活
  • Windows系统文件dxtrans.dll丢失找不到问题解决
  • MongoDB 4.x——SpringBoot框架整合
  • 嵌入式系统PRCM模块详解:电源、时钟与复位管理实战指南
  • RabbitMQ重复消费问题
  • 2026上门探店实测:黄金跨区免费上门回收真实体验 - 资讯洞察员
  • 省钱才是硬道理!2026一物一码公司测评:快消企业精益降本选型榜单 - 品牌优企推荐
  • 2026 开封宋城文武学校官方报名热线 - Luckyone王
  • 2026实用指南:广东专业的精密cnc加工工厂有哪些? - 变量人生001
  • 建筑木模板怎么选才不踩坑?从质量、周转率到采购成本,一文看清广西工厂的真实交付标准 - 中国品牌价值观察网
  • 028、YOLOv8改进实战:ECA高效通道注意力机制原理与C2f_ECA模块代码实现
  • 2026年软考难度排行榜!小白千万别盲目选科目
  • 武汉助产学校2026年秋季招生咨询入口 - 武汉中职最新信息发布
  • 2026 济南奢侈品回收靠谱门店盘点|双资质备案,透明收费不踩雷 - 全国二奢机构参考
  • LinuxDocker(学习笔记清晰简洁版)