学习目标:
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