System Verilog基础(一)

学习文本值和基本数据类型的笔记。

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语言有不同,字符串末尾不是"\n"。

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.用户自定义类型

猜你喜欢

转载自www.cnblogs.com/yiwenbo/p/10103207.html