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

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