如何在kristen中创建多个通用FPGA结构?
How do I create multiple common FPGA structures in kristen?
我正在尝试使用 Kristen 生成 FPGA 主机 verilog 和一个 C++ 源软件来访问 FPGA 主机。问题是我有几个通用寄存器块用于控制几个神经营养处理器实例(可参数化),我不想只复制 XML 定义。有没有办法复制定义文件的一部分?有没有办法给它提供一个参数来让它复制?所以如果我增加 NMP 实例,我会得到更多的 SW 主机实例?
具体来说,我想为每个 NMP 实例复制 nmp 寄存器。但是我只想要一份版本,DDR和核心寄存器。
我不想做的是将这些行复制 1000 份并给它们单独命名。
<mmap>
<filename>debug.log</filename>
<global>
<logo_filename>walker.png</logo_filename>
<device_name>nmp_mst</device_name>
<description>NMP master configuration</description>
<data_path_width>32</data_path_width>
<auto_ack>127</auto_ack>
<memory_pack>zero_align</memory_pack>
<register_pack>zero_align</register_pack>
<generation_directory>../generated</generation_directory>
<documentation_directory>../../docs</documentation_directory>
<xreg_version>xreg_v1_0_0</xreg_version>
<language>verilog</language>
</global>
<modules>
<module name="host" offset="0x0">
<register name="device_id" type="rdconst" mask="0xFFFFFFFF" default="0x0C002A9D" description="Device ID for NMP controller."></register>
<register name="version_id0" type="rdconst" mask="0xFFFFFFFF" default="0x00000001" description="Version register for the top level design.">
<field name="minor" offset="0b" size="2B" description="Minor Version."></field>
<field name="major" offset="16b" size="2B" description="Major Version."></field>
</register>
<register name="version_id1" type="rdconst" mask="0xFFFFFFFF" default="0x00004455" description="Development build version and debug version">
<field name="build" offset="0b" size="2B" description="Debug Version."></field>
<field name="debug" offset="16b" size="2B" description="Build Version."></field>
</register>
<register name="core_dp_ctrl" type="rdwr" mask="0x00000003" default="0x00000000" description="Core control register - controls device datapath.">
<field name="enable_pcie" offset="0b" size="1b" description="Enable interface 0 == 1 : Disable interface 0 == 0"></field>
<field name="enable_1" offset="1b" size="1b" description="Enable interface 1 == 1 : Disable interface 1 == 0"></field>
</register>
<register name="core_ddr4_ctrl" type="rdwr" mask="0x0000000F" default="0x00000000" description="DDR4 Memory control - control DDR4 memmory interface.">
<field name="BIST_enable" size="1b" description="Start BIST == 1 : Auto clears after BIST Begins" ></field>
<field name="BIST_in_progress" size="1b" description="BIST is currently in progress == 1 : Bist is idle == 0"></field>
<field name="BIST_complete" size="1b" description="BIST Test has complete == 1 : BIST_complete is cleared when BIST_enable is set or BIST_in_progress is set."></field>
<field name="BIST_OK" size="1b" description="BIST_OK is only valid when BIST_complete is set. BIST Test has passed == 1 : Bist Test has failed == 0"></field>
</register>
<register name="nmp_start0" type="rdconst" mask="0xFFFFFFFF" default="0x00000000" description="Lower 64 bit start pointer of persitant NMP storage."></register>
<register name="nmp_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of persitant NMP storage."></register>
<register name="nmp_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of NMP persitant storage in Mbytes."></register>
<register name="nmp_c_start0" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Lower 64 bit start pointer of cached shared storage."></register>
<register name="nmp_c_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of cached shared storage."></register>
<register name="nmp_c_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of cached shared storage in Mbytes."></register>
<register name="nmp_row" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable row location for this NMP."></register>
<register name="nmp_col" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable col location for this NMP."></register>
<register name="nmp_threshold" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable synaptic sum threshold for this instance."></register>
<memory name="nmp_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>
</modules>
所以您可能需要稍微改变一下。不完全知道你想要如何组织,我建议制作两个单独的模块。其中一个模块是您的设备和核心内容的单个实例,第二个模块是您的 nmp 内容并被复制 X 次。
无法向 XML 提供定义或参数以从外部控制复制,但您可以在 XML 中放置一个固定数字以引起复制。这里有一些权衡。我认为一种方式比另一种方式更昂贵,但您可以尝试一下,看看会发生什么。
我把它分成下面两个模块,并添加一个 "duplicate" 属性。我认为这将在 verilog 中随意创建 1000 个模块,并为它们分配名称,如 nmp1、nmp2 ... nmp1000。我认为这很容易做到,但它会花费你大量的微处理器接口逻辑。
<modules>
<module name="host" offset="0x0">
<register name="device_id" type="rdconst" mask="0xFFFFFFFF" default="0x0C002A9D" description="Device ID for NMP controller."></register>
<register name="version_id0" type="rdconst" mask="0xFFFFFFFF" default="0x00000001" description="Version register for the top level design.">
<field name="minor" offset="0b" size="2B" description="Minor Version."></field>
<field name="major" offset="16b" size="2B" description="Major Version."></field>
</register>
<register name="version_id1" type="rdconst" mask="0xFFFFFFFF" default="0x00004455" description="Development build version and debug version">
<field name="build" offset="0b" size="2B" description="Debug Version."></field>
<field name="debug" offset="16b" size="2B" description="Build Version."></field>
</register>
<register name="core_dp_ctrl" type="rdwr" mask="0x00000003" default="0x00000000" description="Core control register - controls device datapath.">
<field name="enable_pcie" offset="0b" size="1b" description="Enable interface 0 == 1 : Disable interface 0 == 0"></field>
<field name="enable_1" offset="1b" size="1b" description="Enable interface 1 == 1 : Disable interface 1 == 0"></field>
</register>
<register name="core_ddr4_ctrl" type="rdwr" mask="0x0000000F" default="0x00000000" description="DDR4 Memory control - control DDR4 memmory interface.">
<field name="BIST_enable" size="1b" description="Start BIST == 1 : Auto clears after BIST Begins" ></field>
<field name="BIST_in_progress" size="1b" description="BIST is currently in progress == 1 : Bist is idle == 0"></field>
<field name="BIST_complete" size="1b" description="BIST Test has complete == 1 : BIST_complete is cleared when BIST_enable is set or BIST_in_progress is set."></field>
<field name="BIST_OK" size="1b" description="BIST_OK is only valid when BIST_complete is set. BIST Test has passed == 1 : Bist Test has failed == 0"></field>
</register>
</module>
<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>
</modules>
稍微复杂一点的事情是将副本放在每个寄存器和存储器本身上。我认为这会节省一些资源,但对于 1000 个实例来说仍然会有很多逻辑。
<module name= "nmp" >
<register duplicate="1000" name="start0" type="rdconst" mask="0xFFFFFFFF" default="0x00000000" description="Lower 64 bit start pointer of persitant NMP storage."></register>
<register duplicate="1000" name="start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of persitant NMP storage."></register>
<register duplicate="1000" name="size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of NMP persitant storage in Mbytes."></register>
<register duplicate="1000" name="c_start0" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Lower 64 bit start pointer of cached shared storage."></register>
<register duplicate="1000" name="c_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of cached shared storage."></register>
<register duplicate="1000" name="c_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of cached shared storage in Mbytes."></register>
<register duplicate="1000" name="row" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable row location for this NMP."></register>
<register duplicate="1000" name="col" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable col location for this NMP."></register>
<register duplicate="1000" name="threshold" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable synaptic sum threshold for this instance."></register>
<memory duplicate="1000" 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>
我正在尝试使用 Kristen 生成 FPGA 主机 verilog 和一个 C++ 源软件来访问 FPGA 主机。问题是我有几个通用寄存器块用于控制几个神经营养处理器实例(可参数化),我不想只复制 XML 定义。有没有办法复制定义文件的一部分?有没有办法给它提供一个参数来让它复制?所以如果我增加 NMP 实例,我会得到更多的 SW 主机实例?
具体来说,我想为每个 NMP 实例复制 nmp 寄存器。但是我只想要一份版本,DDR和核心寄存器。
我不想做的是将这些行复制 1000 份并给它们单独命名。
<mmap>
<filename>debug.log</filename>
<global>
<logo_filename>walker.png</logo_filename>
<device_name>nmp_mst</device_name>
<description>NMP master configuration</description>
<data_path_width>32</data_path_width>
<auto_ack>127</auto_ack>
<memory_pack>zero_align</memory_pack>
<register_pack>zero_align</register_pack>
<generation_directory>../generated</generation_directory>
<documentation_directory>../../docs</documentation_directory>
<xreg_version>xreg_v1_0_0</xreg_version>
<language>verilog</language>
</global>
<modules>
<module name="host" offset="0x0">
<register name="device_id" type="rdconst" mask="0xFFFFFFFF" default="0x0C002A9D" description="Device ID for NMP controller."></register>
<register name="version_id0" type="rdconst" mask="0xFFFFFFFF" default="0x00000001" description="Version register for the top level design.">
<field name="minor" offset="0b" size="2B" description="Minor Version."></field>
<field name="major" offset="16b" size="2B" description="Major Version."></field>
</register>
<register name="version_id1" type="rdconst" mask="0xFFFFFFFF" default="0x00004455" description="Development build version and debug version">
<field name="build" offset="0b" size="2B" description="Debug Version."></field>
<field name="debug" offset="16b" size="2B" description="Build Version."></field>
</register>
<register name="core_dp_ctrl" type="rdwr" mask="0x00000003" default="0x00000000" description="Core control register - controls device datapath.">
<field name="enable_pcie" offset="0b" size="1b" description="Enable interface 0 == 1 : Disable interface 0 == 0"></field>
<field name="enable_1" offset="1b" size="1b" description="Enable interface 1 == 1 : Disable interface 1 == 0"></field>
</register>
<register name="core_ddr4_ctrl" type="rdwr" mask="0x0000000F" default="0x00000000" description="DDR4 Memory control - control DDR4 memmory interface.">
<field name="BIST_enable" size="1b" description="Start BIST == 1 : Auto clears after BIST Begins" ></field>
<field name="BIST_in_progress" size="1b" description="BIST is currently in progress == 1 : Bist is idle == 0"></field>
<field name="BIST_complete" size="1b" description="BIST Test has complete == 1 : BIST_complete is cleared when BIST_enable is set or BIST_in_progress is set."></field>
<field name="BIST_OK" size="1b" description="BIST_OK is only valid when BIST_complete is set. BIST Test has passed == 1 : Bist Test has failed == 0"></field>
</register>
<register name="nmp_start0" type="rdconst" mask="0xFFFFFFFF" default="0x00000000" description="Lower 64 bit start pointer of persitant NMP storage."></register>
<register name="nmp_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of persitant NMP storage."></register>
<register name="nmp_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of NMP persitant storage in Mbytes."></register>
<register name="nmp_c_start0" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Lower 64 bit start pointer of cached shared storage."></register>
<register name="nmp_c_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of cached shared storage."></register>
<register name="nmp_c_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of cached shared storage in Mbytes."></register>
<register name="nmp_row" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable row location for this NMP."></register>
<register name="nmp_col" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable col location for this NMP."></register>
<register name="nmp_threshold" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable synaptic sum threshold for this instance."></register>
<memory name="nmp_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>
</modules>
所以您可能需要稍微改变一下。不完全知道你想要如何组织,我建议制作两个单独的模块。其中一个模块是您的设备和核心内容的单个实例,第二个模块是您的 nmp 内容并被复制 X 次。
无法向 XML 提供定义或参数以从外部控制复制,但您可以在 XML 中放置一个固定数字以引起复制。这里有一些权衡。我认为一种方式比另一种方式更昂贵,但您可以尝试一下,看看会发生什么。
我把它分成下面两个模块,并添加一个 "duplicate" 属性。我认为这将在 verilog 中随意创建 1000 个模块,并为它们分配名称,如 nmp1、nmp2 ... nmp1000。我认为这很容易做到,但它会花费你大量的微处理器接口逻辑。
<modules>
<module name="host" offset="0x0">
<register name="device_id" type="rdconst" mask="0xFFFFFFFF" default="0x0C002A9D" description="Device ID for NMP controller."></register>
<register name="version_id0" type="rdconst" mask="0xFFFFFFFF" default="0x00000001" description="Version register for the top level design.">
<field name="minor" offset="0b" size="2B" description="Minor Version."></field>
<field name="major" offset="16b" size="2B" description="Major Version."></field>
</register>
<register name="version_id1" type="rdconst" mask="0xFFFFFFFF" default="0x00004455" description="Development build version and debug version">
<field name="build" offset="0b" size="2B" description="Debug Version."></field>
<field name="debug" offset="16b" size="2B" description="Build Version."></field>
</register>
<register name="core_dp_ctrl" type="rdwr" mask="0x00000003" default="0x00000000" description="Core control register - controls device datapath.">
<field name="enable_pcie" offset="0b" size="1b" description="Enable interface 0 == 1 : Disable interface 0 == 0"></field>
<field name="enable_1" offset="1b" size="1b" description="Enable interface 1 == 1 : Disable interface 1 == 0"></field>
</register>
<register name="core_ddr4_ctrl" type="rdwr" mask="0x0000000F" default="0x00000000" description="DDR4 Memory control - control DDR4 memmory interface.">
<field name="BIST_enable" size="1b" description="Start BIST == 1 : Auto clears after BIST Begins" ></field>
<field name="BIST_in_progress" size="1b" description="BIST is currently in progress == 1 : Bist is idle == 0"></field>
<field name="BIST_complete" size="1b" description="BIST Test has complete == 1 : BIST_complete is cleared when BIST_enable is set or BIST_in_progress is set."></field>
<field name="BIST_OK" size="1b" description="BIST_OK is only valid when BIST_complete is set. BIST Test has passed == 1 : Bist Test has failed == 0"></field>
</register>
</module>
<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>
</modules>
稍微复杂一点的事情是将副本放在每个寄存器和存储器本身上。我认为这会节省一些资源,但对于 1000 个实例来说仍然会有很多逻辑。
<module name= "nmp" >
<register duplicate="1000" name="start0" type="rdconst" mask="0xFFFFFFFF" default="0x00000000" description="Lower 64 bit start pointer of persitant NMP storage."></register>
<register duplicate="1000" name="start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of persitant NMP storage."></register>
<register duplicate="1000" name="size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of NMP persitant storage in Mbytes."></register>
<register duplicate="1000" name="c_start0" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Lower 64 bit start pointer of cached shared storage."></register>
<register duplicate="1000" name="c_start1" type="rdconst" mask="0xFFFFFFFF" default="0x00000020" description="Upper 64 bit start pointer of cached shared storage."></register>
<register duplicate="1000" name="c_size" type="rdconst" mask="0xFFFFFFFF" default="0x10000000" description="Size of cached shared storage in Mbytes."></register>
<register duplicate="1000" name="row" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable row location for this NMP."></register>
<register duplicate="1000" name="col" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable col location for this NMP."></register>
<register duplicate="1000" name="threshold" type="rdwr" mask="0xFFFFFFFF" default="0x00000000" description="Configurable synaptic sum threshold for this instance."></register>
<memory duplicate="1000" 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>