Так что вам, вероятно, нужно разбить это немного по-другому. Не совсем зная, КАК вы хотите это организовать, я бы предложил сделать два отдельных модуля. Один из модулей - это ваш единственный экземпляр с вашим устройством и основным компонентом, а второй модуль - ваш nmp-материал, и он повторяется X раз.
Невозможно передать определение или параметр в XML для управлять репликацией извне, но вы можете поместить фиксированное число в XML, что приведет к репликации. Здесь есть некоторые компромиссы. Я думаю, что один способ более дорогой, чем другой, но вы можете попробовать его и посмотреть, что произойдет.
Я разбил его на два модуля ниже и добавил атрибут «дубликата». Я думаю, что это в буквальном смысле создаст 1000 модулей в Verilog и назначит им имена, такие как nmp1, nmp2 ... nmp1000. Я думаю, что это очень просто сделать, но это будет стоить вам много логики интерфейса микропроцессора c.
<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>
Немного более сложная задача - поместить дубликат на каждый из регистров и сами воспоминания. Я думаю, что это сэкономит некоторые ресурсы, но все равно будет много логики c для 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>