SystemVerilog文本值和数据类型
1、增强的文本值赋值
给一个向量赋予文本值
在Veirlog语言中,一个向量可以很容易地赋值为全00、全x(不确定)或全z(高阻态)。
parameter SIZE = 64;
reg [SIZE-1 :0] data;
data = 0;//将数据各位置0
data = 'bz;//将数据各位置z
data = 'bx;//将数据各位置x
上例中每个赋值都是可扩展的。如果SIZE参数被重新定义,如128,赋值会自动扩展到data的新长度。但是Verilog并未提供一种将向量赋为全1的方便途径。为了将一个文本值所有位都置1,必须指定一个固定长度。
data = 64'hFFFFFFFFFFFFFFFFF;
为了使所有全1赋值都是可扩展的,Verilog设计者必须学习编码技巧,例如使用一些操作类型来对向量赋全1,而不是指定文本值。
data = ~0;//0的补码运算
data = -1;//2的补码运算
给一个向量赋予特殊的文本值
SystemVerilog在两个方面增强了文本值的赋值。第一,增加了一个更简单的语法,可以指定要赋的值,而不用指定进制。第二,赋值可以是逻辑1.这个语法指定所有位被赋予什么值,该值前面有个硬撇号(’)。
'0:将左边的所有位赋为0
'1:将左边的所有位赋为1
'z或者'Z:将左边的所有位赋为z
'x或者'X:将左边的所有位赋为0
注意:硬撇号(')不同于重音符号(`)
data = 'b1; //将data的所有位置为1
文本值随左手边向量宽度扩量
2、`define增强
SystemVerilog扩展了Verilog宏文本替换–`define的功能,是宏文本可以包含特殊字符。
`"允许字符串内的宏变量替换
字符串内的宏变量替换
Verilog允许在`define宏中使用双引号("),但是双引号内文本变成文本串。也就是说,在Verilog中,
不可能采用在字符串中嵌入宏变量的文本替换宏创建字符串。
SystemVerilog可以进行宏文本字符串的变量替换,这是通过在形成字符串的引号前加重音符号(`)
来实现。
//本例文本替换的目的是将所有出现的宏变量v变量替换为实际的变量值data。
`define print(v)\$display(`"variable v = %h`",v);
`print(data);
在Verilog中,为了不影响表示字符串的双引号,字符串内嵌入的引号必须带转义符: \ "
$display("variable \"data\" = %h",data);
当字符串是包含变量替换的文本替换宏的一部分时,对嵌入的双引号仅使用转义符是不够的,必须使用
’ \ '"
`define print(v)\$display(`"variable '\'"v'\'" = %h`",v);
`print(data);
通过宏建立标识符名
使用Verilog的’define,不可能通过连接两个或多个文本宏来建立一个新的标识符。原因是创建的标识符名各部分之间总是有一个空格。
在宏文本中,“作为不引入空格的分隔符
SystemVerilog提供了一个不引入空格的方法,使用两个连接的重音符(”),使两个或多个文本宏连接成一个新的名字。
在多次使用一组相似的名字,并且无法使用数组的情况下,应用(")可以简化源代码。
需要定义多个名字相似的两态bit变量和wand线网,并且将变量持续赋值给线网。
这个bit变量可以使用局部过程赋值,而这个wand线网是可以有多个驱动的线逻辑它的一个驱动时两态变量:bit
bit类型类似于Verilog的reg类型,但是bit类型只能储存两态值,而reg类型可储存四态变量。
//在无文本替换的源文件中
bit d00_bit; wand d00_net = d00_bit;
bit d01_bit; wand d01_net = d01_bit;
...//每一位都重复60多次
bit d62_bit; wand d62_net = d62_bit;
bit d63_bit; wand d00_net = d62_bit;
//使用SystemVerilog对`define增强
`define TWO_STATE_NET(name) bit name"_bit;\
wand name"_net = name"_bit;
`TWO_STATE_NET(d00)
`TWO_STATE_NET(d01)
...
`TWO_STATE_NET(d62)
`TWO_STATE_NET(d63)