返回介绍

3.7 string数据类型

发布于 2020-09-09 22:55:43 字数 4260 浏览 1339 评论 0 收藏 0

SystemVerilog包含一个string数据类型,它是一个可变尺寸、动态分配的字节数组。SystemVerilog还包含许多特殊的方法来对字符串进行操作。

Verilog也支持字符串文本,但这种支持仅仅是在词法级别上。在Verilog中,字符串文本表现为一个具有宽度为8位整数倍的压缩数组。当一个字符串文本被赋值到一个具有不同尺寸的integral类型的压缩数组变量的时候,它或者被截短到变量的尺寸或者必要时在左侧填补0。

在SystemVerilog中,字符串文本的表现行为与Verilog相同。然而,SystemVerilog还支持string数据类型,我们可以将一个字符串文本赋值到这种数据类型。当使用string数据类型来替代一个integral变量的时候,字符串可以具有任意的长度并且不会发生截短现象。当文本字符串赋值到一个string数据类型或者在一个使用string类型操作数的表达式中使用的时候,它会被隐式地转换成string数据类型。

string类型的变量可以从0到N-1(数组的最后一个元素)进行索引,而且可以作用于一个特殊的空字符串:""。从一个字符串读取一个元素会产生一个字节。

FPGA技术网提示:
string类型变量的索引从字符串的左侧开始排列,例如:对字符串"Hello World!",索引0对应"H",索引1对应"e",依此类推...。

string类型变量的声明语法如下:

string variable_name [= initial_value];

这里的variable_name是一个有效的标识符,可选的initial_value可以是一个字符串文本也可以是一个空字符串("")。例如:

string myName = “John Smith”;

如果在声明中没有指定初始值,变量会被初始化成空字符串("")。

SystemVerilog提供了一组操作符,这些操作符可以用来处理字符串变量和字符串文本的组合。string数据类型的基本操作符在表格3-2中给出。

一个字符串文本可以被赋值到一个string或integral类型的变量。如果它们的尺寸不同,字符串文本会进行右调整,并且在必要的时候在左侧进行截短或者在左侧填补0。例如:

byte c = "A";                  // 将c赋值为”A”
bit [10:0] a = "\x41";         // 将a赋值为’b000_0100_0001
bit [1:4][7:0] h = "hello";    // 将h赋值为”ello”

一个string、字符串文本、或压缩数组可以被赋值到一个string变量。string变量可以增长或缩减以便容纳压缩数组。如果压缩数组的尺寸(以位为单位)不是8的整数倍,那么压缩数组会在左侧填入0。例如:

string s1 = "hello";   // 将s1设置为"hello"
bit [11:0] b = 12'ha41;
string s2 = b;         // 将s2设置为'h0a41

第二个例子:

reg [15:0] r;
integer i = 1;
string b = "";
string a = {"Hi", b};
r = a;           // OK
b = r;           // OK (隐式强制类型转换,可以发布一个警告)
b = "Hi";        // OK
b = {5{"Hi"}};   // OK
a = {i{"Hi"}};   // OK(非常量复制)
r = {i{"Hi"}};   // 无效(非常量复制)
a = {i{b}};      // OK
a = {a, b};      // OK
a = {"Hi", b};   // OK
r = {"H",""};    // 产生"H\0",""被转换成8'b0
b = {"H",""};    // 产生"H",""是空字符串
a = {a, b};      // OK
a[0] = "h";      // OK, 与a[0] = "hi"相同

表格 3-2:字符串操作符

操作符语义
Str1 == Str2相等。检查两个字符串是否相等。如果相等则结果为1,否则结果为0。两个字符串的类型可以都是string,或者其中一个为字符串文本。如果两个均为字符串文本,那么表达式与Verilog中对整数类型的相等操作符相同。可以使用空字符串("")。
Str1 != Str2不等。==的逻辑否。
Str1 < Str2 Str1 <= Str2
Str1 > Str2 Str1 >= Str2
比较,关系操作符。使用两个字符串的词典编撰顺序比较,如果对应的条件为真则返回1。比较类似于ANSI C的strcmp函数(或字符串比较方法)(以词汇顺序),并且包含嵌入的空字节。两个操作数可以都是string类型,或者其中一个是字符串文本。
{Str1, Str2, …, Strn}串联。每一个操作符都可以是string类型或一个字符串文本(它会被隐式地转换成string类型)。如果至少一个操作数为string类型,那么表达式计算成串联字符串并且具有string的类型。如果所有的操作数都是字符串文本,那么表达式的行为就像Verilog中integral类型的串联一样。如果结果接着使用在一个调用string类型的表达式中,那么它被隐式地转换成string类型。
{multiplier{Str}}复制。Str可以是string类型或者是字符串文本。multiplier必须是integral类型并且可以是非常量。如果multiplier是非常量或者Str是string类型,那么结果就是包含N个Str串联的字符串,其中N由multiplier指定。如果Str是一个文本并且multiplier是常量,那么表达式的行为就类似于Verilog中的数值复制(如果结果被使用在另一个调用string类型的表达式中,那么它被隐式地转换成string类型)。
Str[index]索引。返回一个字节,值为给定索引的ASCII码。索引的范围从0到N-1,其中N为字符串中字符的数目。如果给定的索引超出了范围,那么返回0。在语义上等价于Str.getc(index),参见3.7.3节。
Str.method(…)圆点(.)操作符用来调用字符串的一个特定方法。

SystemVerilog还包含许多特殊的方法来对字符串进行操作。这些方法使用内建的方法符号。这些方法将在接下来的几节中描述。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文