如何控制Kristen FPGA生成过量寄存器,满足2048规模NMP部署需求
Kristen生成FPGA主机接口的寄存器资源优化方案
核心问题定位
你当前配置中<module name="nmp" duplicate="1000">会为每个NMP实例独立生成全套9个寄存器+1块片上存储逻辑,2048个实例的话仅可写寄存器就有6144个32位寄存器,再加上只读寄存器和总线接入逻辑,额外占用的资源刚好挤掉了规模扩容的余量,和你去掉主机接口就能跑满2048的现象完全吻合。
可落地的优化方案
共享全局只读常量寄存器
你配置里的start0/start1/size/c_start0/c_start1/c_size都是rdconst类型,所有NMP实例的默认值完全相同,不需要每个实例都生成一份。把这6个寄存器从NMP子模块里移到全局主机接口层,所有NMP实例共享同一组只读常量,直接砍掉2/3的冗余寄存器资源。批量复用可写寄存器的访问通路
剩下的row/col/threshold3个可写寄存器,不要每个NMP实例单独挂载主机总线。改成全局仅保留1组配置寄存器+1个NMP实例ID选择寄存器,主机写配置时先写ID指定要配置的NMP编号,再写对应的配置值,硬件侧根据ID把配置值更新到对应NMP的存储单元中。该方案下可写寄存器的数量和NMP规模完全无关,仅保留固定3个即可。替换分布式寄存器为块RAM存储
如果你的NMP配置不需要纳秒级实时随机读写,可把所有NMP的row/col/threshold配置值全部存在一块双口块RAM里,位宽设为96bit(3个32位配置值拼接),深度设为2048,仅需要1块块RAM就能存下所有配置,完全不需要用逻辑寄存器实现,资源消耗会下降一个数量级。裁剪寄存器掩码位宽
你当前所有寄存器的mask都是0xFFFFFFFF即全32位有效,但实际row/col值最多只需要11位(对应2048的规模),threshold也不需要满32位,根据实际需要的位宽修改mask参数,每个寄存器可以节省大量无用的寄存器位。
优化后配置修改示例
<!-- 全局层新增共享常量寄存器 --> <register name="global_start0" type="rdconst" mask="0xFFFFFFFF" default="0x00000000" description="Lower 64 bit start pointer of persitant NMP storage."></register> <register name="global_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of persitant NMP storage."></register> <register name="global_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of NMP persitant storage in Mbytes."></register> <register name="global_c_start0" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Lower 64 bit start pointer of cached shared storage."></register> <register name="global_c_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of cached shared storage."></register> <register name="global_c_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of cached shared storage in Mbytes."></register> <!-- 新增实例选择寄存器 --> <register name="nmp_sel_id" type="rdwr" mask="0x000007FF" default="0x00000000" description="ID of NMP instance to be configured."></register> <!-- NMP子模块只保留独有可配置项,配置通路复用 --> <module name= "nmp" duplicate="2048"> <register name="row" type="rdwr" mask="0x000007FF" default="0x00000000" description="Configurable row location for this NMP."></register> <register name="col" type="rdwr" mask="0x000007FF" default="0x00000000" description="Configurable col location for this NMP."></register> <register name="threshold" type="rdwr" mask="0x0000FFFF" default="0x00000000" description="Configurable synaptic sum threshold for this instance."></register> <memory name="learn" memsize="0x00004000" type="mem_ack" description="Learning interface - Map input synapsys to node intensity"> <field name="input_id" size="22b" description="Input ID this map data is intended for."></field> <field name="scale" size="16b" description="The intensity scale for this input ID."></field> </memory> </module>
内容的提问来源于stack exchange,提问作者Nolen White
相关产品推荐
相关产品推荐

