前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >$sformatf() / $sformat()函数妙用

$sformatf() / $sformat()函数妙用

作者头像
IC验证
发布2020-06-30 14:00:12
7.9K0
发布2020-06-30 14:00:12
举报
文章被收录于专栏:杰瑞IC验证

sformatf()/sformat(),你的字符管家”

来源| 杰瑞IC验证(ID:Jerry_IC) |原创

作者| Jerry Ren

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

01

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

代码语言:javascript
复制
string     jerry_string;
string     jerry_string_r;
$sformat(jerry_string ,  “jerry_face_score==%0d” , 100);
$display(“1.%0s”, jerry_string);
jerry_string_r=$sformatf(“jerry_cool_score==%0d” , 100);
$display(“2.%0s”, jerry_string_r);

上面的两个$display打印出来的结果是什么呢?

没错,第一句会打印出:

代码语言:javascript
复制
1.jerry_face_score==100

第二句会打印出:

代码语言:javascript
复制
2.jerry_cool_score==100

我们看着这个程序琢磨一会儿就应该不难发现:

首先sformatf()/sformat()这两个函数是不做打印的事儿的,不要以为这两个函数是做打印的!

接着会发现:原来这两个函数就是整理整理字符串的格式啊!按照函数里“ ”中的格式,把相应的变量填进去。

sformatf()/sformat()什么区别?

说白了,区别就是整理好的字符串往哪里放的问题!

sformat()比sformatf()多了第一个参数,这个第一个参数就是放最终整理好的字符串的容器。

sformatf()那就腻害了,第一个参数都不要了,不想多写一个字。谁要用它整理好的字符串,直接把它整体拿去用!sformatf()返回的值就是整理好的字符串。就像上面的代码,通过jerry_string_r去取这个字符串用。所以他服务态度欠佳,简单粗暴,但是有时确实可以少写几个代码。比如他可以偷懒把上面的两行用一行:

代码语言:javascript
复制
display(sformatf(“2.jerry_cool_score==%0d” , 100));

但是sformat()就没办法这样,它必须调用变量。

有人问了:我为啥要让他们给我整理格式啊?打印本来就可以自己整理啊?

可以这样写:

代码语言:javascript
复制
$display(“2.jerry_cool_score==%0d” , 100);

这不是一样吗?

没错,打印这句确实一样,但是有时候的需求就是需要你提前先整理好字符串的。

比如我们在UVM验证平台常用的uvm_info宏的打印方式:

代码语言:javascript
复制
`uvm_info(“jerry_driver”,”jerry is cool!!!”,UVM_LOW)

他的第二个参数是打印信息,我们如果需要打印变量值就需要使用他们整理好字符串,比如:

代码语言:javascript
复制
`uvm_info(“jerry_driver”,$sformatf(“jerry_cool_score==%0d” , 100),UVM_LOW)

02

还有哪里可以用它呢?我们看看下面的例子:

代码语言:javascript
复制
bit  jerry_0_in=0;
if(testplusargs(“JERRY_0_IN”))
    jerry_0_in=1;

这个例子使用了之前讲过的testplusargs函数(初学不认识它的朋友可以翻翻之前的文章)。当我们传入参数JERRY_0_IN的时候,jerry_0_in的值变为1 。

这几句代码当然没有什么问题但是,假如我需要这样处理的信号不止一个呢?比如:

代码语言:javascript
复制
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(testplusargs(“JERRY_0_IN”))
    jerry_0_in=1;
if(testplusargs(“JERRY_1_IN”))
    jerry_1_in=1;
if(testplusargs(“JERRY_2_IN”))
    jerry_2_in=1;
……
if(testplusargs(“JERRY_31_IN”))
    jerry_31_in=1;

虽然省略了中间很多字,但是看着代码都很多很麻烦。

怎么办呢?不想写这么多字!sformatf()/sformat()他们就可以帮上忙了!

我们还是选择$sformatf()来举例下(它能更少写一点字,再懒点)。

上代码先!

代码语言:javascript
复制
bit jerry_in[32];
foreach(jerry_in[i]) 
   begin
     if(testplusargs(
     jerry_in[i]=1;
    end

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

这里这样写主要存在这样几个思考过程:

1.很多位同类型的信号能否使用数组?

2.同类型的行为能否使用循环?

而这里循环涉及到字符串的变化怎么办?用sformatf()/sformat()函数!

哈哈,好了,今天Jerry就和大家侃到这里!用好今天这两个函数有时可以帮助你节省不少时间~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杰瑞IC验证 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档