UVM:UVM的树形结构

news2024/11/26 18:53:57

        UVM采用树形的组织结构来管理验证平台的各个部分。sequencer、driver、monitor、agent、model、 scoreboard、env等都是树的一个结点。为什么要用树的形式来组织呢?因为作为一个验证平台,它必须能够掌握自己治下的所 有“人口”,只有这样做了,才利于管理大家统一步伐做事情,而不会漏掉谁。树形结构是实现这种管理的一种比较简单的方式。

(1)uvm_component中的parent参数

        UVM通过uvm_component来实现树形结构。所有的UVM树的结点本质上都是一个uvm_component。每个uvm_component都有 一个特点:它们在new的时候,需要指定一个类型为uvm_component、名字是parent的变量

function new(string name, uvm_component parent);

        一般在使用时,parent通常都是this。假设A和B均派生自uvm_component,在A中实例化一个B:

class B extends uvm_component;
    …
endclass

class A extends uvm_component;
    B b_inst;
    virtual function void build_phase(uvm_phase phase);
        b_inst = new("b_inst", this);
    endfunction
endclass

        在b_inst实例化的时候,把this指针传递给了它,代表A是b_inst的parent。为什么要指定这么一个parent呢?一种常见的观点 是,b_inst是A的成员变量,自然而然的,A就是b_inst的parent了,无需再在调用new函数的时候指定,即b_inst在实例化时可以这 样写:

b_inst = new("b_inst");

        这种写法看似可行,其实忽略了一点,b_inst是A的成员变量,那么在SystemVerilog仿真器一级,这种关系是确定的、可知 的。假定有下面的类:

class C extends uvm_component;
    A a_inst;
    function void test();
        …
    a_inst.b_inst =
        …;
    a_inst.d_inst =
        …;
        …
    endfunction
endclass

        可以在C类的test函数中使用a_inst.b_inst来得到B的值或者给B赋值,但是不能用a_inst.d_inst来给D赋值。因为D根本就不存在 于A里面。SystemVerilog仿真器会检测这种成员变量的从属关系,但是关键问题是它即使检测到了后也不会告诉A:你有一个成员 变量b_inst,没有一个成员变量d_inst。A是属于用户写出来的代码,仿真器只负责检查这些代码的合理性,它不会主动发消息给代 码,所以A根本就没有办法知道自己有这么一个孩子。
        换个角度来说,如果在test中想得到A中所有孩子的指针,应该怎么办?读者可能会说,因为A是自己写出的,它就只有一个 孩子,并且孩子的名字叫b_inst,所以可以直接使用a_inst.b_inst就可以了。问题是,假设要把整棵UVM树遍历一下,即要找到每个结点及结点的孩子的指针,那如何写呢?似乎根本就没有办法实现。
        解决这个问题的方法是,当b_inst实例化的时候,指定一个parent的变量,同时在每一个component的内部维护一个数组 m_children,当b_inst实例化时,就把b_inst的指针加入到A的m_children数组中。只有这样才能让A知道b_inst是自己的孩子,同时也 才能让b_inst知道A是自己的父母。当b_inst有了自己的孩子时,即在b_inst的m_children中加入孩子的指针。

(2)UVM树的根

        UVM是以树的形式组织在一起的,作为一棵树来说,其树根在哪里?其树叶又是哪些呢?从第2章的例子来看,似乎树根应 该就是uvm_test。在测试用例里实例化env,在env里实例化scoreboard、reference model、agent、在agent里面实例化sequencer、 driver和monitor。scoreboard、reference model、sequencer、driver和monitor都是树的叶子,树到此为止,没有更多的叶子了。
        关于叶子的判断是正确的,但是关于树根的推断是错误的。UVM中真正的树根是一个称为uvm_top的东西,完整的UVM树如下 图所示。

        uvm_top是一个全局变量,它是uvm_root的一个实例(而且也是唯一的一个实例 ,它的实现方式非常巧妙),而uvm_root 派生自uvm_component,所以uvm_top本质上是一个uvm_component,它是树的根uvm_test_top的parent是uvm_top,而uvm_top的 parent则是null。UVM为什么不以uvm_test派生出来的测试用例(即uvm_test_top)作为树根,而是搞了这么一个奇怪的东西作为树 根呢?
        在之前的例子中,所有的component在实例化时将this指针传递给parent参数,如my_env在base_test中的实例化:

