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.用戶自定義類型

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM