1. 数据类型

1.1 logic

  • 变量没有声明类型时,默认为logci
  • verilog中有两种基本的数据类型:变量和线网(net)。都为4状态(0、1、X、Z)
  • SystemVerilog中将Verilog中的reg进行了一定改进,使其除了作为一个变量外,还可以被连续赋值、门单元和模块所驱动。任何可以使用了reg和wire的地方都可以使用logic,除了存在多个结构性驱动场景时,例如,对双向总线建模时,应该申明线网类型(例如:wire),不能使用logic。
  • logic为4状态类型。

类型整理表

类型名 位宽 有无符号 状态 默认值
wire 1 4 Z
reg 1 4 X
logic 1 4 X
bit 1 2 0
int 32 2 0
byte 8 2 0
shortint 16 2 0
longint 64 2 0
integer 32 4 32{1‘bX}
time 64 4 64{1’bX}
  • 还有 real 型为双状态,双精度浮点数。
  • 相比2状态变量,仿真器通常需要多一倍的空间去存放4状态变量。
  • 有符号的变量,可以通过 unsigned 关键字来声明无符号情况,例如 int unsigned ui;

变量的默认值图

1.2 4状态和2状态之间转化导致的错误

4状态有X和Z,转化为2状态时,不论转化为了0/1,都不再是原来的X和Z。
下例中DUT为一个异步复位的DFF。

4状态波形(logic):

2状态波形(bit):

2. 定宽数组

2.1 数组的声明

  • verilog声明数组时要求给出数组的上下界
  • SystemVerilog声明定宽数组的时候,可以给出数组的上下界,也可以只给出数组宽度。
//一维数组
int a[0:15];   //16个整数 【0】...【15】
int b[16];     //16个整数 【0】...【15】    只给出数组宽度就是大端模式
int c[15:0];   //16个整数, a和b是一样的,c与其相反//多维数组
int a[0:7][0:3];
int a[8][4];
a[7][3] = 1;

2.2 数组的初始化

  • 可以直接声明的时候就初始化,或者先声明后初始化
  • 可以只给部分元素初始化赋值
  • 可以指定未赋值元素的初始值
int a[4] = '{0,1,2,3};         //对4个元素分别赋值0-3。 a[0]=0; a[1]=1; a[2]=2; a[3]=3;
int a[4:0] = '{0,1,2,3};       //a[3]=0; a[2]=1; a[1]=2; a[0]=3;
int b[4];
b = '{0,1,2,3};                //先声明,后赋值
b[0:2] = '{0,1,2};             //部分赋值
int c[5] = '{5{8}};            //5个值全赋值为8
int d[5] = '{6,7,default:1};   //{6,7,1,1,1}

3. 合并数组与非合并数组

  • 单比特的变量称为标量,多比特的变量称为向量。

  • 在Verilog和Sverilog中声明数组时,可以在数组变量名前、后声明"维度"。

  • 对于Verilog,声明在变量名前的"维度"叫做"vector width" dimension, 声明在变量名后的"维度"叫做"array" dimensions。

  • 对于Sverilog,声明在变量名前的"维度"叫做 packed array,声明在变量名后的"维度"叫做unpacked array

  • packed array 会将内容存放在一起,而 unpacked array 会随机存储。

    1. 一般SV仿真器在存放数组元素时使用32bit的字边界,所以byte、shortint和int是放在一个字中,而longint则存放在两个字中。
    2. 这里的三个b_unpack的存储地址是随机的,不一定在一起。

    1. 这里的5个barray的存储地址是随机的,不一定在一起。

3.1 多维数组

bit [3:0] [7:0] array1 [2] [3];
array1 [1][2][3][7] = 0;

4. 动态数组

  • 定宽数组的大小在编译时就确认了
  • 动态数组的大小在使用时才会确认,可以认为动态数组是一个在运行过程中才会被确认大小的定宽数组

4.1声明与初始化

  • 动态数组声明和赋值分开时,需要先使用new[ ]操作符来分配空间。
int dyn[];            //声明动态数组
dyn = new[5];         //分配5个元素,此时动态数组的宽度为5
dyn = new[20](dyn);   //重新分配20个元素,并将原dyn的值赋给新的dyn
dyn = new[100];       //分配100个元素,原先的值已丢弃(释放)
  • 动态数组声明和赋值一起的时候,就可以不需要new[ ]操作符
int dyn[] = '{0,1,2,3};          //声明动态数组,宽度为4,并赋值如下:dyn[0]=0;dyn[1]=1;dyn[2]=2;dyn[3]=3;

