如何控制 Kristen FPGA 实现多余的寄存器?
How can you control Kristen FPGA from implementing excess registers?
我正在使用 Kristen 为神经形态处理器生成 Verilog FPGA 主机接口。我已经实现了基本主机如下,
<module name= "nmp" duplicate="1000">
<register name="start0" type="rdconst" mask="0xFFFFFFFF" default="0x00000000" description="Lower 64 bit start pointer of persitant NMP storage."></register>
<register name="start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of persitant NMP storage."></register>
<register name="size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of NMP persitant storage in Mbytes."></register>
<register name="c_start0" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Lower 64 bit start pointer of cached shared storage."></register>
<register name="c_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of cached shared storage."></register>
<register name="c_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of cached shared storage in Mbytes."></register>
<register name="row" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable row location for this NMP."></register>
<register name="col" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable col location for this NMP."></register>
<register name="threshold" type="rdwr" mask="0xFFFFFFFF" 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>
最终结果是我看到正在生成大量寄存器,我必须按比例缩小 NMP 大小以适应我的 FPGA 的限制。有没有办法控制这里生成的寄存器数量?显然我需要存储这些不同字段的设置。我在这里遗漏了什么吗?
我应该补充一点,我正试图在我的 NMP 上达到 2048 的规模,但我能做的最好只是超过 1000,而不是 1024。如果我在没有 PCIe 或主机控制的情况下实施,我可以得到到 2048 没有问题。
如果我理解正确,每个 NMP 实例都使用内部寄存器进行编码以存储数据,并且您显示的配置将导致 kristen 也使用寄存器创建 Verilog。 Effectivley 发生双缓冲存储。
因此,寄存器的数量有效地翻了一番,超出了它们的需要。处理这种情况的一种方法是使用另一个 32 位宽的 RAM 接口。我确实注意到您的配置需要 9 x 32 位字,这对于内存来说是一个奇怪的大小。会有一些浪费的地址space。 Kristen 将在二进制边界上创建一个 RAM,这样您就可以获得一个 16x32 位的内存区域,您可以将其覆盖在该接口上。然后是第二个 RAM,就像您已经拥有的一样,用于学习记忆。
<module>
<memory name="regs" memsize="0x10" type="mem_ack" description="Register mapping per NMP instance">
<field name "start0" size="32b" description="Start0"></field>
<field name "start1" size="32b" description="Start1"></field>
....
<field name "threshold" size="32b" description="Threshold"></field>
</memory>
<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>
生成此文件并查看新界面。这应该会减少 Verilog 代码和后续综合中生成的寄存器数量。
我正在使用 Kristen 为神经形态处理器生成 Verilog FPGA 主机接口。我已经实现了基本主机如下,
<module name= "nmp" duplicate="1000">
<register name="start0" type="rdconst" mask="0xFFFFFFFF" default="0x00000000" description="Lower 64 bit start pointer of persitant NMP storage."></register>
<register name="start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of persitant NMP storage."></register>
<register name="size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of NMP persitant storage in Mbytes."></register>
<register name="c_start0" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Lower 64 bit start pointer of cached shared storage."></register>
<register name="c_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of cached shared storage."></register>
<register name="c_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of cached shared storage in Mbytes."></register>
<register name="row" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable row location for this NMP."></register>
<register name="col" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable col location for this NMP."></register>
<register name="threshold" type="rdwr" mask="0xFFFFFFFF" 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>
最终结果是我看到正在生成大量寄存器,我必须按比例缩小 NMP 大小以适应我的 FPGA 的限制。有没有办法控制这里生成的寄存器数量?显然我需要存储这些不同字段的设置。我在这里遗漏了什么吗?
我应该补充一点,我正试图在我的 NMP 上达到 2048 的规模,但我能做的最好只是超过 1000,而不是 1024。如果我在没有 PCIe 或主机控制的情况下实施,我可以得到到 2048 没有问题。
如果我理解正确,每个 NMP 实例都使用内部寄存器进行编码以存储数据,并且您显示的配置将导致 kristen 也使用寄存器创建 Verilog。 Effectivley 发生双缓冲存储。
因此,寄存器的数量有效地翻了一番,超出了它们的需要。处理这种情况的一种方法是使用另一个 32 位宽的 RAM 接口。我确实注意到您的配置需要 9 x 32 位字,这对于内存来说是一个奇怪的大小。会有一些浪费的地址space。 Kristen 将在二进制边界上创建一个 RAM,这样您就可以获得一个 16x32 位的内存区域,您可以将其覆盖在该接口上。然后是第二个 RAM,就像您已经拥有的一样,用于学习记忆。
<module>
<memory name="regs" memsize="0x10" type="mem_ack" description="Register mapping per NMP instance">
<field name "start0" size="32b" description="Start0"></field>
<field name "start1" size="32b" description="Start1"></field>
....
<field name "threshold" size="32b" description="Threshold"></field>
</memory>
<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>
生成此文件并查看新界面。这应该会减少 Verilog 代码和后续综合中生成的寄存器数量。