news 2026/4/15 20:01:38

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/4/14 9:15:52

Cap录屏性能深度实测:内存占用与优化策略全解析

Cap录屏性能深度实测:内存占用与优化策略全解析 【免费下载链接】Cap Effortless, instant screen sharing. Open-source and cross-platform. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 你是否曾在重要会议录制时遭遇软件卡顿?或…

作者头像 李华
网站建设 2026/4/9 9:12:04

Webview2版本不兼容及安装遇到的问题

文章目录问题起因解决方案方案一:增加版本兼容性检查(推荐)方案二:强制用户升级 Runtime方法三:通过控制面板“修复”(适用于已安装但出问题的场景)问题起因 在现场WPF程序报错,原因…

作者头像 李华
网站建设 2026/4/11 17:27:54

Altium Designer 16终极封装库:PCB设计效率提升完整解决方案

Altium Designer 16终极封装库:PCB设计效率提升完整解决方案 【免费下载链接】AD16最全封装库自用 本仓库提供了一个名为“AD16最全封装库(自用).rar”的资源文件下载。该文件包含了各种CPU、存储器、电源芯片、几乎所有接口(如DB…

作者头像 李华
网站建设 2026/4/15 13:30:06

Python 3.8.10 极速安装方案:告别漫长等待

Python 3.8.10 极速安装方案:告别漫长等待 【免费下载链接】Python3.8.10AMD64安装包 本仓库提供了一个Python 3.8.10的AMD64安装包,旨在解决原下载地址网速过慢的问题,帮助用户节省下载时间。 项目地址: https://gitcode.com/open-source-…

作者头像 李华
网站建设 2026/4/15 13:32:29

Docker中运行Miniconda-Python3.9并安装PyTorch GPU

Docker中运行Miniconda-Python3.9并安装PyTorch GPU 在深度学习项目开发过程中,最让人头疼的往往不是模型调参,而是环境配置——“我在本地能跑通,怎么一上服务器就报错?”、“CUDA版本不兼容”、“PyTorch死活检测不到GPU”……这…

作者头像 李华
网站建设 2026/4/12 15:28:53

PPTX转Markdown神器:告别繁琐复制粘贴,轻松搞定文档转换

PPTX转Markdown神器:告别繁琐复制粘贴,轻松搞定文档转换 【免费下载链接】pptx2md a pptx to markdown converter 项目地址: https://gitcode.com/gh_mirrors/pp/pptx2md 还记得上次为了把精美的PPT转换成可编辑的Markdown文档,你花了…

作者头像 李华