• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

SystemVerilog中$sformat和$formatf的妙用

字符串在验证平台中是经常被使用的,今天我们来说说在SystemVerilog中非常重要和常用的\(sformatf()/\)sformat()函数,他们是什么含义?

1.sformat和sformatf的区别

首先Jerry和大家解释下这两个函数什么含义。看下这段代码:

string jerry_string;
string jerry_string_r;
$sformat(jerry_string , “jerry_face_score==%0d;” , 100);  //注意用%0d
$display(“%0s”, jerry_string);                            //注意再次有$display()显示
jerry_string_r=$sformatf(“jerry_cool_score==%0d;” , 100);
$display(“%0s”, jerry_string_r);

上面的两个\(display打印出来的结果是什么呢? 没错,第一句会打印出: `jerry_face_score=100;` 第二句会打印出: `jerry_cool_score=100;` 我们看着这个程序琢磨一会儿就应该不难发现: 首先\)sformatf()/\(sformat()这两个函数是不做打印的事儿的,不要以为这两个函数是做打印的! 接着会发现:原来这两个函数就是整理整理字符串的格式啊!按照函数里“ ”中的格式,把相应的变量填进去。 那\)sformatf() / \(sformat()什么区别? 说白了,区别就是整理好的字符串往哪里放的问题! \)sformat()比\(sformatf()多了第一个参数,这个第一个参数就是放最终整理好的字符串的容器。 \)sformat()会直接把整理好的字符串放到第一个字符串类型的参数中,如上面代码中的jerry_string。
而\(sformatf()那就腻害了,第一个参数都不要了,不想多写一个字。 \)sformatf()返回的值就是整理好的字符串。
就像上面的代码,通过jerry_string_r去取这个字符串用。
可以把上面的两行用一行:
·\(display(\)sformatf(“jerry_cool_score%0d;” , 100));·
但是sformat()就没办法这样,它必须调用变量。
有人问了:我为啥要让他们给我整理格式啊?打印本来就可以自己整理啊?
可以这样写:
\(display(“2.jerry_cool_score==%0d” , 100); 这不是一样吗? 没错,打印这句确实一样,但是有时候的需求就是需要你提前先整理好字符串的。 比如我们在UVM验证平台常用的uvm_info宏的打印方式: `uvm_info(“jerry_driver”,”jerry is cool!!!”,UVM_LOW) 他的第二个参数是打印信息,我们如果需要打印变量值就需要使用他们整理好字符串,比如: `uvm_info(“jerry_driver”,\)sformatf(“jerry_cool_score
%0d” , 100),UVM_LOW)

2.其他巧妙用法
还有哪里可以用它呢?我们看看下面的例子:

bit jerry_0_in=0;
if($test$plusargs(“JERRY_0_IN”))
  jerry_0_in=1;
// 执行
+JERRY_0_IN
// 执行结果
jerry_0_in=1

当我们传入参数JERRY_0_IN的时候,jerry_0_in的值变为1 。
这几句代码当然没有什么问题但是,假如我需要这样处理的信号不止一个呢?
比如:

bit jerry_0_in=0;
bit jerry_1_in=0;
bit jerry_2_in=0;
bit jerry_3_in=0;
bit jerry_4_in=0;
bit jerry_5_in=0;
bit jerry_6_in=0;
……
bit jerry_31_in=0;

if($test$plusargs(“JERRY_0_IN”))
  jerry_0_in=1;
if($test$plusargs(“JERRY_1_IN”))
  jerry_1_in=1;
if($test$plusargs(“JERRY_2_IN”))
  jerry_2_in=1;
……
if($test$plusargs(“JERRY_31_IN”))
jerry_31_in=1;

虽然省略了中间很多字,但是看着代码都很多很麻烦。
$sformatf() / \(sformat()他们就可以帮上忙了! 我们还是选择\)sformatf()来举例下(它能更少写一点字,再懒点)。

bit jerry_in[32];
foreach(jerry_in[i])
begin
  if($test$plusargs($sformatf(“JERRY_%0d_IN”,i)))
    jerry_in[i]=1;
end

写完了!我们这样短短几行就写完了上面那么多行还带省略号的代码!

posted on 2022-04-24 20:08  SOC验证工程师  阅读(558)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3