SystemVerilog压缩阵列与非压缩阵列内存占用



使用当代先进的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;

最新更新