env = my_env::type_id::create("env", this);

但是,假如不按照上面的写法,向parent参数传递一个null会如何呢?

env = my_env::type_id::create("env", null);

        如果一个component在实例化时,其parent被设置为null,那么这个component的parent将会被系统设置为系统中唯一的uvm_root的实例uvm_top,如下图所示。

        uvm_root的存在可以保证整个验证平台中只有一棵树,所有结点都是uvm_top的子结点。
        在验证平台中,有时候需要得到uvm_top,由于uvm_top是一个全局变量,可以直接使用uvm_top。除此之外,还可以使用如 下的方式得到它的指针:

uvm_root top;
top=uvm_root::get();

(3)层次结构相关函数

        UVM提供了一系列的接口函数用于访问UVM树中的结点。这其中最主要的是以下几个

(3.1)get_parent函数

        get_parent函数,用于得到当前实例的parent,其函数原型为:

extern virtual function uvm_component get_parent ();

(3.2)get_child函数

        与get_parent相对的就是get_child函数:

extern function uvm_component get_child (string name);

        与get_parent不同的是,get_child需要一个string类型的参数name,表示此child实例在实例化时指定的名字。因为一个component 只有一个parent,所以get_parent不需要指定参数;而可能有多个child,所以必须指定name参数

(3.3)get_children函数

        为了得到所有的child,可以使用get_children函数

extern function void get_children(ref uvm_component children[$]);

        它的使用方式为:

uvm_component array[$];
my_comp.get_children(array);
foreach(array[i])
do_something(array[i]);

(3.4)get_first_child和get_next_child

        除了一次性得到所有的child外,还可以使用get_first_child和get_next_child的组合依次得到所有的child:

string name;
uvm_component child;
if (comp.get_first_child(name))
do begin
    child = comp.get_child(name);
    child.print();
end while (comp.get_next_child(name));

        这两个函数的使用依赖于一个string类型的name。在这两个函数的原型中,name是作为ref类型传递的:

extern function int get_first_child (ref string name);
extern function int get_next_child (ref string name);

        name只是用于get_first_child和get_next_child之间及不同次调用get_next_child时互相之间传递信息。无需为name赋任何初始 值,也没有必要在使用这两个函数过程中对其做任何赋值操作

(3.5)get_num_children函数

        get_num_children函数用于返回当前component所拥有的child的数量

extern function int get_num_children ();


 

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

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

相关文章

温度而知新,一文读懂Java知识文集精华版。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

SL1581降压恒压 耐压4V-30V降压5V 2A电流 外围简单,四个元器件

SL1581是一款专为降压恒压应用而设计的芯片,具有耐压4V-30V、降压5V、2A电流输出等特点,外围电路简单,仅需四个元器件。 一、芯片介绍 SL1581是一款专为降压恒压应用而设计的芯片,它采用先进的PWM控制技术,具有高效率、…

Google 发布最强大模型Gemini,能力与GPT-4相当

一、Gemini 介绍 Gemini 是一个多模式模型系列,在图像、音频、视频和文本领域展示了真正强大的功能。其中功能最强大的模型 Gemini Ultra 在 32 个基准测试中的 30 个中提升了最先进水平,其中包括 12 个流行文本和推理基准测试中的 10 个、9 个图像理解…

情感分析简化:使用python中的TextBlob库轻松分析文本情感

导语:在当今社交媒体和大数据时代,了解人们对于产品、服务或事件的情感倾向变得至关重要。TextBlob库作为一个简单易用的自然语言处理工具,提供了强大的情感分析功能,帮助我们更深入地理解文本背后的情感。本文将介绍TextBlob库的…

Python3+RIDE+RobotFramework自动化测试框架搭建过程详解

一、Python安装 最新版Python下载地址:https://www.python.org/ 根据操作系统选择对应版本制品下载安装即可,本机用的是Windows x86-64 executable installer。 注意事项: 安装完成后检查下环境变量,默认会配置好,可…

