UVM中的TLM(事务级建模)通信(2)

2024-08-25 00:12
文章标签 uvm tlm 建模 事务 通信

本文主要是介绍UVM中的TLM(事务级建模)通信(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇介绍了UVM中利用TLM进行的一对一通信:UVM中的TLM(事务级建模)通信(1)-CSDN博客,除此之外,UVM还有两种特殊的端口:analysis_portanalysis_export,用于完成一对多的通信。

1.analysis端口

        这两种端口同样也是用于传递transaction,他们与put,get的区别是:

        (1)一个analysis_port(analysis_export)可以连接多个IMP,也就是完成一对多的通信,而put、get与相应的imp之间只能实现一对一的通信;与此相比,analysis端口的功能类似于一个广播。

        (2)analysis端口不像put、get一样具有阻塞和非阻塞的概念,它本身作为广播,不必等待相连的其他端口的响应。对于analysis_port和analysis_export来说,只有一种操作:wirte。因此在analysis_imp所在的component,需要定义一个write函数(不耗时的funciton)。

        env中的连接关系为:

function void my_env::connect_phase(uvm_phase phase);super.connect(phase);A.ap.connect(B.B_imp);B.ap.connect(C.C_imp);
endfunction

2.monitor与scoreboard的连接举例

        考虑out_agent中的monitor与scoreboard之间通信,在monitor中:

class monitor extends uvm_monitor;uvm_analysis_port#(my_transaction) ap;task main_phase(uvm_phase phase);super.main_phase(phase);...ap.write(tr);endtask
endclass

在scb中:

class scoreboard extends uvm_scoreboard;uvm_analysis_imp#(my_transaction,scoreboard) scb_imp;task write(my_transaction tr);...endtask
endclass

连接方式:

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);out_agent.ap.connect(scb.scb_imp);...
endfunction

        现实情况中,scoreboard除了接受monitor的数据之外,还要接受ref model的数据,那么对应ref model这一路数据的imp也要有自己的write函数,该怎么区分呢?

        UVM给出的方法是定义了一个宏uvm_analysis_imp_decl,通过在后面声明的后缀来进行区分。当调用时,系统自然会根据后缀的不同调用对应的imp和其write函数。

class scoreboard extends uvm_scoreboard; `uvm_analysis_imp_decl(_monitor)`uvm_analysis_imp_decl(_model)uvm_analysis_imp_monitor#(my_transaction,scoreboard) monitor_imp;uvm_analysis_imp_model#(my_transaction,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

3.使用fifo的通信

        上文使用的方法对于初学者来说有些繁琐,我们还可以通过添加一个uvm_analysis_fifo的方法实现相同功能。

        fifo的本质是一块缓存加上两个imp,在加入了fifo之后数据收发的两端都可以作为port端口,这有助于scoreborad实现主动的接收。

scoreboard中的声明:

class scoreboard extends uvm_scoreboard;my transaction expect_queue[$];uvm_blocking_get_port #(my_transaction) exp_port;uvm_blocking_get_port #(my_transaction) act_port;
...
endclasstask scoreboard::main_phase(uvm_phase phase);forkwhile(1) beginexp_port.get(get_expect);expect_queue.push_back(get_expect);endwhile(1) beginact_port.get(get_actual);endjoin
endtask

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 env::connect_phase(uvm_phase phase);super.connect_phase(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.agt_port.connect(agt_scb_fifo.blocking_get_export);
endfunction

        需要注意的是fifo的两头都要连接不要遗漏,因此当声明了n个analysis fifo时,需要connect的次数就是2n。

        还有一个疑问是fifo中有IMP,为什么连接时用的是export呢?因为fifo中的analysis_export和blocking_get_export虽然关键词是export,其类型还是IMP。UVM这样的声明方法隐藏了IMP,对于初学者来说更易理解(或许吧)。

        重要的是,使用了fifo之后,不必再在component中自己手写一个write的函数,可以直接调用。而且,当ref model和monitor同时连接到scb时,我们也可以轻易地解决连接问题。

4.fifo的调试

        uvm提供了几个函数用以fifo的调试:

        used可以用来查询fifo缓存的transaction;

        is_empty可以用来判断fifo缓存是否为空;

        is_full可以用来判断fifo缓存是否已满;

        flush函数可以用来清除缓存所有数据,一般用于复位。

        此外,fifo本质上是一个component,它的new函数原型为:

function new(string name, uvm_component parent = null, int size = 1);

        前两个参数为uvm_component的new函数前两个参数,第三个参数设定fifo上限,默认为1,若设定为0,则是无上限。

这篇关于UVM中的TLM(事务级建模)通信(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104009

相关文章

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

UVM:callback机制的意义和用法

1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

OCC开发_变高箱梁全桥建模

概述     上一篇文章《OCC开发_箱梁梁体建模》中详细介绍了箱梁梁体建模的过程。但是,对于实际桥梁,截面可能存在高度、腹板厚度、顶底板厚度变化,全桥的结构中心线存在平曲线和竖曲线。针对实际情况,通过一个截面拉伸来实现全桥建模显然不可能。因此,针对变高箱梁,本文新的思路来实现全桥建模。 思路 上一篇文章通过一个截面拉伸生成几何体的方式行不通,我们可以通过不同面来形成棱柱的方式实现。具体步骤