如何控制 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 代码和后续综合中生成的寄存器数量。