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
写完了!我们这样短短几行就写完了上面那么多行还带省略号的代码!
浙公网安备 33010602011771号