目录

1.结构体

1.1 压缩结构体

1.2 非压缩结构体

1.3联合结构体

2.枚举类型

3.字符串


1.结构体

Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构,跟C 语言类似。 不过struct的功能少,它只是一个数据的集合,其通常的使用的方式是将若干相关的变量组合到一个struct结构定义中,如bit,int,string,logic都可以放入一个struct当中。

然后用typedef可以用来创建新的类型,并利用新类型来声明更多变量。

struct {bit [7:0] r, g, b;} pixel; // 创建一个pixel结构体
//为了共享该类型,通过typedef来创建新类型
typedef struct {bit [7:0] r, g, b;} pixel_s;pixel_s p1;//创建一个自定义的结构体的变量p1
pixel_s p2;//再定义一个p2

与数组类似,结构体也分压缩结构体和非压缩结构体。

1.1 压缩结构体

对于压缩结构体,在系统为该结构体开辟一个32/64位的内存后,将该结构体里面的数组全部放到这个内存中,定义方式:

typedef struct packed{bit [7:0] r;bit [7:0] g;bit [7:0] b;} pixel_t

和packed数组相似,将位宽合并到一起:

压缩结构体的赋值和packed数组类似,不需要'{ }:

typedef struct packed{bit [7:0] r;bit [7:0] g;bit [7:0] b;} pixel_s;
pixel_s my_pixel; // 声明变量
my_pixel = {8'h10, 8'h10, 8'h10}; //结构体类型的赋值

1.2 非压缩结构体

对于非压缩结构体,系统会为每个元素分别开辟一条32/64bits的内存,定义方式:

typedef struct{bit [7:0] r;bit [7:0] g;bit [7:0] b;} pixel_t

和unpacked数组类似,为每个元素单独开辟内存:

对于非压缩结构体的赋值和unpacked数组类似,需要用'{ }来进行赋值:

typedef struct {bit [7:0] r;bit [7:0] g;bit [7:0] b;} pixel_s;
pixel_s my_pixel; // 声明变量
my_pixel = '{'h10,'h10,'h10}; //结构体类型的赋值,不是一个整体,需要分开赋值

1.3联合结构体

联合结构体由于自身的一些限制使用较少(在某些SOC级的验证中,使用联合结构体为不同的寄存器建模),它是将多个结构体放入一个结构体中形成联合结构体:

typedef struct packed{bit [7:0] r;bit [7:0] g;bit [7:0] b;} pixel_rgb_t;//定义一个压缩结构体typedef struct packed{bit [15:0] y;bit [3:0] u;bit [3:0] v;} pixel_yuv_t;//定义一个压缩结构体typedef union packed{pixel_rgb_t rgb;pixel_yuv_t yuv;} pixel_t;//将上面两个组合在一起,注意union packed结构体中的成员必须有相同的位宽pixel_rgb_t rgb_test;//定义一个pixel_rgb_t类型的压缩结构体rgb_test
pixel_yuv_t yuv_test;//定义一个pixel_yuv_t类型的压缩结构体yuv_test
pixel_t pixel_test;//定义一个联合结构体pixel_testinitial beginrgb_test.r=8'h88;rgb_test.g=8'h99;rgb_test.b=8'haa;$display(“Color RGB is: R=%h, G=%h, B=%h”,rgb_test.r, rgb_test.g, rgb_test.b);yuv_test.y=16'h88;yuv_test.u=4'h9;yuv_test.v=4'ha;$display(“Color YUV is: Y=%h, U=%h, V=%h”,yuv_test.y, yuv_test.u, yuv_test.v);pixel_test = 0;$display(“Color RGB is: R=%h, G=%h, B=%h”,pixel_test.rgb.r, pixel_test.rgb.g,pixel_test.rgb.b);$display(“Color YUV is: Y=%h, U=%h, V=%h”,pixel_test.yuv.y, pixel_test.yuv.u,pixel_test.yuv.v);pixel_test.rgb.r=8'hab;pixel_test.rgb.g=8'hcd;pixel_test.rgb.b=8'hef;$display(“Color YUV is: Y=%h, U=%h, V=%h”,pixel_test.yuv.y, pixel_test.yuv.u,pixel_test.yuv.v);
end

仿真结果如下:

 联合结构体带来的好处和风险?

联合结构体可以通过对整体的赋值从而将联合结构体里面的结构体同步赋值;但可见对联合结构体中的一个结构体赋值,会同步将另一个结构体也赋值,因此无法将联合结构体中的结构体分别赋值。

2.枚举类型

对于一个状态机,进行状态跳转的时候,以前可能是利用参数化的方法表明状态:

parameter INIT   =2'b00;
parameter DECODE =2'b01;
parameter IDLE   =2'b10;

现在我们可以用枚举类型的数据变量来更方便的表示不同的状态:

typedef enum {INIT, DECODE, IDLE} fsmstate_e;//默认INIT=0,DECODE=1,IDLE=2
fsmstate_e pstate, nstate; // 声明自定义类型变量
……
case (pstate)IDLE: nstate = INIT; // 数值赋值INIT: nstate = DECODE;default: nstate = IDLE;
endcase
$display(“Next state is %s”, nstate.name()); // 显示状态名,如果不用.name,则显示编号:0/1/2

可见定义的枚举变量会默认为其中的元素赋值,当然我们也可以自定义其中的数值:

typedef enum {A=1,B,C,X=35,Y,Z} fsmstate_e;//此时A=1,B=2,C=3,X=35,Y=36,Z=37

枚举变量有且仅有一个数值。

