使用当代先进的 SV RTL 模拟器,使用未打包阵列与打包阵列相比,仿真占用空间是否会增加?如果是这样,这是一个问题吗?验证团队是否坚持使用打包数组的规则?TIA。桑杰
问问题
4871 次
1 回答
3
“[是否] 使用未打包数组与打包数组相比,模拟占用空间可能会增加吗?”
它取决于模拟器分配和访问其内存。大多数情况下,打包数组的内存占用比未打包数组要小。通常足迹大小的差异不是很充分。当模拟器从内存中访问一个数组时,打包数组会执行整个数组,而未打包数组会访问其中的一部分。当数组很大并且不需要一次访问整个数组时,未压缩数组比压缩数组具有更好的性能。
“这是一个问题吗?设计团队是否坚持使用打包数组的设计规则?”
如果运行模拟器的机器有足够的内存来运行模拟,那就没关系了。尽管如此,内存占用限制不应成为设计规则。设计规则应侧重于质量、性能、芯片/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;
- 例子
于 2013-07-30T19:22:08.367 回答