Как создать несколько общих структур FPGA в Кристен? - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь использовать Кристен для генерации verilog хоста FPGA и исходного программного обеспечения C ++ для доступа к хосту FPGA. Проблема в том, что у меня есть несколько блоков общих регистров для управления несколькими экземплярами процессора нейротрофии c (которые параметризуются), и я не хочу просто делать копии определения 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>

1 Ответ

1 голос
/ 12 апреля 2020

Так что вам, вероятно, нужно разбить это немного по-другому. Не совсем зная, КАК вы хотите это организовать, я бы предложил сделать два отдельных модуля. Один из модулей - это ваш единственный экземпляр с вашим устройством и основным компонентом, а второй модуль - ваш 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>
...