学习文本值和基本数据类型的笔记。
1.常量(Literal Value)
1.1.整型常量
例如:8‘b0 32'd0 '0 '1 'x 'z
省略位宽则意味着全位宽都被赋值。
例如:
wire [7:0] sig1; assign sig1 = '1; //sig1 = 8'b11111111
1.2.实型常量
支持小数或者科学型表示,例如:3.14 2.0e3
real a = 3.14;
1.3.字符串常量
前后用双引号引起来,和C语言有不同,字符串末尾不是" "。
string s = "System Verilog"; bit [7:0] d = "sv"; //也可以赋值给整型
1.4.数组常量
和C语言类似
int array[1:2] = {5,6};
1.5.结构体常量
typedef struct{ int a; string b; real c; } name_1; name_1 var; var = {10, "sv", 1.24};
1.6.时间文本值(Time Literal)
`timescale 1ns/100ps //时间单位是1ns,时间精度是100ps module test; initial begin #20; //相当于20ns #20ns; #5.18ns; //相当于5.2ns,因为时间精度是100ps,即0.1ns,自动进位了 #1step; //相当于100ps end endmodule
`timescale必须定义在模块的外面,使用关键字timeunit和timeprecision只能定义在模块内部,只会影响单个模块。
`timescale 1ns/100ps //时间单位是1ns,时间精度是100ps module test; timeunit 1ns; timeprecesion 10ps; initial begin #20; //相当于20ns #20ns; #5.18ns; //相当于5.18ns,因为时间精度是10ps,即0.01ns,不需要自动进位 #1step; //相当于10ps end endmodule
2.基本数据类型
2.1.整型
类型 | 描述 | 符号 |
bit | 2态,自定义位宽 | 默认无符号 |
shortint | 2态,16bit | 有符号signed |
int | 2态,32bit | 有符号signed |
longint | 2态,64bit | 有符号signed |
byte | 2态,8bit | 有符号signed |
logic | 4态,自定义位宽 | 有符号signed |
reg | 4态,自定义位宽 | 有符号signed |
integer | 4态,32bit | 有符号signed |
time | 4态,64bit | 无符号 unsigned |
2态只有1和0;4态是0,1,Z,X。2态数据类型不初始化,则默认是0;4态数据类型不初始化,则默认是X。不要用2态的数据类型去做ADC数据采集。在对4态数据类型做比较的时候,使用三个等号(a === b),而不两个等号(a == b)。2态和4态数据类型是可以相互转化的。从4态转化倒2态,那么4态中的Z和X会默认为2态的0。注意time类型是整数类型,64bit位宽。
2.1.1logic类型
在SV中增加了logic类型,是reg类型的增强。在verilog中,一般输入会定义成wire类型,但是在SV中,输出和输入都定义成logic就行。
module( output reg a, input wire b ); endmodule SV: module( output logic a, input logic b ); endmodule
在verilog中,reg类型只能在always块中被赋值,不能用assign来赋值,但是logic类型可以在always块中和assign中被赋值。
2.2.实数类型
分为real data和shortreal data。real data相当于C语言中的double类型,64bit位宽,2态;shortreal data相当于C语言中的float类型,32bit位宽,2态。
real a=3.15; shotreal b = 4.5;
2.3.字符串类型
初始值是空字符。字符串的比较按照ASIC码来比较。使用[]来索引,随意改变和取值。
string s0 = "hello"; //不用定义大小 string s1 = " world !!"; //注意有个空格 string s; initial begin s1[0] = ","; // s1 = ",world !!",逗号替换了空格 if(s0!=s1) s = {s0, s1}; //"hello,world !!" s = {2{s0}, s1}; //"hellohello,world !!" end
其他的一些字符操作:atobin(), atioct(), atoi(), atoreal()......用到再做笔记。
s = "CQUPT"; s.putc(0,"A"); //相当于s[0] = "A"; 最终s = "AQUPT"; //s.getc(0); 相当于获得字符 //s.len(); 计算字符串长度为5 //s.lower(); 把大写的变成小写的 //s.substr(2,4); 取出字符串中的2到4位 s = $psfrintf("%s %5d",s,100); //不同于$display,输出为s = "AQUPT 100";
2.4.常量(constant data type)
在变量前面加const,如果用户把这个变量改变了,那么仿真器会报错。按照C语言中的const来理解。
2.5.空类型(void data type)
SV中定义function也是可以有返回值的,如果不想有返回值,那么在定义function后面添加void。调用有返回值的函数,但是不想用返回值,这个时候在调用函数的前面加void'(fun1());就可以了。不然会有warning,在验证中最好不要有警告。
2.6.用户自定义类型