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