5.队列

5.1 声明与初始化

  • 队列的初始化不需要 '{ },而是 { }
int q[$];
int qq[$] = {1,2,3,3,2,1};

5.2 队列的特殊函数

  • push_front、push_back、pop_front、pop_back这四个函数只实用于队列,不能用于其他数组
int q2[$] = {1,2};
int q1[$] = {7,8,9};
q1.insert(1, q2);          //q1为{7,1,2,8,9}。在q1的第1位上插入q2

6. 关联数组

6.1 声明与初始化

  • 关联数组比较类似perl中的hash,python中的 dictionary
  • 关联数组名后为index的类型,关联数组名前为value的类型
  • 关联数组只会给已经赋值的元素分配存储空间,比较适合存储大容量的数组
 bit [63:0] mem[bit [15:0]];    //变量名:mem; index类型: bit[15:0]; 值的类型: bit[63:0]bit [3:0] assoc [string];

7. 创建用户自定义类型

  • 关键字为typedef
  • 注意将一个定宽数组定义为一种类型的写法
typedef bit [31:0] uint;    //uint就代表  bit[31:0] 这种类型
uint  aa;                   //等价于 bit[31:0] aa;  aa这个变量的类型就时bit [31:0]typedef int fixed_array5[5];  //fixed_array5为类型名,代表数组值为int、宽度为5的定宽数组类型
fixed_array5  aa;             //等价于int aa[5];

8. 创建struct

  • 关键字为typedefstructpacked
  • 使用typedef才是在声明一种类型,不然只使用struct那么就只临时申明一个变量
  • 结构中有多个成员,如果加入packed关键字,这些成员会被挨着存储在一起
  • struct packed 被当做一个向量存储,结构体的第一个成员在向量的最左边。向量的最低位是结构体最后一个成员最低位,其位编号为bit 0。(类似小端模式)
  • 默认情况是unpacked的
  • 经常会对结构这个整体进行操作时,建议使用packed
  • 经常操作的是结构中的个体,建议不使用packed
  • 注意下面代码中包含typedef和不含typedef的区别\color{red}{注意下面代码中包含typedef和不含typedef的区别}注意下面代码中包含typedef和不含typedef的区别
struct {bit[7:0] r,g,b;} pixel;    //pixel为变量名,是一个结构体变量。
struct packed {bit[7:0] r,g,b;} pixel;typedef struct {bit[7:0] r,g,b;} pixel_s;         //pixel_s为类型名
pixel_s  pixel ;                                  //pxiel为变量名
pixel = '{8'haa, 8'hbb, 8'hcc}                    //初始化
$display("%x %x %x",pixel.r, pixel.g, pixel.b);   //结构体成员的引用

9.创建Union

  • 关键字为typdef、packed、union\color{red}{typdef、packed、union}typdef、packed、union
  • 使用方式类似struct
  • 联合体只存储一个元素,但该元素可以有多种表示方法,每种表示方法可以是不同数据类型
  • Union内的成员公用同一存储空间。所以对其中一个成员赋值,其他成员也会相应变化,只是数据类型不同而已
  • 默认情况为unpacked的
  • VCS不支持编译unpacked的 union
  • Packed union members must have same size
  • 下图中my_u默认应该是my_u.a
  • 注意下面代码中包含typedef和不含typedef的区别\color{red}{注意下面代码中包含typedef和不含typedef的区别}注意下面代码中包含typedef和不含typedef的区别
union packed {byte      a;bit [7:0] b;} my_u;    //my_u为变量名,是一个union变量。typedef union packed {byte      a;bit [7:0] b;} tmp_u;    //tmp_u为类型名
tmp_u  my_u ;                                  //my_u为变量名
my_u.b = 8'hff;                    //初始化, my_u.a也变为8’hff,打印出来就是 -1
$display("%0d",my_u.b);

枚举类型

  • 关键字为typdef、enum\color{red}{typdef、enum}typdef、enum
  • 使用方式类似struct
  • 枚举类型会自动为列表{…}中的每个名称分配不同的数值,默认从0开始递增,有指定缺省值则为缺省值
  • 有点类似参数的作用,但是意义不大
  • 枚举类型变量无特殊声明默认为int存储,缺省值为0,所对应的 .name()也就是列表中分配数值为0的名称(下例中curr_state 默认为0,curr_state.name()就是IDLE)
