文件I/O任務和函數(IEEE Standard for SystemVerilog---21)
將數據格式化為字符串(IEEE Standard for SystemVerilog---21.3.3)
variable_format_string_output_task
$sformat ( output_var , format_string [ , list_of_arguments ] )
1、系統任務$sformat與系統任務$write相似,但是有一個主要的不同。
2、與輸出系統任務$display和$write不同的是,$sformat只把第二個參數作為格式字符串。
3、格式字符串可以是字符串常量,例如"data is %d",或者是整數表達式,非合並字節數組,字符串數據類型。
4、$sformat支持和$display一樣所有支持的格式。
5、如果沒有為格式說明符提供足夠的參數或提供了太多的參數,那么應用程序將發出警告並繼續執行。
variable_format_string_output_function
$sformatf ( format_string [ , list_of_arguments ] )
系統函數$sformatf的行為類似於$sformat,只是字符串結果作為$sformatf的函數結果值傳回,而不是像$sformat那樣放在第一個參數中。
string_output_task_name
$swrite | $swriteb | $swriteh | $swriteo
1、任務的$swrite家族基於任務的$fwrite家族,並且接受與它所基於的任務相同類型的參數;
2、有一個例外:$swrite的第一個參數應該是一個整型、非合並字節數組或字符串數據類型的變量,而不是指定將生成的字符串寫入到哪個文件的變量。
3、非合並字節數組字符順序是從左向右。
例子:
string string0;
string string1;
$sformat(string0, “string0_inst==%0d” , 100);
$display(“%0s”, string0); //string0_inst==100
string1=$sformatf(“string1_inst==%0d” , 100);
$display(“%0s”, string1); //string1_inst==100
這兩個函數就是整理字符串的格式,按照函數里給的格式,把相應的變量填進去。
$sformat和$sformatf的不同點:
1、$sformat()比$sformatf()多了第一個參數,第一個參數就是放整理好的字符串的容器。\(sformat()會直接把整理好的字符串放到第一個字符串類型的參數中。 2、\$sformatf()沒有\$sformat()第一個參數。\)sformatf()返回的值就是整理好的字符串。
比如我們在UVM驗證平台常用的uvm_info宏的打印方式:
uvm中的應用:
`uvm_info(“driver”,”driver=100”,UVM_LOW)
`uvm_info(“driver”,$sformatf(“driver==%0d” , 100),UVM_LOW)
其他可以寫更少代碼的應用:
//簡便的方法
bit test[32];
foreach(test[i])
begin
if($test$plusargs($sformatf(“%0d_in”,i)))
test[i]=1;
end
./run_option +1_in
./run_option +5_in