數據類型:
- Fixed Size Array(定寬數組)
支持多維數組,超出邊界的寫會被忽略,超出邊界的讀會返回x(即使是二值邏輯),byte、shortint、int均存儲在32位中(unpacked array)
int lo_hi[0:15];//16 int
int lo_hi[16];
int array[0:7][0:3];
int array[8][4];
bit [16:1] b_unpacked [1:3];//位寬不可以只寫一位
b_unpacked[1]=`0;//賦初值`{{3},`{15{8}}}
b_unpacked[2]=`1;
b_unpacked[3]=`0;
initial
begin
bit[31:0] src[5],dst[5];
for(i=0;i<$size(src);i++)
begin
src[i]=i;
dst[i]=2*i;
end
end
或者使用foreach
initial
begin
bit[31:0] src[5],dst[5];
foreach(src[i])
src[i]=i;
end
壓縮數組:(只有定寬數組可以被壓縮)
//packed array
bit [3:0] [7:0] bytes;//壓縮數組聲明在前,必須高位在前,低位在後
bytes=32'habcdefab;
$displayh(bytes,bytes[3]);
壓縮數組與非壓縮數組混合:
//mixed packed and unpacked array
bit [3:0] [7:0] p_array [0:2];
//第一個維度是非壓縮數組,之後按順序排列
- Dynamic Array(聲明一個數組,但是又不知道數組的大小)
數組大小在運行階段確定,而不是編譯階段,通過new[]分配空間,只要數據基本類型一致,定寬數組可以賦值給動態數組,$size返回數組大小
int dyn[];
initial
begin
dyn=new[5];
foreach(dyn[j])
dyn[j]=j;
$display(dyn[0]);
dyn=new[20](dyn);//前5個仍爲dyn,新建15個空間
dyn=new[100];
dyn.delete();
end
- Queue (data_type queue_name[$]; )
可以做簡單的排列,尋找;可以容易添加和刪除元素;不需要new[]操作符,push和pop方法,可以將數組中的數據拷貝到隊列中
int j=1;
b[$]={3,4};
q[$]={0,2,5};
initial
begin
q.insert(1,j);//{0,1.2.5}
q.insert(2,b};//{0,1,3,4,2,5}
q.delete(1);//{0,3,4,2,5}
q.push_front(6);//{6,0,3,4,2,5}
j=q.pop_back;//5
end
- Associative Array(data_type associative_array_name[*])
索引可以不爲數,可以使用爲鬆散存儲, *可以爲string等其他類型,具有first,next,prev,delete,exists(元素是否存在)
logic [63:0] assoc[*],idx=1;
repeat(64) begin
assoc[idx]=idx;
idx=idx<<1;
end
- Array Methods(能夠使用與非壓縮數組fixed,dynamic,queue,associate)
sum,product,and,or和xor
sort,rsort,reserve,find_first,find_first_with_index,unique
- Structures
struct{
int a,b;
logic [7:0] opcode;
logic [23:0] address;
bit error;
}instruction_word
可以使用關鍵字packed將unpacked轉爲packed
struct packed{
logic valid;
logic [7:0] tag;
logic [31:0] data;
}data_word
data_word.tag=8'hf0;
data_word[39:31]=8'hf0;
- Enumerated Type
(將數字隱藏,通過名字來表明)默認爲int類型,也可以使用first,next,prev等方法尋找
enum{red,green,blue}RGB;
enum{red=1,green=2,blue=4}RGB;
enum logic[2:0] {red=3'b000,green=3'b001,blue=3'b010} state;
verilog與sv的一些區別:
verilog可以賦值全0,全x,全z,但是不能賦值全1
parameter SIZE=64;
reg [SIZE-1:0] data;
data=0;
data=`bz;
data=`bx;
data=64'hffff_ffff_ffff_ffff;
如果換成systemverilog,首先不需要寫進制,其次可以賦值爲全1
parameter SIZE=64;
logic [SIZE-1:0] data;
data=`0;
data=`z;
data=`x;
data=`1;
logic類型(4值邏輯)與reg類型的區別:
1、可以被連續賦值驅動
2、不能被多驅動
二值邏輯:(遠離DUT,避免將x,z轉化爲0(不能代表初始狀態)不能如實反饋DUT的狀態)
- bit(1bit,unsigned)
- byte(8bit,signed)
- shortint(16bit,signed)
- int(32bit,signed)
- longint(64bit,signed)
$isunknown操作符如果表達式是x或者z的話,就會返回1