system verilog後續複習(二)

數據類型:

  • 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章