使用当代先进的SV RTL模拟器,与使用封装阵列相比,使用未封装阵列时模拟占地面积可能会增加,这是真的吗?如果是,这是一个问题吗?验证团队是否坚持使用压缩数组的规则?TIA。Sanjay
"当使用未封装时,模拟占地面积可能会增加吗阵列与压缩阵列?"
它取决于模拟器分配和访问其内存。在大多数情况下,打包的阵列的内存占用比未打包的阵列小。通常占地面积大小的差异不是很充分。当模拟器从内存访问一个数组时,打包的数组会锻炼整个数组,而未打包的数组则会访问一部分。当阵列很大并且不需要一次访问整个阵列时,未打包的阵列比打包的阵列具有更好的性能。
"这是个问题吗?设计团队是否坚持使用设计规则压缩阵列?"
如果运行模拟器的机器有足够的内存来运行模拟,那么这无关紧要。即使如此,内存占用限制也不应该成为设计规则。设计规则应关注质量、性能、硅/FPGA限制和可读性。如果调整阵列结构有助于满足实际的设计规则,那么减少内存占用是一个附带的好处。
当处理有限的系统内存(或很长的模拟时间)时,测试台和不可合成的模型就不同了。校准封装和非封装阵列是需要研究的众多因素之一。许多商业模拟器都附带了获得最佳模拟结果的指南文档。
通用阵列指南:
-
压缩数组-可合成-访问整个数组算法操作时最佳,并支持位选择和部分选择(LRM§7.4.1)
- 示例:
reg [31:0] packed_array;
- 示例:
-
解压缩数组-可合成-当数组很大或必须单独访问每个条目时最佳(LRM§7.4.2)
- 示例
reg unpacked_array [31:0]; reg [31:0] unpacked_array_of_packed_arrays [15:0];
- 示例
-
关联数组-不可合成-最好是在需要访问所有条目的能力时,而不太可能访问模拟中的大多数实体(LRM§7.8)
- 示例
int associative_wildkey [*]; logic [127:0] associative_keytype [int];
- 示例
-
队列-不可合成-当条目数未知且数据访问像管道时最佳(LRM§7.10)
- 示例
bit [7:0] queue [$];
- 示例
-
动态数组-不可合成-最好是在需要动态创建整个数组时,在使用数组且未进行模拟时删除数组(LRM§7.5)
- 示例
int dynamic_array[]; initial dynamic_array = new[8];
- 示例
-
矢量网-(检查合成器手册)-最好只访问整个压缩条目,不允许选择位和部分(因此可能占用较小的内存)。仅限于网络类型(LRM§6.9.2)
- 示例
wire vectored [7:0] vec;
- 示例