传统的Veriog仅仅支持文字表述上的字符串, 而SystemVerilog将字符串作为了内建的数据类型。类似C++的std::string类型,SystemVerilog字符串类型支持很多操作和函数。
SytemVerilog字符串类型支持的操作和方法:
一些有用的系统任务
SytemVerilog字符串类型支持的操作和方法
|
操作
|
描述
|
strA
==
strB
|
相等——操作数可以是字符串类型或者字符串文字,如果两个字符串由相同的字符序列组成,则返回1.
|
strA
!=
strB
|
不等于—— 对相等操作取反
|
strA
<
strB strA
<=
strB strA
>
strB strA
>=
strB
|
比较——如果相应的按字典序的比较条件满足时,则返回1
|
{
strA
,
strB
,
..
,
strN
}
|
连接——扩展指定的字符串。操作符可以是字符串类型,也可以是字符串文字。当所有的操作符都是字符串文字时,此操作完成整体的连接,结果也是一个字符串文字。
|
str
.len()
|
长度——返回代表字符串的长度的整数
|
str
.putc(
i, c
)
|
字符输入——将字符串str中的第i个字符替换成字符c。i必须是一个整数,c必须是一个字节类型的
字符
|
str
.getc(
i
)
|
获取字符——返回字符串str的第i个字符。i必须是整数,返回的字符表示为一个字节。
|
str
.toupper()
|
转成大写——返回str中所有字符变成大写的字符串
|
str
.tolower()
|
转成小写——返回str中所有字符变成小写的字符串
|
strA
.compare(
strB
)
|
比较——比较strA和strB.从第一个字符开始比较。如果相等,则继续后续字符,知道两者有不同或者到达某个字符串的结尾。如果相等,返回’0‘;如果strA在strB之后,则返回整数;如果strA在strB之前,则返回负数.
|
strA
.icompare(
strB
)
|
比较——和compare方法类似,但是不关心大小写。
|
str
.substr(
i, j
)
|
子串——i和j都是整数,返回一个新的字符串,由str的第i和和第j个中间的所有字符组成
|
str
.atoi()
str
.atohex()
str
.atooct()
str
.atobin()
|
字符串转整数——返回一个32bit整数(不考虑此字符串表示的数字的长度),对于atoi, 字符串将被看作十进制;对于atoh,十六进制;对于atooct,八进制;对于atob,二进制。对于比较大的数字,使用系统任务$sscanf更加合适
[1].
|
str
.atoreal()
|
字符串转实数——此方法返回字符串str表示的实数
|
str
.itoa(
i
)
str
.hextoa(
i
)
str
.octtoa(
i
)
str
.bintoa(
i
)
|
整数转字符串——atoi,atohex,atooct,atobin的反运算。此系列方法输入一个整数i,将其对应的表示方式存在字符串str中。
|
str
.realtoa(
r
)
|
实数转字符串——atoreal的反运算。此方法输入一个实数r,将其对应的表示方式存在字符串str中。
|
字符串在构建日志信息的时候非常有用。有许多很方便有用的SystemVerilog系统函数,以下列举其中的几个:
Useful SystemVerilog System Tasks
Useful SystemVerilog System Tasks
|
Task Name
|
Description
|
$sscanf(str,format,args);
|
$sscanf 将字符串按照某个模板格式进行扫描,其字符串格式和C语言中的printf()函数类似
|
$sformat(str,format,args);
|
$sformat是$sscanf的反函数。将字符串按照给定的格式填入相应的参数args中
|
$display(format,args);
|
$display就是Verilog的printf语句,在stdout上显示格式化的字符串
|
$sformatf(format,args);
|
$sformatf任务和$sformat相似,除了其返回字符串结果。字符串作为$sformatf的返回值,而不是像$sformt一样放在第一个参数上。
|
-
一个流行的$sformatf的替代方式是$psprintf. 它实际上是由Vera遗留下来的。$sformtf 在后来成为了SystemVerilog的语言标准。然而,大部分流行的SystemVerilog编译器都支持$psprintf,尽管它没有成为标准。如果想符合标准,请使用$sformatf.
-
↑
Dave Rich,
Verification Guild
, 2007, "
String manipulation through atohex();
", accessed on August 22 2010
-
↑
Ben Cohen,
Verification Guild
, 2006, "
$psprintf // In VCS not in P1800
", accessed on August 22 201
int fh;
str_num.itas(num);
fh = $fopen({"aa_",str_num,"_bbb.log"},“w”);
$fdisplay(fh,"data:%h, time:%0t",data,$time);
string rm_file;
$sformat(rm_file,"rm_out_data_%0d.log",cmd_cnt);//将打印字符串放入rm_file
int rm_out_file; // as file handle
rm_out_file = $fopen(rm_file); //
$fclose(rm_out_file);
原文链接:http://electron64.blog.163.com/blog/static/106033970201010252235148
1.字符串变量的长度是字符串中字符的个数。
2.字符串类型的变量是动态的,因为他们的长度在仿真的过程中可能发生变化。
3.通过对字符串变量的索引,可以对字符串中的单个字符读或写。
4.字符串的行为类似于长度为8bits倍数的packed arrays.
5.赋给不同大小的整型变量的packed arrays的字符串要么被截断为变量的大小,要么在必要时在左边用0填充。
6.字符串数据类型的变量可以是任意长度。
7.当将字符串赋给字符串类型或在字符串类型操作数的表达式中使用时,字符串字面值会隐式转换为字符串类型
$display("...格式控制符...",var_name);
格式控制:打印数据所占字符宽度是系统自动分配的,例如想要打印一个12bit的数,打印结果根据格式控制符自动分配位宽,十六进制的用三位(FFF),十进制的用四位(4095)。
module printval;
reg [11:0] r1;
initial begin
其中,“units_number”表示打印时间单位,范围为0~-15;它们对应单位如下表所示。默认值为`timescalse所设置的仿真timeunit。“precision_number” 是在打印时间值时,小数点后保留的位数。其默认值为0。“suffix_string” 是在时间值后面打印的一个后缀字符串。默认值为空字符串。“MinFieldWidth” 是时间值字符串与后缀字符的总长度的最小长度,若字符串不足这个长度,则在这部分字符串之前补空格。默认值为20。
radix:转换后的进制数,可以是10进制、16进制等,范围必须在 2-36。
功能:将整数value 转换成字符串存入string 指向的内存空间 ,radix 为转换时所用基数(保存到字符串中的数据的进制基数)。
返回值:函数返回一个指向 str,无错误返回。
itoa()函数实例:
文章目录一、变量类型——四值变量与二值变量二、固定数组——非压缩数组与压缩数组2.1.非压缩数组2.2.压缩数组三、动态数组四、队列五、联合数组六、数组方法6.1.数组运算方法6.2.数组排序方法6.3.数组定位方法七、结构体八、枚举类型九、字符串变量
一、变量类型——四值变量与二值变量
变量(信号)类型分为:四值变量和二值变量;
四值变量: (0、1、x、z)四种状态
wire——主要用在a...
在systemverilog中提供了许多输入输出的系统任务和函数,本文主要介绍文件输入输出相关的任务和函数。文件输入输出相关的任务和函数$fseek$rewind$fflush$ftell$feof$ferror本文主要介绍systemverilog中,文件输入输出相关的任务和函数。...
在uvm验证环境中我们可以用$psprintf来做格式化的信息打印,但是,有时候我们想将格式化打印的数据作为一个返回值,此时可以通过$sformatf来实现,其用法与$psprintf差别不大.pkt_num = $formatf("%0d",data_num);
uvm_primer ch19 reporting$display $error $fatal做打印,不能有一些控制;uvm 打印可以有多种设置UVM_VERBOSITY的方式
$display $error $fatal做打印,不能有一些控制;
uvm 打印
`uvm_info(<Message ID string>,<msg string>,<verbosity>)
`uvm_warning(<Message ID string>,<msg