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

相关文章

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2

如何合理使用Spring的事务方式

《如何合理使用Spring的事务方式》:本文主要介绍如何合理使用Spring的事务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、底层构造1.1.事务管理器1.2.事务定义信息1.3.事务状态1.4.联系1.2、特点1.3、原理2. Sprin

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优