UVM环境自动生成器具(2)uvmdvgen

news/2025/11/12 20:26:46/文章来源:https://www.cnblogs.com/ljbguanli/p/19215304

UVM环境自动生成器具(2)uvmdvgen

介绍

OpenTitan是一个谷歌的开源RISC-V项目,这里借用了项目中的uvm环境生成脚本uvmdvgen来生成环境。

使用流程是通过命令后缀指定环境和agent名称,然后脚本依据路径下的mako模板替换生成环境,脚本基于python实现。

项目链接:
GitHub - lowRISC/opentitan: OpenTitan: Open source silicon root of trust

使用步骤

环境

脚本基于python实现,github目录有环境要求,个人在centos7 python 3.14测试。

脚本在util/路径,-h可以看到帮助说明,-a用于生成agent,-s指示agent主从分开,-e用于生成env,-c从CIP库生成否则从DV库生成,-hr、hi、ha指示包含寄存器模型、中断和alert,-ea指示env中包含的agent,-ao指示agent生成在路径,-ro指示env生成在的路径。

$ util/uvmdvgen.py -h
usage: uvmdvgen.py [-h] [-a] [-s] [-e] [-c] [-hr] [-hi] [-ha][-ea agt1 agt2 [agt1 agt2 ...]] [-ao [hw/dv/sv]][-eo [hw/ip/]] [-v VENDOR][ip/block name]

生成agent

使用脚本生成环境包括2步,首先通过-a生成agent,再通过-e -ea生成集成agent的env。

在端口通过指令生成i2c agent,这里是生成在当前目录,也可以加-ao指定目录。

$ util/uvmdvgen.py i2c -a

在i2c/i2c_agent可以看到生成文件。

在这里插入图片描述

但实际生成的是纯空文件,或者说替换了名字的空模板,内容还要自己从头写,所以指令agent可以是任何名称,例如i3c、i4c,不一定是DV库中的agent。
在这里插入图片描述

在项目的hw/dv/sv路径中有一些uvm agent,包含jtag、uart、spi、i2c等,是有完整内容的,可以直接拷贝到自己的环境。
在这里插入图片描述

生成env

在vrf目录生成一个环境,包含axi apb pcie agent,和前相似agent名可以任意。

util/uvmdvgen.py vrf -e -ea axi apb pcie

在vrf/dv路径下可以看到生成环境,这个脚本还是比较自动的,首先env中可以看到例化各个agent,传递了配置,连接了scb,连接了top_seqr。不过也有缺点,同名agent只能例化1次否则要手动修改,还有就是没有ref model和对应scb连接。

在这里插入图片描述

其他vseq、vseqr不再赘述,tb中例化了agent同名if,并config_db发送到了agent中,基本流程都有实现。

脚本实现

脚本通过python实现,可以看一下实现方法。

uvmdvgen.py

脚本接收了参数,并根据-a还是-e决定执行gen_agent还是gen_env。

if args.gen_agent:gen_agent.gen_agent(args.name, args.has_separate_host_device_driver, args.agent_outdir, args.vendor)
if args.gen_env:gen_env.gen_env(args.name, args.is_cip, args.has_ral, args.has_interrupts, args.has_alerts,args.num_edn, args.env_agents, args.env_outdir, args.vendor)

gen_agent.py

首先将agent内文件定义成包含元组的列表,按照路径、agent名、文件名和后缀形式保存。

agent_srcs = [(agent_dir,               name + '_', 'if',            '.sv'),(agent_dir,               name + '_', 'item',          '.sv'),(agent_dir,               name + '_', 'agent_cfg',     '.sv'),(agent_dir,               name + '_', 'agent_cov',     '.sv'),(agent_dir,               name + '_', 'monitor',       '.sv'),(agent_dir,               name + '_', 'driver',        '.sv'),(agent_dir,               name + '_', 'host_driver',   '.sv'),(agent_dir,               name + '_', 'device_driver', '.sv'),(agent_dir,               name + '_', 'agent_pkg',     '.sv'),(agent_dir,               name + '_', 'agent',         '.sv'),(agent_dir,               name + '_', 'agent',         '.core'),(agent_dir,               "",         'README',        '.md'),(agent_dir + "/seq_lib",  name + '_', 'seq_list',      '.sv'),(agent_dir + "/seq_lib",  name + '_', 'base_seq',      '.sv')]

