第二章重读笔记
- 合并数组;
- 队列比动态数组更高级,具有更小的性能损失;
a) 队列的使用需要注意,不要在其内容为空的时候pop;
i. 需要增加安全提示:
- wait(queue.size()>0); a = queue.pop_front() ;
- 在队列中,使用insert操作的执行效率要低于使用pop和push;
- 字下标:$放在最左边表示最小值;$放在最右边表示最大值;
- 可以通过对队列进行位宽运算来快速操作:
a) J = array[$]; // j= array[max size]
b) q=q[0,$-1];// 删掉q的最后一个数据;
c) q={};删除队列;
- 删除队列的方法
a) q={};
b) q.delte();
c) 重新声明q;
- 支持把动态数组和定宽数组的数值赋值给队列;
a) 在位宽妥当的情况下他们会拓展自身;
b) 也可能会截断;
- 关联数组如果使用string作为索引,foreach的时候会根据转换后的ascii数值作为顺序打印;
- 数组缩减方法
Sum函数的返回值结果是根据原始数组数据类型的位宽决定的;
a) 数组求和位宽处理技巧:
i. $display(“on.sum”,on.sum()); 这种方法会打印1;
ii. $display(“on.sum”,om.sum()+32’d0);
iii. 通过增加额外位宽数据的方式,可以打印完整的数值;(相当于拓宽了)
iv. 也可以使用这种方法
- int t; t = on.sum();
- 由于左侧是一个32位宽的数据,其可以得到完整的sum结果;
- 数组的使用
a) 如果数组的索引是非负整数,应该使用定宽或动态数组;
b) 当数组的索引不规则时,可选择关联数组;
c) 当数组的长度会在仿真时频频变化时,可以选择队列;
- 存储器的优化:
a) 使用二值变量可以减少仿真时存储器的用量;
b) 为了避免浪费空间,应该尽量选择32bit的整数倍作为数据位宽;
- 用户自定义数据结构:
a) 类与结构体:(2.10)
- verilog没有数据结构,SV中结构体的功能太少,不如直接使用类来存储数据;
- struct仅是将数据组织到一起,没有操作数据的方法;
- struct是可综合的,静态的,而类是动态的,而且类可以使用随机化生成带约束的随机数据;
- struct变量的后缀应该使用_s;
a) 类与结构体:(2.10)typedef还能将不同的数据类型创建联合:
typedef union {int i;real f;} num_u;
real:浮点数;
num_u un;
un.f=0.0;