1. 程式人生 > >System Verilog基礎(一)

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.使用者自定義型別