然后通过for循环读出,使用mako组件,根据名称找到同路径下预存的.tpl模板,然后在模板文件中替换名称。

for tup in agent_srcs:path_dir = tup[0]src_prefix = tup[1]src = tup[2]src_suffix = tup[3]ftpl = src + src_suffix + '.tpl'fname = src_prefix + src + src_suffix# read templatetpl = Template(filename=str(importlib.resources.files('uvmdvgen') / ftpl))with open(path_dir + "/" + fname, 'w') as fout:fout.write(tpl.render(name=name,has_separate_host_device_driver=has_separate_host_device_driver,vendor=vendor))

实际替换过程均在模板中实现,以driver.sv.tpl为例,模板就是空的,所以生成agent也是空文件,如有一些通用需求,可以直接修改.tpl模板。

class ${name}_driver extends dv_base_driver #(.ITEM_T(${name}_item),.CFG_T (${name}_agent_cfg));`uvm_component_utils(${name}_driver)// the base class provides the following handles for use:// ${name}_agent_cfg: cfg

gen_env.py

和gen_agent.py相似,替换过程均在模板中实现,env的模板更复杂一些,所以生成出来的不是空文件,以env.sv.tpl为例,会根据agent列表for循环生成集成的代码。例如有添加ref model的需求,直接修改模板文件即可。

  function void build_phase(uvm_phase phase);super.build_phase(phase);
% for agent in env_agents:// create componentsm_${agent}_agent = ${agent}_agent::type_id::create("m_${agent}_agent", this);uvm_config_db#(${agent}_agent_cfg)::set(this, "m_${agent}_agent*", "cfg", cfg.m_${agent}_agent_cfg);cfg.m_${agent}_agent_cfg.en_cov = cfg.en_cov;
% endforendfunction

总结

脚本定位还是生成模板,不能直接运行,agent也只是壳子,需要再人工完成。不过毕竟不是专门生成环境的工具,实现过程比较清晰,适合写平台脚本参考。

参考
UVM验证环境生成工具-Open Titan UVM Generator - SOC验证工程师 - 博客园

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

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

相关文章

题解:CF961C Chessboard

洛谷。 题目传送门。 某次校内模拟赛的 T1。 分析 注意到 \(n\le100\),显然这是一道搜索题。考虑怎么来搜。 我们发现,四块小棋盘可以在左上、右上、左下、右下任意排列,那么构成大棋盘的总方案数就是 \(4!=24\) 种…

7年java开发的一些感悟

下面是对你原文的润色和扩写版本,保持你真实的口吻,但更有层次、情绪和故事感,也让读者更容易共鸣:很难想象,我已经在 Java 这行干了 7 年了。 今年快 35 岁,前段时间刚换了一家公司,总算不用再为生活焦虑得睡不…

11.12 NOIP模拟6/多校1 改题记录

......HZOJ 写在前面 NOIP AK me. 全是唐题。如此模拟赛,何以NOIP?大概就是所有时间拿去攻T1了吧。然后暴力也懒得打了。《Blueming》 ‘뭐해?‘라는 두 글자에 在干嘛?这几个字中 ‘네가 보고 싶어’ 나의 속마음…

文字识别系统代码

点击查看代码 import torch from torch import optim import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable from torchvision import datasets, transforms from torch.utils…

B4093 [CSP-X2021 山东] 发送快递

B4093 [CSP-X2021 山东] 发送快递 题解题目传送门 我的博客 - 欢迎光临! 本题弱化版(?):P3052,P10483 二者互为双倍经验。首先对于一个强制捆绑组里的物品,我们直接使用并查集,将一个并查集里的物品合成为一个…

