UVM(3)TLM通信

基本定义

A的方框称之为PORT,B的圆圈称之为EXPORT

要注意:无论是get还是put操作, 其发起者拥有的都是PORT端口, 而不是EXPORT

transport操作, 如 transport操作相当于一次put操作加一次get操作,  数据流先从A流向B, 再从B流向A。 

//put
uvm_blocking_put_port#(T);
uvm_nonblocking_put_port#(T);
uvm_put_port#(T);
//get
uvm_blocking_get_port#(T);
uvm_nonblocking_get_port#(T);
uvm_get_port#(T);
//peek
uvm_blocking_peek_port#(T);
uvm_nonblocking_peek_port#(T);
uvm_peek_port#(T);
//get peek
uvm_blocking_get_peek_port#(T);
uvm_nonblocking_get_peek_port#(T);
uvm_get_peek_port#(T);
//transport
uvm_blocking_transport_port#(REQ, RSP);
uvm_nonblocking_transport_port#(REQ, RSP);
uvm_transport_port#(REQ, RSP);

在这种控制流中, PORT具有高优先级, 而EXPORT具有低优先级。 只有高优先级的端口才能向低优先级的端口发起三种操作。

还有一个imp:中转站

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);

互连

class A extends uvm_component;`uvm_component_utils(A)uvm_blocking_put_port#(my_transaction) A_port;
endclassfunction void A::build_phase(uvm_phase phase);super.build_phase(phase);A_port = new("A_port", this);  //第二个参数是父节点
endfunctiontask A::main_phase(uvm_phase phase);
endtask

A中要定义端口,要在build phase中例化,不在new中。

但是不能在env层直接进行链接

function void my_env::connect_phase(uvm_phase phase);super.connect_phase(phase);A_inst.A_port.connect(B_inst.B_export);
endfunction

需要加入imp

我们需要在B例化一个imp、链接。然后在B实现put

B_export.connect(B_imp);
然后在

结构函数定义

  1. 当A_port的类型是nonblocking_put,B_imp的类型是nonblocking_put时,那么就要在B中定义一个名字为try_put的函数和一个名为can_put的函数。
  2. 当A_port的类型是put,B_imp的类型是put时,那么就要在B中定义3个接口,一个是put任务/函数,一个是try_put函数,一个是can_put函数。
  3. 当A_port的类型是blocking_get,B_imp的类型是blocking_get时,那么就要在B中定义一个名字为get的任务/函数
  4. 当A_port的类型是nonblocking_get,B_imp的类型是nonblocking_get时,那么就要在B中定义一个名字为try_get的函数和一个名为can_get的函数。
  5. 当A_port的类型是get,B_imp的类型是get时,那么就要在B中定义3个接口,一个是get任务/函数,一个是try_get函数,一个是can_get函数。
  6. 当A_port的类型是blocking_peek,B_imp的类型是blocking_peek时,那么就要在B中定义一个名字为peek的任务/函数。
  7. 当A_port的类型是nonblocking_peek,B_imp的类型是nonblocking_peek时,那么就要在B中定义一个名字为try_peek的函数和一个名为can_peek的函数。
  8. 当A_port的类型是peek,B_imp的类型是peek时,那么就要在B中定义3个接口,一个是peek任务/函数,一个是try_peek函数,一个是can_peek函数。
  9. 当A_port的类型是blocking_get_peek,B_imp的类型是blocking_get_peek时,那么就要在B中定义一个名字为get的任务/函数,一个名字为peek的任务/函数。
  10. 当A_port的类型是nonblocking_get_peek,B_imp的类型是nonblocking_get_peek时,那么就要在B中定义一个名字为try_get的函数,一个名为can_get的函数,一个名字为try_peek的函数和一个名为can_peek的函数。
  11. 当A_port的类型是get_peek,B_imp的类型是get_peek时,那么就要在B中定义6个接口,一个是get任务/函数,一个是try_get函数,一个是can_get函数,一个是peek任务/函数,一个是try_peek函数,一个是can_peek函数。
  12. 当A_port的类型是blocking_transport,B_imp的类型是blocking_transport时,那么就要在B中定义一个名字为transport的任务/函数。
  13. 当A_port的类型是nonblocking_transport,B_imp的类型是nonblocking_transport时,那么就要在B中定义一个名字为nb_transport的函数。
  14. 当A_port的类型是transport,B_imp的类型是transport时,那么就要在B中定义两个接口,一个是transport任务/函数,一个是nb_transport函数。

对于所有blocking系列的端口,可以定义函数or任务,但是nonblocking只能定义函数。

注意port和port可以连接、export和export也可以连接

不过通信的话还是要挂载imp

blocking get

get依旧是在A实现imp和export的链接,并且实现get函数,作为动作的接收者。数据的发起者。

transport

analysis port

一个analysis_port( analysis_export) 可以连接多个IMP(uvm_analysis_imp),一对多传输

不存在阻塞的概念,因为是广播。

对于analysis_port和analysis_export来说, 只有一种操作: write。


与put系列端口的PORT和EXPORT直接相连会出错的情况一样, analysis_port如果和一个analysis_export直接相连也会出错。 只有在analysis_export后面再连接一级uvm_analysis_imp, 才不会出错
 

链接

在agent中声明一个ap, 但是不实例化它, 让其指向monitor中的ap。 在env中可以直接连接agent的ap到scoreboard的imp。

这样简单又不会显得层次复杂。

class my_agent extends uvm_agent ;uvm_analysis_port #(my_transaction) ap;…function void my_agent::connect_phase(uvm_phase phase);ap = mon.ap;…endfunction
endclassfunction void my_env::connect_phase(uvm_phase phase);o_agt.ap.connect(scb.scb_imp);
endfunction

广播机制的write要实现不同的write函数,格式如下,imp_decl()声明imp端口,

使用FIFO

FIFO的本质是一块缓存加两个IMP
monitor中依然是analysis_port, FIFO中是uvm_analysis_imp, 数据流和控制流的方向相同。 在scoreboard与FIFO的连接关系中, scoreboard中使用blocking_get_port端口
等于说ap先写fifo,sb再get。

链接

实际上, FIFO中的analysis_export和blocking_get_export虽然名字中有关键字export, 但是其类型却是IMP。 UVM为了掩饰IMP的存在

所以要这样来链接。

i_agt.ap.connect(agt_mdl_fifo.analysis_export);
mdl.port.connect(agt_mdl_fifo.blocking_get_export);
。。。连两个就行了

上述是FIFO的诸多端口,export依旧是imp

注意

get任务被调用时, FIFO内部缓存中会少一个transaction

peek被调用时, FIFO会把transaction复制一份发送出去, 其内部缓存中的transaction数量并不会减少
 

put_ap:当FIFO上的blocking_put_export或者put_export被连接到一个blocking_put_port或者put_port上时, FIFO内部被定义的put任务被调用, 这个put任务把传递过来的transaction放在FIFO内部的缓存里, 同时, 把这个transaction通过put_ap使用write函数发送出去

get_ap:当FIFO的get任务被调用时, 同样会有一个transaction从get_ap上发出

除此之外, FIFO的get_export、 get_peek_export和blocking_get_peek_export被相应的PORT或者EXPORT连接时, 也能会调用FIFO的get任务

FIFO or AP

fifo在使用的时候可以for循环,ap只能一个一个链接。但是FIFO增加了env的代码复杂度
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394952.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring统一功能处理:拦截器、响应与异常的统一管理

目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑…

c语言-文件

11 文件 目录 11 文件 一、文件系统 二、文件操作方式 1、基于缓冲区文件操作 2、基于非缓冲区文件操作 三、文件操作的常用函数 1、fopen 2、fclose 3、fputc 4、fgetc 5、rewind 6、fseek 7、fputs 8、fgets 9、fwrite 10、fread 11、fprintf 12、fscanf …

【Redis】数据结构篇

文章目录 键值对数据库是怎么实现的?动态字符串SDSC 语言字符串的缺陷SDS结构设计 整数集合整数集合结构设计整数集合的升级操作 哈希表哈希表结构设计哈希冲突链式哈希Rehash渐进式rehashrehash触发条件 压缩列表压缩列表结构设计连续更新压缩列表的缺陷 quicklist…

【Material-UI】Checkbox组件:Indeterminate状态详解

文章目录 一、什么是Indeterminate状态?二、Indeterminate状态的实现1. 基本用法示例2. 代码解析3. Indeterminate状态的应用场景 三、Indeterminate状态的UI与可访问性1. 无障碍设计2. 用户体验优化 四、Indeterminate状态的最佳实践1. 状态同步2. 优化性能3. 提供…

ubuntu20.04 环境搭建教程

1: Ubuntu 版本说明 我使用版本为 ubuntu20.04 ->镜像文件网上下载最新版本 mirrors.huaweicloud.com/ubuntu-releases/20.04.6/ Ubuntu 其他说明 Ubuntu 安装的位置不建议放到 C 盘(除非你只有一个 C 盘) Ubuntu 需要 120G 的空间 2&#xff1…

vue项目前端实现将table导出成excel功能2

使用插件 xlsx、xlsx-style、file-saver 具体引入见文章:vue项目前端实现将table导出成excel功能1 方法一 exportExcelByData:将数据导出成excel,合并单元格需要另外设置 方法二 exportExcelByDom:将页面dom(el-table)导出成…

媒体资讯视频数据采集-yt-dlp-python实际使用-下载视频

对于视频二创等一些业务场景,可能要采集youtube等的相关媒体视频资源,使用[yt-dlp](https://github.com/yt-dlp/yt-dlp)是一个不错的选择,提供的命令比较丰富,场景比较全面yt-dlp 是一个用 Python 编写的命令行工具,主…

Linux部署python3.0版本——及基本操作

(一)部署环境 首先查看列表,找到python3.0的包 yum list installed|grep python 如果没有,是因为yum源的问题,可部署阿里云镜像然后下载epel包,这里的内容可参考前面的阿里云镜像部署 然后进行下载 yum…

React 用户点击某个元素后只执行一次操作

React开发中经常会遇到需求:用户点击某个元素后只执行一次特定操作。比如,用户点击按钮后弹出提示框,但希望再次点击按钮不再触发提示框。针对这种需求,可以封装一个自定义Hooks来实现只允许点击一次的功能。 import {useCallbac…

Mysql,用户名重复,无法调用问题

问题描述: 我电脑的数据库用户名是,root。 因为经常需要帮别人封装程序,所以需要在我本机跑通别人的程序。有的程序里面也涉及到数据库,用户名也是,root,但是密码与我本机的不同。 之前我会修改我用户名…

MySQL —— 表的设计

表的设计 在设计表之前,我们需要从需求中获得实体(实体就是一张张表),实体的属性就是表中的字段(列),然后确定实体与实体之间的关系,最后使用 SQL 语句去创建具体的表 在设计表的时…

Unity Console 窗口输出对齐

起因:做了个工具在console窗口罗列一些信息,基本结构是 [ 文件名 :行号 ],因为文件,行号长度不一,想要做到如下效果。 初步尝试,用以下方法: string format "{0,-10} …

python自动化笔记:配置文件.ini及yml文件

目录 一、.ini配置文件1.1、ini编写格式1.2、读取.ini配置文件的数据1.3、编辑:写入和删除(了解即可) 二、yaml文件2.1、yaml编写语法规则2.2、yaml三种数据结构2.3、yaml文件的读取和写入 一、.ini配置文件 后缀名.ini 用于存储项目全局配置…

[独家原创] CPO-RBF多特征分类预测 优化宽度+中心值+连接权值 (多输入单输出)Matlab代码

[独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 (多输入单输出)Matlab代码 目录 [独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 (多输入单输出)Matlab代码效果一览基本介绍程序设计参考资料 效果一览 基本…

java学习day016

API 1.Number 数字格式化 : # 任意数字,0-9任意单个数字 , 千分位 . 小数点 0 补位 //四位小数 DecimalFormat df new DecimalFormat("###,###.####"); System.out.println(df.format(1234567.312));//1,234,567.312 //四位小数,不够补0 df new Deci…

前缀和处理数组区间之和问题

1.什么是区间和问题 “区间和问题”通常指的是涉及计算或处理数组或数列某个子区间(即一段连续元素)的总和的类型问题。这类问题可能有多种变体和不同的复杂度,但基本思想都是在给定的区间内快速计算总和或处理与区间和相关的操作。 2.例题…

常见的框架漏洞

ThinkPHP 首先我们打开一个环境 然后进行远程命令执行代码 然后进行远程代码执行 ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]-1 在网页中输出phpinfo getshell ?sindex/think\app/invokefunction&function…

c语言基础知识

ASCII码 字符A~Z的ASCII码值从65~90 • 字符a~z的ASCII码值从97~122 • 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32 • 数字字符0~9的ASCII码值从48~57 • 换⾏ \n 的ASCII值是:10 • 在这些字符中ASCII码值从0~31这32个字符是不可打印字符,⽆法打印在…

sql实战cmseasy

环境搭建 这里我们用phpstady搭建 版本是cmseasy5.5 未授权访问 这里ip的方法获取客户端的ip 这里的意思是当你的server ip等于 客户端ip并且get传参 get(ishtml)1的情况下他会直接return 他就不会检查后面是不是admin,而他这个IP是从X_FORWARDED_FOR获取&…

Spring Boot 3.x Rest API统一异常处理最佳实践

上一篇:Spring Boot 3.x Rest API最佳实践之统一响应结构 在Spring MVC应用中,要对web表示层所抛出的异常进行捕获处理有多种方式,具体的可参考著名国外Spring技术实战网站baeldung上的相关话题。Spring Boot对Spring MVC应用中抛出的异常以…