HarmonyOS开发(十):通知和提醒

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。 通知使用的的常见场景: 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

2024黑龙江省职业院校技能大赛信息安全管理与评估赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ032信息安全管理与评估”赛项规程 极安云科专注技能竞赛,包含网络建设与运维和信息安全管理与评估两大赛项,及各大CTF,基于两大赛项提供全面的系统性培训,拥有完整的培训体系。团队…

Python实现广义线性回归模型(statsmodels GLM算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义线性模型(Generalized Linear Model,简称GLM)是一种广泛应用于回归分析和分类问题的统…

中通快递查询,中通快递单号查询,筛选出指定派件员的单号

批量查询中通快递单号的物流信息,将指定派件员的单号筛选出来。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上…

工业交换机的内部结构和工作原理,你了解多少?

工业交换机由许多小组件构造而成,因此,为了更全面地了解和认识工业交换机,我们需要了解其内部结构和工作原理。 工业交换机的内部结构: 1、主板,也被称为背板,是计算机的核心部件之一。 为各业务接口和数…

【PyTorch】模型选择、欠拟合和过拟合

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 完整代码2.2.2. 输出结果 1. 理论介绍 将模型在训练数据上拟合的比在潜在分布中更接近的现象称为过拟合, 用于对抗过拟合的技术称为正则化。训练误差和验证误差都很严重, 但它们之间差…

DELL EMC unity 存储系统日志收集方法

对于一些非简单的硬件故障,解决故障最有效、最快速的方法就是收集日志,而不是瞎搞。常见的乱搞方法就是 1. reimage系统‘ 2. 更换控制器;3, 重启。 本文详细介绍了图形界面GUI和命令行CLI下如何收集DELL EMC Unity日志的方法和常…

0007Java程序设计-ssm基于微信小程序的在线考试系统

文章目录 **摘要**目 录系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅🐧裙:776871563 摘要 网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理技术,基于微信小程序的在线考试…

功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试,具体是干嘛的?

软件测试是一个广义的概念,他包括了多领域的测试内容,比如,很多新手可能都听说:功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试等&#…

Goby 漏洞发布| Apache OFBiz webtools/control/xmlrpc 远程代码执行漏洞(CVE-2023-49070)

漏洞名称: Apache OFBiz webtools/control/xmlrpc 远程代码执行漏洞(CVE-2023-49070) English Name:Apache OFBiz webtools/control/xmlrpc Remote Code Execution Vulnerability (CVE-2023-49070) CVSS core: 9.8 影响资产数&…

金蝶云星空使用webapi查询单据附件的主键

文章目录 金蝶云星空使用webapi查询单据附件的主键业务需求详细操作查询单据附件查看账套单据附件查询采购价目表的单据内码和单据体内码查询单据头附件明细webapi查询json返回结果 查询单据明细附件查看账套单据明细附件查询采购价目表的单据内码和单据体内码查询单据体附件明…

phpStudy本地快速搭建网站,实现无公网IP固定地址远程访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点,测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中,查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

leetcode刷题:611.有效三角形的个数(双指针实现)

题目地址:有效三角形的个数 解决此题时,首先需要知道的是如何判断三个数字是否能够构成三角形。 我们知道,三角形任意两边之和都大于第三边。所以判断三个数字是否能构成三角形需要进行三次比较(最基础的思路) 方法一…

OLED材料市场研究:预计2029年将达到1447亿元

由于技术优势突出,近年来OLED 率先在智能手机、可穿戴等中小尺寸领域的渗透率持续提升。OLED就是有机发光显示技术,其最大特点是每个像素独立自发光,具有非常完美的黑色显示能力,在亮度、色彩、响应速度等方面远胜LCD屏幕&#xf…

视频监控管理平台/智能监测/检测系统EasyCVR智能地铁监控方案,助力地铁高效运营

近日,关于全国44座城市开通地铁,却只有5座城市赚钱的新闻冲上热搜。地铁作为城市交通的重要枢纽,是人们出行必不可少的一种方式,但随着此篇新闻的爆出,大家也逐渐了解到城市运营的不易,那么,如何…