从零上手 Rokid JSAR:打造专属 AR 桌面交互式 3D魔方,开启空间创建之旅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

微软2025年11月补丁星期二修复1个零日漏洞和63个安全漏洞

微软2025年11月补丁星期二发布了安全更新,修复了63个安全漏洞,其中包括1个被积极利用的零日漏洞。本次更新包含4个严重级别漏洞,涉及权限提升、远程代码执行等多个安全领域。微软2025年11月补丁星期二修复1个零日漏…

CF468C Hack it!

已严肃完成今日构造大学习。 首先扔出来一个 \([1, 10^{18} - 1]\) 区间,你会发现这个区间每往右平移一个单位那么 \(f\) 的和就会加 \(1\),当然得在 \(2 \times 10^{18} - 1\) 之内,这也是我们选择这个界的原因。 …

深入解析:FT62FC3X 8位MCU单片机选型表,详细解析FT62FC31A/32A/33A/35A/3FA

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

FFmpeg for Android 图传Web

FFmpeg for Android & 图传Web 之前在项目研发中有个需求, 需要对接RTSP摄像头, 并且需要将其转封装格式到H5能够播放的格式, 并且需要在纯安卓APP中实现, 并且需要低延迟. 找了一圈都没有合适的且现成的方案, 这个…

语法记录

\(\texttt{titile}\) 计概与数算行末不要空格!!! 字符串与字符数组读入 cin >> str //字符与字符串,不含空格、制表符与换行 scanf("%c", &ch) //读单个字符 ch scanf(" %c", &…

Can Large Language Models Detect Rumors on Social Media?

论文信息论文标题:Can Large Language Models Detect Rumors on Social Media?论文作者:刘强、陶翔、吴俊飞、吴舒、王亮论文来源:发布时间:2024-02-06论文地址:link论文代码:link1 介绍 1.1 研究动机研究动机围…

压迫

从明天开始到考研结束前 拒绝三角洲 方舟想起来了挂一下,没想起来就算了 抖音不再打开 b站用来看课 每天总结反思 多学多想多思考 提高效率 瞄着最高分努力 看看实力 如果考的太高完全可以选择二战,这也是二战得信心…

P13573 [CCPC 2024 重庆站] Pico Park

P13573 [CCPC 2024 重庆站] Pico Park 题意: 游戏中,有 \(n\le 500\) 名玩家,依次站在数轴的 \(1,2,3, \dots, n\) 处,第 \(i\) 名玩家有一个面向的方向 \(d_i\),为向左或向右。 每名玩家手里有一把缩小枪,玩家会…

手工安装gcc-13.3.0

手工安装gcc-13.3.0wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.2.1.tar.bz2wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bzwget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1…

深入解析:Cookie、Session、JWT、SSO,网站与 APP 登录持久化与缓存

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

gowin ide linux安装教程

1.下载,下载地址 https://www.gowinsemi.com.cn/software/index 我下载的版本是Gowin_V1.9.11.03_Education_Linux ps:云源软件和云源编程器的区别: 云源软件包含一系列工具如ide,综合工具,编程器等等 云源编程器就…

AT_arc111_f [ARC111F] Do you like query problems?

首先这个取 \(\min,\max\) 操作很不好做。 并且对可能的操作序列计数很不好做。 参考 【题解】ARC111F Do you like query problems?。 考虑先转期望,求出每种操作序列的期望结果。 发现序列中每个位置都不受其他位置…

Win7 隐藏文件夹盘符

1、打开注册表编辑器 regedit 2、找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer 3、 右键新建 DWORD-32 值:名称修改为:NoDrives 十进制值按下表填写4、重启系统生效!

pythontip 按条件过滤字典

编写一个程序,根据某个条件过滤字典值。 对于这个挑战,条件是字典值应该大于整数k。 定义函数filter_dict_values(),有两个参数:字典mixed_dict和整数k。 在函数内部,创建一个新字典,并从mixed_dict过滤值不是整…