SV学习笔记(1)

  • Post author:
  • Post category:其他




学习目标:

SV绿皮书第二章:数据类型



学习内容:

1.logic 不能有多个结构性驱动

2.

四值逻辑类型 二值逻辑类型

integer

、logic、reg、net-type(wire、tri)

byte



shortint



int



longint

、bit
有符号 无符号
byte、shortint、int、longint、integer bit、logic、reg、net-type(wire、tri)
byte a=8'b1000_0000;
bit [8:0] b;
b=a;				//8位变9位,有符号8位先添加,再改为无符号
b=unsigned'(a);		//先转换为无符号,再添加

4.显示转换:静态转换(单引号)、动态转换($cast(a,b)—-b类型转a类型)

隐式转换:直接=

四值/二值、有无符号、位宽

5.定宽数组

声明:int a[0:15];

赋值:`{0,1,defualt:-1};

数组:[合并]a[非合并] (合并:连续存储,定义格式必须为[A:B])

6.for和foreach

//数组a
for(int i=0;i<$size(a);i++)
foreach(a[i,j])
//方阵
foreach(a[i,])
	foreach(a[,j])

7.数组的聚合比较(==)和复制(=)

算术运算不能使用聚合操作,逻辑运算(循环/合并数组)

8.使用@操作符,只能将标量/合并数组作为敏感信号

9.动态数组:new[]

int a[],b[];	//声明动态数组
initial begin
	a=new[5];	//分配5个元素
	a='{5{1}};
	b=a;		//复制
	a=new[20](a);	//分配20个整型值,并复制原来的5个值
	a=new[10];		//分配100个新的整数值
	a.delete();		//删除

10.队列:

a[$]


pop:删除

push:插入

front:队列前

back:队列尾

例子:a.pop_front; //删除第一个元素

a.push_back; //在队列尾插入元素8

a.delete(1); a=a[1:$]; //删除第一个元素

a.delete(); a={ }; //删除整个队列

11.关联数组声明:在方括号内放置数据类型

bit  [63:0]	 a[int[63:0]];		//存储数据为64位bit类型,索引为64位int类型

索引类型可以是字符串

12.数组缩减:sum、product(积)、and、or、xor(异或)

13.从数组中随机选取一个元素:

定宽数组、队列、动态数组和关联数组—-

$urandom_range($size(array)-1)

(关联数组索引需要逐个访问元素,通过比较得到)

队列和动态数组(额外方法)—–

$urandom_range(array.size()-1)

例:

element=$urandom_range(a.size()-1) ;

14.数组定位

int a[5]='{1,2,3,4,5};		//定宽数组
int b[]='{1,2};				//动态数组
int c[$]={1,1,3,4,5};		//队列
int d[$];
d=a.min();		//{1}
d=b.max;		//{2}
d=c.unique;		//{3,4,5}

min、max、unique函数它们返回的是一个队列而非标量

with的使用

d=a.find with (item>3);							//{4,5}
d=a.find_index with (item>3);					//{3,4}
d=a.find_first_index with (item==2);			//{1}

item为重复参数,代表一个单独的元素,可随意取名字

d=a.sum with (item>1};			//4      : 2,3,4,5
注意:sum加的是条件表达式为真的次数

15.返回值为索引(index)的数组定位方法,其返回的队列类型为int,而非四值类型的integer

16.数组的排序

翻转:a.reverse();

递增:a.sort();

递减:a.rsort();

打乱:a.shuffle();

reverse和shuffle不能带with条件语句,作用范围为整个数组

例:

a.sort with (item>2);

17.结构体

创建一个pixel类型:

struct  {bit [7:0] r,g,b;} pixel;

创建一个新的类型,在端口和程序中共享:

typedef struct  {bit [7:0] r,g,b;} pixel_s;
pixel_s	my_pixel;			//_s代表用户自定义类型(书中)

结构体初始化:

initial begin
	typedef	struct	{int a; byte b; shortint c; int d;}	  my_struct_s;
	my_struct_s  st='{32'haaaa_aaaad,8'hbb,16'hcccc,32'hdddd_dddd};
end

注意:初始化大括号前面单撇 创建时花括号前分号

18.合并结构—-struct packed

19.流操作符

b={<<4{8'b0011_0101}};				//0101_0011半字节倒序
{>>{q,r,s,t}}=j;								//把j分散到四个字节变量里
h={>>{t,s,r,q}};								//把字节集中到h里

使用流操作符时注意下标大小顺序正确,左侧由高到低,右侧由低到高

20.流操作符可以在结构和数组之间转换,具体例子见P44

21.int=enum //合法

enum=T’(int) //必须显示转换,且静态类型转换不做类型检查,可能会越界

22.枚举

枚举类型会被当成int类型,int类型缺省值为0,所以指定第一个枚举值为1时,变量默认初始化为0,导致错误。

遍历枚举类型用do while,先循环后判断

prev() —-返回前一个枚举类型

23.表达式位宽

bit [1:0] a2;

bit a=1’b1;

$displayb(a+a); //A:1+1=0

a2=a+a;

$displayb(a2); //B:1+1=2

$displayb(a+a+2’b0); //C:1+1=2,使用了常量

$displayb(2’(a)+a); //D:1+1=2,使用了强制类型转换



问题:

P32 verilog系统函数讲解参考:

https://blog.csdn.net/dongdongnihao_/article/details/104963780?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscanv2&utm_relevant_index=1

$displayb ???



学习时间:

早:9-11.30

中:15-17.30

晚:20-22



版权声明:本文为yuyi111c原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。