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

news2024/9/23 23:27:17

上一篇介绍了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
endclass


function 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;
...
endclass

task scoreboard::main_phase(uvm_phase phase);
    fork
        while(1) begin
        exp_port.get(get_expect);
        expect_queue.push_back(get_expect);
        end
        while(1) begin
        act_port.get(get_actual);
        end
    join
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.coloradmin.cn/o/2071272.html

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

相关文章

域名泛解析是什么?如何设置?

在当今数字化的时代,网站建设和网络运营对于企业和个人来说都变得至关重要。而在这个过程中,域名的管理和配置起着关键作用。其中,域名泛解析是一个重要的概念,它可以为网站的运营和管理带来诸多便利。 一、域名泛解析是什么&…

尚品汇静态网页设计

目录 尚品汇静态网页设计 在线浏览 项目结果展示 准备 顶部导航条设计 头部设计 主导航区设计 主要内容区设计 左侧边栏区 一级菜单 二级菜单 中间内容区 右侧其他内容区 上部分快报区 下部分图标导航区 秒杀区设计 楼层区设计 顶部设计 详情区设计 页脚设…

ResNet网络学习

简介 Residual Network 简称 ResNet (残差网络) 下面是ResNet的网络结构: ResNet详细介绍 原理 传统方法的问题: 对于一个网络,如果简单地增加深度,就会导致 梯度消失 或 梯度爆炸,我们采取的解决方法是 正则化。…

充电桩系统云快充协议源码(云快充协议1.5 版本源码)

介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议,版本为云快充1.5,对于没有对接过充电桩系统的开发者尤为合适; 2、包含:启…

搭建智能客服机器人:langgraph实现用户订单管理

大家好,今天我们将创建一个智能客服机器人,它能够记录用户的食物订单到真实数据库中,并允许用户查看他们的订单。这是一个相对高级的Langgraph项目,大家可以先看一下前面介绍的Langgraph的基础课程。 项目概述 我们要构建的系统…

C程序设计——运算符1

条件运算符 这是一个三目运算符,用于条件求值(?:)。 来源:百度百科 这是C语言里,唯一三目(即三个表达式)运算符。具体格式如下: (表达式1) ? (表达式2) : (表达式3) ; 翻译成人话,就是&…

测试资料4444

一、HTML 1、HTML介绍 1.1web前端三大核心技术 HTML:负责网页架构 CS&#xff1a;负责网页的样式、美化 JS:负责网页的行为 1.2 HTML标签 单标签:<标签名 > 双标签内容 标签属性&#xff1a; 2 常用标签 script:js标签 style:css标签 link:外部加载css标签

SyntaxError: Unexpected token ‘??=‘ 解决办法

问题 原因 Node 15, 及 以上版本才能使用 ?? 操作符 我的版本&#xff1a; 解决 尝试升级node版本 参考 windows下node升级到最新版本&#xff08;亲测有效&#xff09; 有错误&#xff0c;但也创建成功了。 错误以后再改吧…

初识LLM大模型:入门级工程知识探索与解析

前言 源自脉脉上面刷到的大模型业务工程落地可以做的方向。其实如果不是接触相关工作&#xff0c;有的人可能不会想了解这方面&#xff0c;自己实习做的方向与之相关&#xff0c;因此想调研总结一下行业热点方向与基础入门知识&#xff0c;还有一些的专业词汇的解释。包括但不…

异常—python

一、异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是异常, 也就是我们常说的BUG&#xff0c;那BUG是怎么由来的呢&#xff1f; 例如&#xff1a; print(1/0) 我们在小学的时候就知道0不能作除数&a…

线段树+二分,CF 431E - Chemistry Experiment

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 431E - Chemistry Experiment 二、解题报告 1、思路分析 贪心的考虑&…

NYX靶机笔记

NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址&#xff1a;https://download.vulnhub.com/nyx/nyxvm.zip 1、nmap扫描 1&#xff09;主机发现 # -sn 只做ping扫描&#xff0c;不做端口扫描 nmap -sn 192.168.84.1/24 # 发现靶机ip为 MAC Address: 00:50:56:E0:D5:D4 (V…

文心快码(Baidu Comate)初体验

文心快码&#xff08;Baidu Comate&#xff09;初体验 1文心快码简介和安装&#xff1a;简要介绍文心快码&#xff08;Baidu Comate&#xff09;、安装方法、使用方法等&#xff1b; Baidu Comate 是由百度自主研发&#xff0c;基于文心大模型&#xff0c;结合百度丰富的编程现…

【数模修炼之旅】08 支持向量机模型 深度解析(教程+代码)

【数模修炼之旅】08 支持向量机模型 深度解析&#xff08;教程代码&#xff09; 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法&#xff0c;大家可以关注这个专栏&#xff0c;持续学习哦&#xff0c;对于大家的能力提高会有极大的帮助。 1 支持向量机模型…

C++ TinyWebServer项目总结(10. 信号)

信号是由用户、系统、进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。Linux信号可由以下条件产生&#xff1a; 对于前台进程&#xff0c;用户可通过输入特殊终端字符来给它发送信号&#xff0c;如输入CtrlC通常会给进程发送一个中断信号。系统…

学习笔记 韩顺平 零基础30天学会Java(2024.8.24)

P532 Map接口特点2 P533 Map接口方法 P534 Map六大遍历方式 方法一&#xff1a;通过KeySet()&#xff0c;取出所有的Key&#xff0c;把取出的Key放到Set中&#xff0c;再通过Key取出对应的Value 到这里又有两种方式遍历Set&#xff1a;迭代器、增强for 方法二&#xff1a;通过v…

svn使用教程学习

如何撤销未提交的本地修改&#xff1f; 点击svn提交&#xff0c;双击文件&#xff0c;可以查看准备提交的修改内容。 如何撤销已经提交的内容&#xff1f; 选择‘复原此版本做出的修改’&#xff1a; 但是&#xff0c;这个只是复原在本地了&#xff0c;我们需要提交上去&…

pycharm远程调试服务器代码提示,运行‘test’时出错,illegal char at index

pycharm远程调试服务器代码提示&#xff0c;运行‘test’时出错&#xff0c;illegal char at index &#xff0c;illegal char at index 0:4ba0d3dd-ad57-46cb-83d6-dc4e2d307520>/DETR/test.py 并不是在pycharm的右侧remote Host选择服务器上的文件&#xff0c;然后点击执行…

R6RS标准之重要特性及用法实例(三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

java计算机毕设课设—企业电子投票系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—企业电子投票系统(附源码、文章、相关截图、部署视频) 企业电子投票系统是一款高效便捷的在线投票平台包括前端普通用户和后端管理员两大模块&#xff0c;普通用户可登录投票、查看结果&#xff0c;管理员则负责后台管理&#…