UVM实现component之间transaction级别的通信

news2024/11/29 10:37:34


        my_model是从i_agt中得到my_transaction,并把 my_transaction传递给my_scoreboard。在UVM中,通常使用TLM(Transaction Level Modeling)实现component之间transaction级别 的通信

        在UVM的transaction级别的通信 中,数据的发送有多种方式,其中一种是使用uvm_analysis_port。

(1)使用uvm_analysis_port发送数据

        在my_monitor中定义如下变量:

my_monitor.sv

uvm_analysis_port #(my_transaction) ap;/// 声明了ap

        uvm_analysis_port是一个参数化的类,其参数就是这个analysis_port需要传递的数据的类型,在例中是my_transaction。
         声明了ap后,需要在monitor的build_phase中将其实例化:

my_monitor.sv

   virtual function void build_phase(uvm_phase phase);
      super.build_phase(phase);
      if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))
         `uvm_fatal("my_monitor", "virtual interface must be set for vif!!!")
      ap = new("ap", this);///在monitor的build_phase中将其实例化
   endfunction

        在main_phase中,当收集完一个transaction后,需要将其写入ap中:

task my_monitor::main_phase(uvm_phase phase);
    my_transaction tr;
        while(1) begin
            tr = new("tr");
            collect_one_pkt(tr);
            ap.write(tr);当收集完一个transaction后,需要将其写入ap中
    end
endtask

        write是uvm_analysis_port的一个内建函数。到此,在my_monitor中需要为transaction通信准备的工作已经全部完成。

(2)使用uvm_blocking_get_port接收数据

        UVM的transaction级别通信的数据接收方式也有多种,其中一种就是使用uvm_blocking_get_port。这也是一个参数化的类,其 参数是要在其中传递的transaction的类型

        在my_model的第6行中,定义了一个端口,并在build_phase中对其进行实例化。

my_model.sv

   uvm_blocking_get_port #(my_transaction)  port;//定义端口


function void my_model::build_phase(uvm_phase phase);
   super.build_phase(phase);
   port = new("port", this);  //在build_phase中对其进行实例化
   ap = new("ap", this);
endfunction

        在 main_phase中,通过port.get任务来得到从i_agt的monitor中发出的transaction

task my_model::main_phase(uvm_phase phase);
   my_transaction tr;
   my_transaction new_tr;
   super.main_phase(phase);
   while(1) begin

      port.get(tr);//在 main_phase中,
                    //通过port.get任务来得到从i_agt的monitor中发出的transaction

      new_tr = new("new_tr");
      new_tr.my_copy(tr);
      `uvm_info("my_model", "get one transaction, copy and print it:", UVM_LOW)
      new_tr.my_print();
      ap.write(new_tr);
   end
endtask

        在my_monitor和my_model中定义并实现了各自的端口之后,通信的功能并没有实现,还需要在my_env中使用fifo将两个端口 联系在一起。在my_env中定义一个fifo,并在build_phase中将其实例化

my_env.sv

uvm_tlm_analysis_fifo #(my_transaction) agt_mdl_fifo;

   virtual function void build_phase(uvm_phase phase);
      super.build_phase(phase);
      i_agt = my_agent::type_id::create("i_agt", this);
      o_agt = my_agent::type_id::create("o_agt", this);
      i_agt.is_active = UVM_ACTIVE;
      o_agt.is_active = UVM_PASSIVE;
      mdl = my_model::type_id::create("mdl", this);

        //实例化agt_mdl_fifo
      agt_mdl_fifo = new("agt_mdl_fifo", this);


   endfunction

        fifo的类型是uvm_tlm_analysis_fifo,它本身也是一个参数化的类,其参数是存储在其中的transaction的类型,这里是 my_transaction
        之后,在connect_phase中将fifo分别与my_monitor中的analysis_port和my_model中的blocking_get_port相连

function void my_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);
endfunction

        这里引入了connect_phase。与build_phase及main_phase类似,connect_phase也是UVM内建的一个phase,它在build_phase执行 完成之后马上执行。但是与build_phase不同的是,它的执行顺序并不是从树根到树叶,而是从树叶到树根——先执行driver和 monitor的connect_phase,再执行agent的connect_phase,最后执行env的connect_phase
         为什么这里需要一个fifo呢?不能直接把my_monitor中的analysis_port和my_model中的blocking_get_port相连吗?由于 analysis_port是非阻塞性质的,ap.write函数调用完成后马上返回,不会等待数据被接收。假如当write函数调用时, blocking_get_port正在忙于其他事情,而没有准备好接收新的数据时,此时被write函数写入的my_transaction就需要一个暂存的位 置,这就是fifo。
        在如上的连接中,用到了i_agt的一个成员变量ap,它的定义与my_monitor中ap的定义完全一样:

my_agent.sv

class my_agent extends uvm_agent ;
   my_driver     drv;
   my_monitor    mon;
   
   uvm_analysis_port #(my_transaction)  ap;
   
   function new(string name, uvm_component parent);
      super.new(name, parent);
   endfunction 

        与my_monitor中的ap不同的是,不需要对my_agent中的ap进行实例化,而只需要在my_agent的connect_phase中将monitor的值 赋给它,换句话说,这相当于是一个指向my_monitor的ap的指针

my_agent.sv

function void my_agent::connect_phase(uvm_phase phase);
   super.connect_phase(phase);
   ap = mon.ap;
endfunction

        根据前面介绍的connect_phase的执行顺序,my_agent的connect_phase的执行顺序早于my_env的connect_phase的执行顺序,从 而可以保证执行到i_agt.ap.connect语句时,i_agt.ap不是一个空指针。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git介绍与安装使用

目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…

Spring AOP解析

