【SystemVerilog基础】2.类型

2.1选择存储类型

灵活性:如果数组的索引是连续的非负整数0、1、2、3等等,则应该使用定宽或者动态数组,长度可变的数据包使用动态数组。

存储用量:使用双状态类型可以减少仿真的存储器用量,尽量使用32比特的整数倍最为数据带宽

速度:应该根据每个时钟周期内的存取次数来选择数组类型

排序:如果元素是一次性加入的话,则应该选择定宽或者动态数组,逐个加入的话则应该选择队列,队列的首尾加入元素的效率很高

选择最优的数据结构:网络数据包选择定宽或者动态数组;期望保存的计分板选择队列;有序结构按照可预见的输出顺序可以使用队列,否之选择关联数组;超百万的特大容量存储器进行建模选择关联数组;文件的命令名或者操作码选择字符串。

2.2 typedef创建新类型

typedef语句可以创建新类型,在Verilog中使用的自定义的类型宏一般都是文本替换,并没有创建新的类型,在SV里面可以通过typedef创建新类型。

typedef reg [OPSIZE-1:0] opreg_t;
opreg_t op_a,op_b;

2.3 struct创建类型

struct语句可以创建结构,struct只是把数据组织到一起,是一个数据的集合,所以是可综合的

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

pixel只是创建的一个变量,如果想要在端口和程序中共享它,可以创建一个类型

typedef struct {bit [7:0] r,g,b;} pixel_s;
pixel_s my_pixel;

2.4 枚举类型

之前一直使用的文本宏,作用范围很大,而且大多数的情况下是对调试者是可见的,枚举创建了一种强大的变量类型,有利于编写和维护代码,枚举类型可以为列表中的每个名称分配不同的数值。枚举类型的缺省类型为双状态int,所以如果没有特别指出的话,枚举类型会被当做int存储类型

enum {RED,BLUE GREEN} color;

枚举类型的子程序:

first()返回第一个枚举常量;last()返回最后一个枚举常量;next()返回下一个枚举常量;next(N)返回第N个枚举常量;prev()返回前一个枚举常量;prev(N)返回前第N个枚举常量;

2.5 字符串

所有与字符串相关的处理,都可以用string来保存和处理。  可以使用$display()和$sformatf() 来打印    

string s;
s="IEEE";

2.6 类型转换

静态转换:不对转换值进行检查,转换时指定目标类型,并在需要转换的表达式钱穆安加上单引号就可以了

int i;
real r;

i=int'(10.0-0.1);
r=real'(42);

动态转换:动态转换函数$cast 允许你对越界的数值进行检查

静态转换+动态转换等于显示转换,如果源变量和目标变量的比特分布是一样的,那么就可以通过静态转换和动态转换的方法来相互转换,如果不一样的话则需要流操作对比特分布重新安排。显示转换的目的就是让你察觉到可能存在的数据越界情况

流操作符:把其后的数据打包成一个比特流,流操作符<<  、>>用在表达式的右边,后面带表达式、结构和数组。

initial begin
    bit [15:0] wq[$] ={16'h1234,16'h5678};
    bit [15:0] bq[$];
    
     bq ={>>{wq}}; //把字数组转换成字节数组  12 34 56 78
     
     bq = {8'h98,8'h76,8'h54,8'h32};
     wq = {>>{bq}}; //把字节数组转换成字数组 9876 5432

end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值