//用parameter描述一个状态机的几种状态
parameter IDLE    = 2'd0;
parameter DETECT  = 2'd1;
parameter POLLING = 2'd2;
parameter L0      = 2'd3; //用枚举类型来表示
//当curr_state为 0~3 时,curr_state.name() 就分别为 IDLE ...
enum {IDLE, DETECT, POLLING, L0} curr_state;
  • 注意下面代码中包含typedef和不含typedef的区别\color{red}{注意下面代码中包含typedef和不含typedef的区别}注意下面代码中包含typedef和不含typedef的区别
enum {IDLE, DETECT, POLLING, L0} curr_state_e;   //curr_state_e 为变量名,是一个enum变量typedef enum {IDLE, DETECT, POLLING, L0} CURR_STATE_E;  //CURR_STATE_E为类型名
CURR_STATE_E curr_state_e;                              //curr_state_e为变量名
curr_state_e = 2;
$display("%s", curr_state_e.name());         //打印 POLLING
  • 定义枚举值
enum {INIT, DECODE=2, IDLE} fsmtype_e;    //0:INIT    2:DECODE    3:IDLE

SystemVerilog学习笔记1 ---《数据类型》相关推荐

  1. [SV]SystemVerilog学习笔记之struct union

    SystemVerilog学习笔记(四) 一.结构体(struct) 1.1.结构体声明(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct { // 通过var进行 ...

  2. SystemVerilog学习笔记(可综合的部分)(一)

    SystemVerilog学习笔记(一) 1. Verilog-1995的数据类型 2. 网络(net)类型 3.变量(variable)类型 4.向量(packed arrays) 5.数组(unp ...

  3. [Systemverilog学习笔记] Thread Communication-Event、Semaphore、mailbox

    [Systemverilog学习笔记] Thread Communication-Event.Semaphore.mailbox 学习目标: 通过下文了解Event.Semaphore.mailbox ...

  4. SystemVerilog学习笔记

    SystemVerilog学习笔记(会持续更新~) 文章目录 SystemVerilog学习笔记(会持续更新~) SV数据类型 固定数组 固定数组的声明格式 一维数组与二维数组 固定数组的一些操作 固 ...

  5. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  6. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  7. C++学习笔记1[数据类型]

    C++学习目录链接: C++学习笔记目录链接(持续更新中) 文章目录 一.数据类型 1.helloworld 2.注释 3.main函数.函数体.返回值 4.常量 5.变量 6.数据的输入和输出 7. ...

  8. javascript深入浅出——学习笔记(六种数据类型和隐式转换)

    在慕课之前学过JS深入浅出,最近发现很多东西都记不太清楚了,再复习一遍好了,感觉这个课程真的超级棒的,做做笔记,再添加一些学习内容?随时补充 课程大纲 1.数据类型 2.表达式和运算符 3.语句 4. ...

  9. 数据库学习笔记2--MySQL数据类型

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

最新文章

  1. lua 收不到服务器发来消息,lua 学习之错误处理
  2. vue2移动端使用vee-validate进行表单验证
  3. java wcf 未提供用户名_WCF的用户名密码认证
  4. getheaderfields java_java – HttpsURLConnection getHeaderFields没有返回set-cookie
  5. 创建android工程时Install Dependencies(安装依赖)提示
  6. WebKit DOM Event (一)
  7. 多项式相关操作学习笔记
  8. 更改linux子系统软件源为国内镜像
  9. sqlserver临时表操作
  10. Spark:相关错误总结
  11. 【图像分割】基于matlab遗传算法道路图像分割【含Matlab源码 779期】
  12. 【xv6 RISC-V】xv6操作系统原理解析与源代码阅读报告
  13. mysql源码解读——事务管理
  14. 路由交换复习选择题题库
  15. Python爬取小猪短租全网数据
  16. (纪中)2223. 母鸡下蛋(hen)
  17. ViewUI高保真 原型元件库操作指南
  18. scikit-learn中的PCA
  19. 申请免费SSL证书教程之华为云20张免费证书
  20. 人工智能是怎么用在人脸识别上的?

热门文章

  1. 靴子落地!Mobileye正式启动4D成像雷达量产进程
  2. 电脑运行卡顿,只需三步轻松解决
  3. 今日新出 CV 论文汇总(含医学图像、目标检测、唇语识别、SLAM等)
  4. Mac端 淘宝买的廉价 Arduino Mega 2560 的驱动
  5. 计算机不能启动任务管理器,win10系统无法打开任务管理器怎么办
  6. (转)《一定要争气》
  7. shell读取键盘输入
  8. avr c语言编译器,AVR单片机C语言编译器-20210409071159.docx-原创力文档
  9. 写推文满一年,分享 5 个小编常用的写作软件
  10. DeepLink的实现原理