基本概念 之前写过如何实现方法增强,见链接:一篇文章了解如何实现方法增强,实现原理即采用的是AOP,那么本篇文章就主要是为了了解Spring AOP的实现。 面向切面编程(Aspect Oriented Programming) 在软件…

Apollo新版Beta技术沙龙,震撼来袭!

在2023年12月2日,我有幸参加百度Apollo举行的技术交流活动,Apollo是一个百度公司开发的开源的自动驾驶项目,这次线下技术交流让我对自动驾驶有了深入的了解。 在活动中,来自Apollo项目的专家们对 Apollo 技术的进行介绍和演示。他…

ValueError: not enough values to unpack (expected 3, got 2)

我在使用cv2.findContours函数中遇到以上错误,经查询找到该错误原因: 在 OpenCV 4.X 中,函数 cv2.findContours()仅有两个返回值, 其语法格式为: contours, hierarchy cv2.findContours( image, mode, method) 若不…

2023版本idea插件开发踩坑记录(一)

在进行idea开发的时候,开始仿照着写第一个插件hello world的时候,运行的时候一直运行不成功。参考了很多博客都是如此 后面对官方文档读了一遍,就发现其中的原委,这个的话估计会有很多人跟我一样踩坑 具体原因是,idea插…

你知道小红书小眼睛的推送机制吗?

明明很用心地发笔记,小眼睛就是不多,是不是你看到自己笔记的小眼睛低就头痛? 首先我们要知道小眼睛是什么!推送机制是什么!搞清楚才能把这项数据提升起来。

【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类

1 项目内容及要求 本项目通过设计一个抽象向量类模板,以及一个通用的向量类模板和一个字符串类作为其派生类,以满足各种应用场景中的数据存储和处理需求。 项目内容: 抽象向量类模板。派生向量类。派生字符串类。测试及异常处理。联合测试…

Redis SDS 源码

底层数据结构的好处: 杜绝缓冲区溢出。减少修改字符串长度时所需的内存重分配次数。二进制安全。兼容部分C字符串函数。 常用命令: set key value、get key 等 应用场景:共享 session、分布式锁,计数器、限流。 1、给char*定义…

【Java Web学习笔记】4 - DOM文档对象模型

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/javascript 零、在线文档 JavaScript HTML DOM 一、HTML DOM基本介绍 1. DOM全称是Document Object Model文档对象模型 文档<---映射--->对象 2.就是把文档中的标签&#xff0c;属性&#xf…

Java集合常见问题

目录 Java集合 1.前言2.集合3.Collection接口类3.1 List接口3.1.1 ArrayList&#xff08;常用&#xff09;3.1.2 LinkedList&#xff08;常用&#xff09;3.1.3 Vector&#xff08;不常用&#xff09; 3.2 Set接口3.2.1 HashSet&#xff08;常用&#xff09;3.2.2 LinkedHash…

最高性能、最低错误率!一年沉寂,IBM王者归来

周一&#xff0c;国际商业机器公司&#xff08;IBM&#xff09;发布了首台量子计算机&#xff0c;它拥有1000多个量子比特&#xff08;相当于普通计算机中的数字比特&#xff09;。但该公司表示&#xff0c;现在它将转变思路&#xff0c;专注于提高机器的抗错能力&#xff0c;而…

Ruff智能物联网网关助力工厂数智化运营,实现产量提升5%

数字化转型是大势所趋&#xff0c;以工业互联网为代表的数实融合是发展数字经济的重要引擎&#xff0c;也是新质生产力的一大助力。工业互联网是新工业革命的重要基石&#xff0c;加快工业互联网规模化应用&#xff0c;是数字技术和实体经济深度融合的关键支撑&#xff0c;是新…

【面试HOT200】二叉树的构建二叉搜索树篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

免费SSL证书靠谱吗?

首先&#xff0c;我们需要明确一点&#xff0c;那就是免费SSL证书并非完全没有价值。它们同样能够提供基本的数据加密功能&#xff0c;确保用户的信息在传输过程中不会被第三方截获。因此&#xff0c;如果你的网站不需要处理敏感信息&#xff0c;例如个人身份信息、银行卡号等&…

地方招商策略:招商招哪些,如何选择理想的企业?

招商引资是推动地方经济发展的不二选择&#xff0c;通过吸引优质企业入驻&#xff0c;不仅可以带来直接的投资和税收&#xff0c;还可以为地方创造更多的就业机会&#xff0c;引入高端人才、先进的技术及管理经验&#xff0c;同时&#xff0c;招商引资还能够促进地方的产业升级…

深度优先搜索(DFS)LeetCode 2477. 到达首都的最少油耗

2477. 到达首都的最少油耗 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n - 1 &#xff0c;且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads &#xff0c;其中 roads[i] [ai,…

回溯总结(一)基础概念及模板

1.回溯是什么&#xff1f; 回溯&#xff0c;也叫回溯搜索法&#xff0c;搜索的一种方式。回溯搜索实际上也是一种暴力搜索&#xff08;本质是穷举&#xff09;&#xff08;对于有些问题是唯一可以解决的办法了&#xff0c;for循环是不适用的&#xff09;和别的搜索不同之处在于…

基于混沌算法的图像加密解密系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着信息技术的迅猛发展&#xff0c;图像的传输和存储已经成为现代社会中不可或缺的一部分。然而&#xff0c;随着互联网的普及和信息的快速传播&am…

Node-red的节点离线安装

Node-red节点离线安装 前言 目前越来越高的数据安全的要求&#xff0c;因此我们很多的生产类服务器是无法进行在线化部署的&#xff0c;为了解决这一问题&#xff0c;我们需要在无法连接外部网络环境的情况下&#xff0c;实现Node-red的节点的安装&#xff0c;以满足项目的需…