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

server/2024/11/13 9:39:20/

上一篇介绍了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,则是无上限。


http://www.ppmy.cn/server/105380.html

相关文章

【图文并茂】ant design pro 如何实战使用 ProFormTreeSelect

上一节 【图文并茂】ant design pro 如何统一封装好 ProFormSelect 的查询请求 这一节的内容会利用上一篇文章的内容的。 我们经常会实现一个远程数据调用的 select 框,不过有时候这个 select 是有层级的。 就像我们这个分类一样,有父分类&#xff0c…

Day03-MonoBehavior中的常用内容

🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎目标:MonoBehavior中的常用内容 ☀️实现:获取当前GameObject&a…

vscode tailwind插件无提示

说明 Tailwind CSS IntelliSense插件 版本: v0.12.7 问题: 无代码提示 解决 降版本

SpringBoot文档之测试框架的阅读笔记

Testing SpringBoot提供了组件spring-boot-test供开发者集成。 Test Scope Dependencies 组件spring-boot-test导入了对如下测试工具的依赖。 JUnit 5: The de-facto standard for unit testing Java applications.Spring Test & Spring Boot Test: Utilities and integra…

【知识分享】ubuntu22.04-ESP32环境搭建

文章目录 一、概要二、环境及工具介绍三、名词解释四、环境搭建 一、概要 手上有一块安信可的WIFI开发板,用的是乐鑫的ESP32模组。刚好最新装了双系统,貌似在Linux环境使用gcc编译器会快一些。     万事开头难,要在Linux环境下进行开发工…

数学建模国赛获奖技巧

一、团队分工合作的技巧(三角形配合) (1)队长要组织多沟通多交流; (2)建议定期开组会,互相讲授自己学习的东西,一人学习,三人收获。 二、AI辅助思路解析&am…

Oracle SQL - 合并重叠的期间

数据和目标 有如下数据存储了各组件的有效期间(此处起止日期用数字代替以便查阅),目标为将有重叠的期间合并到一起。 SQL> SELECT * FROM demo_eff_periods;COMPONENT_ITEM_ID EFFECTIVITY_DATE DISABLE_DATE ----------------- -------…

探索Python交互式编程的新境界:Python-prompt-toolkit的魔法

文章目录 探索Python交互式编程的新境界:Python-prompt-toolkit的魔法背景:为何选择Python-prompt-toolkit?Python-prompt-toolkit是什么?如何安装Python-prompt-toolkit?简单使用:Python-prompt-toolkit的…