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