需要注意的是,枚举类型会被当成int型变量存储,因此其默认值是0,所以如下给枚举赋值时由于并没有值为0的元素,但会被默认初始化为0,就会造成仿真时没有合适的枚举name而只有其默认值0:

仿真结果如下:

这种情况我们需要给枚举类型里的某个元素赋值为0即可

2.1枚举类型的操作

仿真结果:

枚举遍历:

2.2枚举类型的转换

枚举类型的默认值是二值的int,可以直接将枚举变量直接赋值给int,但是int不能直接赋值给枚举变量,需要做一个cast转换,可参见SV学习笔记—多态与类型转换

3.字符串

所有与字符串相关的处理,都使用string来保存和处理。 与字符串处理相关的还包括字符串的格式化函数,即如何形成一个你想要的字符串句子呢?可以使用SV系统方法$sformatf();

如果只需要将它打印输出,那么就使用$display()。

string s;
initial begins = "IEEE ";$display(s.getc(0)); // 显示第0个字母‘I’的ASCII码,73$display("%s", s.getc(0)); // 显示‘I’$display(s.tolower()); // 将大写变成小写,显示 ieees.putc(s.len()-1,"-"); // 将空格变为‘-’s = {s,"P1800"}; // "IEEE-P1800"$display(s.substr(2, 5)); // 将第2-5个字母提出来,显示 EE-Pmy_log($sformatf("%s %5d", s, 42)); // 创建一个临时字符串并将其打印
endtask my_log(string message); // 打印消息$display("@%0t: %s", $time, message);
endtask

SV学习笔记—结构体及枚举类型及字符串相关推荐

  1. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  2. golang学习笔记(结构体+json)

    结构体 结构体等价关系,只有==和!=关系,没有> < 关系,只有字段和属性完全相同,才等价,并且属于同一类型结构体,不同结构体不能比较,每一个不同的指针结构体的地址均不同 type Us ...

  3. Go语言学习笔记——结构体中使用tag标记

    文章目录 golang结构体中使用tag标记 简介 语法结构 快速入门 常见应用 应用json编码 应用xml编码 应用form表单绑定 gin框架form和数据绑定 golang结构体中使用tag标 ...

  4. 结构体,枚举类型与联合体

    目录 ​编辑 一.结构体的基本使用 1.什么是结构体 2.结构体的一般声明 3.结构体的特殊声明 4.结构体的自引用 5.结构体变量的定义和初始化 二.结构体内存对齐 1.内存对齐规则 3.为什么会存 ...

  5. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  6. c || 结构体 联合体 枚举类型 字符串

    文章目录 结构体struct :类型设计 结构体赋值 结构体类型指针 结构体的内存对齐 基本数据类型字节数 指定对齐值 联合体union 枚举:把需要的取值一一列举 枚举与#define的区别 字符串 ...

  7. 结构体、枚举类型和联合体

    文章目录 一:结构体的基本使用 1.什么是结构体 2.结构体的声明 (1):一般声明 (2):特殊声明 3.结构体的自引用 4.结构体变量的定义和初始化 二:结构体的内存对齐 1.内存对齐规则 2.练 ...

  8. C语言学习笔记---结构体的定义和初始化

      在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理. 结构体定义   要使用结构体时,首先要进行结构体的声明.声明的形式如下: struct 结构体名{ 结构体所包含的变量} ...

  9. STM32学习笔记——结构体

    寄存器结构体定义 头文件 当我们完成了第一个试验后,或许会发现在头文件的部分,如果我们只用到一个端口,定义的量还尚可,但如果当我们有多个端口需要定义时,那我们就需要重复上面的所有定义再改去端口名,这样 ...

最新文章

  1. SAP MM 物料号到物料的库存转移过账里的差异
  2. java -IO流_字符流
  3. leetcode算法题--最小的k个数
  4. python零碎知识(8):UserDict 类
  5. 帆软报表(finereport) 复选框多值查询
  6. 关于车机互联方式的一点想法
  7. 【转】C++中#include包含头文件带 .h 和不带 .h 的区别
  8. chararray遍历_数组常用的遍历方法 ——总结
  9. 手把手教你做用户画像:3种标签类型、8大系统模块
  10. socket、端口、进程的关系
  11. java 有序集合_java有哪些有序集合?
  12. JMETER 为什么需要分布式
  13. linux+fstab挂载镜像,通过/etc/fstab自动挂载iso镜像的ISO格式问题
  14. NV16 转 NV12
  15. SQL Server 2008 R2 完全卸载
  16. 二维码的实现原理和实现过程[纠错码编码]
  17. php gps坐标转换经纬度,GPS坐标(经纬度转换xy坐标算法)
  18. 7-1 电话聊天狂人 (25 分)
  19. python和c++实现 不改变长宽比缩放图片
  20. 深蓝色晶体Sulfo Cyanine5 azide,Sulfo-Cy5 N3,磺酸化CY5叠氮,水溶性Cyanine5叠氮基

热门文章

  1. nodejs安装淘宝镜像库
  2. ggplot之箱线图
  3. 如何用计算机快捷键代替鼠标,用鼠标代替快捷键,你的 Windows 还能这么操作?...
  4. Girlfriend(2021牛客多校第二场F)
  5. 删除oracle备份日志,TSM备份oracle归档日志,过期删除问题
  6. 计算机新教师汇报课报道,新教师汇报课活动报道.pdf
  7. js replace正则替换 \n
  8. Opencv学习笔记 图像拼接一全景拼接
  9. springboot redis 断线重连_Redis 客户端 Redisson
  10. DWDM(密集波分复用)入门简介