news 2026/5/16 19:32:30

UVM-创建重复agent时$sformatf的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVM-创建重复agent时$sformatf的使用

$sformatf是 SystemVerilog 中用于格式化字符串的函数,它根据提供的格式字符串和变量,生成一个新的字符串,非常适用于创建动态的、包含变量值的文本。

核心语法与工作原理解析

$sformatf的基本语法如下:

string_result = $sformatf("格式化字符串", 变量1, 变量2, ...);

它的工作机制是:将“格式化字符串”中的格式说明符(如%0d)按顺序替换成后面提供的变量值,最后返回一个完整的、拼接好的新字符串。

以你提供的例子$sformatf("axi_stream_master_agt[%0d]", i)来说:

  • "axi_stream_master_agt[%0d]":这是格式化字符串。其中%0d是一个格式说明符,意思是“将对应的变量以十进制整数形式填入,并且不保留前导零或空格”。

  • i:这是需要填入的整型变量。

  • 如果循环变量i的值为0,那么函数将返回字符串"axi_stream_master_agt[0]"

下面这个表格对比了$sformatf和它的“兄弟”函数$sformat的主要区别:

特性

$sformatf

$sformat

返回值

直接返回格式化后的字符串

没有返回值void

输出方式

将结果赋值给一个字符串变量,如string s = $sformatf(...);

将结果直接存入第一个参数(必须是字符串变量),如$sformat(s, ...);

使用场景

更适合内联调用,比如直接作为其他函数的参数

需要先声明一个字符串变量来接收结果

主要应用场景

  1. 为UVM组件生成唯一实例名

    这是你例子中最典型的用途。在UVM验证环境中,当需要批量创建多个相同类型的组件(如多个AXI Stream主代理)时,必须为每个实例指定一个唯一的名称。使用$sformatf可以轻松实现。

    foreach(axi_stream_master_agt[i]) begin // 为每个代理生成类似 "axi_stream_master_agt[0]", "axi_stream_master_agt[1]" 的唯一名称 axi_stream_master_agt[i] = my_agent::type_id::create($sformatf("axi_stream_master_agt[%0d]", i), this); end
  2. 在打印信息中动态插入变量值

    在调试或日志记录时,我们常常需要打印出某些变量的实时状态。$sformatf可以方便地构造包含变量值的提示信息。

    `uvm_info("MY_DRIVER", $sformatf("成功接收到数据包,id=%0d, data=0x%0h", pkt_id, pkt_data), UVM_LOW)
  3. 动态生成命令行参数或文件名

    当需要根据循环或配置生成动态的命令行参数($test$plusargs)或者文件名时,$sformatf也非常有用。

    bit flag[8]; foreach(flag[i]) begin // 动态生成如 +TEST_0, +TEST_1 等参数 if ($test$plusargs($sformatf("TEST_%0d", i))) begin flag[i] = 1; end end // 动态生成包含索引的文件名 string filename = $sformatf("output_%0d.log", test_sequence_num); int file_handle = $fopen(filename, "w");

重要注意事项

  • $sformatf不直接打印:这个函数只负责生成字符串,并不会像$display那样将字符串输出到控制台。你需要通过其他方式(如赋值、传递给打印函数)来使用它生成的字符串。

  • 格式说明符的选择%0d中的0表示“无填充”,这在生成名称或索引时通常是最佳选择。其他常用说明符还包括%h(十六进制)、%b(二进制)、%s(字符串)等。

  • 关于$psprintf:你可能还会遇到一个功能几乎完全相同的函数$psprintf。需要注意的是,$psprintf是早期Vera语言遗留下来的,$sformatf是SystemVerilog标准的一部分,推荐优先使用$sformatf

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 10:44:08

如何高效利用VISIO电气元件库:5步快速上手指南

如何高效利用VISIO电气元件库:5步快速上手指南 【免费下载链接】VISIO电气电子元件库 本仓库提供了一个名为“VISIO电气电子元件库.rar”的资源文件,该文件包含了电气电子专业的各种元件图。这些元件图可以为电气电子专业的同学在绘制强电、弱电等方面的…

作者头像 李华
网站建设 2026/5/9 4:40:44

gRPC反射服务终极指南:无需预知协议即可调用微服务

gRPC反射服务终极指南:无需预知协议即可调用微服务 【免费下载链接】grpc-node gRPC for Node.js 项目地址: https://gitcode.com/gh_mirrors/gr/grpc-node 你是否曾经遇到过这样的情况:在复杂的微服务架构中,想要调用一个服务却找不到…

作者头像 李华
网站建设 2026/5/1 7:39:00

Miniconda-Python3.9镜像支持自动化CI/CD流程

Miniconda-Python3.9镜像支持自动化CI/CD流程 在现代软件工程与人工智能研发的交汇点上,一个看似微小却影响深远的问题正不断浮现:为什么代码在本地运行完美,到了测试或生产环境却频频出错?这种“在我机器上能跑”的窘境&#xff…

作者头像 李华
网站建设 2026/5/5 19:48:36

在Miniconda中使用virtual environment管理项目

在Miniconda中使用虚拟环境管理项目 在数据科学和人工智能项目的日常开发中,你是否曾遇到过这样的场景:刚配置好的 PyTorch 项目运行得好好的,结果安装了另一个 TensorFlow 项目所需的依赖后,原来的代码突然报错?或者团…

作者头像 李华
网站建设 2026/5/14 6:04:40

终极LaTeX简历模板:打造专业求职材料的完整指南

终极LaTeX简历模板:打造专业求职材料的完整指南 【免费下载链接】resume Software developer resume in Latex 项目地址: https://gitcode.com/gh_mirrors/res/resume 在竞争激烈的求职市场中,一份专业的简历是获得面试机会的关键。LaTeX简历模板…

作者头像 李华
网站建设 2026/5/11 4:23:31

Miniconda环境下安装PyYAML等辅助库教程

Miniconda环境下安装PyYAML等辅助库教程 在现代AI与数据科学项目中,一个常见的场景是:你刚接手同事的代码,在本地运行时报错——“ModuleNotFoundError: No module named ‘pyyaml’”,而当你尝试用 pip install 安装后&#xff…

作者头像 李华