system verilog笔记

更新时间:2023-11-09 05:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第三章 数据类型

两态SystemVerilog数据类型,16位有符号整数 两态SystemVerilog数据类型,32位有符号整数 两态SystemVerilog数据类型,64位有符号整数

两态SystemVerilog数据类型,8位有符号整数或ASCII码字符 两态SystemVerilog数据类型,用户定义的向量尺寸 四态SystemVerilog数据类型,用户定义的向量尺寸 四态Verilog-2001数据类型,用户定义的向量尺寸 四态Verilog-2001数据类型,32位有符号整数 四态Verilog-2001数据类型,64位无符号整数

3.3 整数数据类型 shortint int longint byte bit logic reg integer time

3.3.1 integral类型

integral指的基本的整数数据类型、压缩数组、压缩结构体、压缩联合体、枚举类型和时间类型。

3.3.2 两态(两值)与四态(四值)数据类型

具有未知值(X)和高阻值(Z)的类型称为四态类型,包括logic、reg、integer和time。其它不具有未知值及高阻值的类型称为两态类型,例如bit和int。

int和integer的区别是:int是两态逻辑而integer是四态逻辑。四态值需要一个额外的位来编码X和Z状态。两态数据类型的仿真速度更快一些,而且占用更少的内存,因而在某些设计风格中成为首选数据类型。 3.3.3 有符号与无符号数据类型

整数类型使用整数算术,并且可以是有符号的也可以是无符号的。这些会影响某些操作码的含义,例如“<”等

int unsigned ui; int signed si;

缺省情况下,byte、shortint、int、integer和longint是有符号的。bit、reg、logic以及这几种类型的数组在缺省情况下是无符号的。

注意:signed关键字是Verilog-2001的一部分。unsigned关键字在Verilog-2001中是保留关键字,但未被使用。 3.4 real与shortreal数据类型

real1数据类型来自于Verilog-2001,与C语言中的double数据类型相同。shortreal数据类型是一个SystemVerilog数据类型,与C语言中的float数据类型相同。

3.5 void数据类型

void数据类型代表数据不存在。这种类型可以用作函数的返回类型,表示没有返回值。这种数据类型还可以用于标签联合体的成员。

3.6 chandle数据类型

chandle数据类型的声明语法如下:

chandle variable_name;

其中variable_name是一个有效的标识符。chandle类型的变量总是被初始化成null值,它在C语言中具有0的值。chandle类型的使用是非常受限的,仅仅在下列情况下能够合法使用:

? chandle变量仅仅能够使用下列操作符:

o 与另外一个chandle变量或与null进行相等(==)和不等(!=)操作; o 与另外一个chandle变量或与null进行条件相等(===)和条件不等(!==)操作(与==和!=具有相同的语义);

? 可以作为一个布尔值进行检测,如果chandle变量为null则为0,否则为1。 ? chandle变量仅能执行如下的赋值操作:

o 赋值为另外一个chandle变量; o 赋值成null;

? chandle变量可以插入到联合数组(参看4.9节)中,但这样的联合数组中的任意两个条目的相对顺序都是变化的,甚至在相同工具的两次连续运行中也是如此; ? 可以在类中使用chandle;

? chandle可以作为参数传递给函数或任务; ? chandle可以从函数中返回; 在下列情况中chandle的使用是受限的:

? 端口中不应该有chandle数据类型;

? chandle不能被赋值到其它任何数据类型的变量; ? 在下列情况中不能使用chandle:

o 除了上面说明的表达式外的任何其它表达式; o 作为端口;

o 在敏感列表或事件表达式中; o 在连续赋值语句中; o 在联合体中; o 在压缩类型中; 3.7 string数据类型

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

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

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

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

FPGA技术网提示:

string类型变量的索引从字符串的左侧开始排列,例如:对字符串\,索引0对应\,索引1对应\,依此类推...。

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

string variable_name [= initial_value];

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

string myName = “John Smith”;

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

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

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

byte c = \; // 将c赋值为”A”

bit [10:0] a = \; // 将a赋值为’b000_0100_0001 bit [1:4][7:0] h = \; // 将h赋值为”ello”

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

string s1 = \; // 将s1设置为\ bit [11:0] b = 12'ha41;

string s2 = b; // 将s2设置为'h0a41

第二个例子:

reg[15:0] r; integer i = 1; string b = \; string a = {\,b}; r = a; // OK

b = r; // OK (隐式强制类型转换,可以发布一个警告) b = \; // OK b = {5{\}}; // OK

a = {i{\}}; // OK(非常量复制) r = {i{\}}; // 无效(非常量复制)

a = {i{b}}; // OK a = {a,b}; // OK a = {\,b}; // OK

r = {\,\}; // 产生\,\被转换成8'b0 b = {\,\}; // 产生\,\是空字符串 a = {a,b}; // OK

a[0] = \; // OK, 与a[0] = \相同

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

操作符 Str1==Str2

语义

相等。检查两个字符串是否相等。如果相等则结果为1,否则结果为0。两个字符串的类型可以都是string,或者其中一个为字符串文本。如果两个均为字符串文本,那么表达式与Verilog中对整数类型的相等操作符相同。可以使用空字符串(\)。 不等。==的逻辑否。

比较,关系操作符。使用两个字符串的词典编撰顺序比较,如果对应的条件为真则返回1。比较类似于ANSI C的strcmp函数(或字符串比较方法)(以词汇顺序),并且包含嵌入的空字节。两个操作数可以都是string类型,或者其中一个是字符串文本。 串联。每一个操作符都可以是string类型或一个字符串文本(它会被隐式地转换成string类型)。如果至少一个操作数为string类型,那么表达式计算成串联字符串并且具有string的类型。如果所有的操作数都是字符串文本,那么表达式的行为就像Verilog中integral类型的串联一样。如果结果接着使用在一个调用string类型的表达式中,那么它被隐式地转换成string类型。

Str1!=Str2 Str1Str2 Str1>=Str2 {Str1,Str2,…, Strn}

{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还包含许多特殊的方法来对字符串进行操作。这些方法使用内建的方法符号。这些方法将在接下来的几节中描述

3.7.1 len()

function int len()

? str.len()返回字符串的长度,也就是字符串中字符的数目(不包括任何终结字符)。

? 如果str是\,那么str.len()返回0。 3.7.2 putc()

task putc(int i, string s) task putc(int i, byte c)

? str.putc(i, c)将str中的第i个字符替换成指定的integral值; ? str.putc(i, s)将str中的第i个字符替换成s中的第一个字符; ? s可以是赋值为一个字符串的任何表达式;

? putc不会改变str的尺寸,如果i < 0或i >= str.len(),那么str不会发生改变;

注意:str.putc(j, x)在语义上等价于str[j] = x。

本文来源:https://www.bwwdw.com/article/vbyv.html

Top