“sformatf()/sformat(),你的字符管家”
来源| 杰瑞IC验证(ID:Jerry_IC) |原创
作者| Jerry Ren
字符串在验证平台中是经常被使用的,今天我们来说说在SystemVerilog中非常重要和常用的sformatf()/sformat()函数,他们是什么含义?如何用?如何妙用?
01
首先Jerry和大家解释下这两个函数什么含义。看下这段代码:
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打印出来的结果是什么呢?
没错,第一句会打印出:
1.jerry_face_score==100
第二句会打印出:
2.jerry_cool_score==100
我们看着这个程序琢磨一会儿就应该不难发现:
首先sformatf()/sformat()这两个函数是不做打印的事儿的,不要以为这两个函数是做打印的!
接着会发现:原来这两个函数就是整理整理字符串的格式啊!按照函数里“ ”中的格式,把相应的变量填进去。
那sformatf()/sformat()什么区别?
说白了,区别就是整理好的字符串往哪里放的问题!
sformat()比sformatf()多了第一个参数,这个第一个参数就是放最终整理好的字符串的容器。
而sformatf()那就腻害了,第一个参数都不要了,不想多写一个字。谁要用它整理好的字符串,直接把它整体拿去用!sformatf()返回的值就是整理好的字符串。就像上面的代码,通过jerry_string_r去取这个字符串用。所以他服务态度欠佳,简单粗暴,但是有时确实可以少写几个代码。比如他可以偷懒把上面的两行用一行:
display(sformatf(“2.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)
02
还有哪里可以用它呢?我们看看下面的例子:
bit jerry_0_in=0;
if(testplusargs(“JERRY_0_IN”))
jerry_0_in=1;
这个例子使用了之前讲过的testplusargs函数(初学不认识它的朋友可以翻翻之前的文章)。当我们传入参数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(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()来举例下(它能更少写一点字,再懒点)。
上代码先!
bit jerry_in[32];
foreach(jerry_in[i])
begin
if(testplusargs(
jerry_in[i]=1;
end
写完了!我们这样短短几行就写完了上面那么多行还带省略号的代码!
这里这样写主要存在这样几个思考过程:
1.很多位同类型的信号能否使用数组?
2.同类型的行为能否使用循环?
而这里循环涉及到字符串的变化怎么办?用sformatf()/sformat()函数!
哈哈,好了,今天Jerry就和大家侃到这里!用好今天这两个函数有时可以帮助你节省不少时间~