exponenta event banner

Оптимизация неподключенных портов в коде HDL для моделей Simulink

Генерация кода HDL улучшает удобочитаемость кода, уменьшает размер кода и уменьшает использование области за счет удаления несвязанных портов из сгенерированного кода. Это включает удаление несвязанных векторных и скалярных портов, портов элементов шины и портов шины. Удаление несвязанного порта может помочь избежать сбоя синтеза, вызванного неиспользованными портами в сгенерированном коде.

Как работает удаление неиспользуемого порта

Удаление неиспользуемого порта работает совместно с удалением неиспользуемых блоков в вашей конструкции. См. раздел Удаление избыточной логики и неиспользуемых блоков в сгенерированном коде HDL.

Эффект удаления неиспользуемого порта можно увидеть в сгенерированном коде HDL. Порты не удаляются из моделей или подсистем DUT верхнего уровня, моделей реализации или моделей проверки.

Открытие модели hdlcoder_RemoveUnconnectedPorts содержит порты Bus Element и порт, подключенный к неактивному выходу.

open_system('hdlcoder_RemoveUnconnectedPorts')
set_param('hdlcoder_RemoveUnconnectedPorts', 'SimulationCommand', 'update');

Откройте окно dut Блок подсистемы, а затем откройте mid_Subsystem блок. mid_Subsystem содержит порты Bus Element. Один из выходных сигналов соединен с блоком Терминатора.

open_system('hdlcoder_RemoveUnconnectedPorts/dut/mid_Subsystem')

Для создания кода HDL для проекта в командной строке MATLAB ® введите:

makehdl('hdlcoder_RemoveUnconnectedPorts/dut')

Созданный код mid_Subsystem.vhd показывает, что неподключенные порты удаляются во время генерации кода HDL. Вход InBus_signal3 на входном порту DUT умножается на блок усиления и затем подключается к выходному порту OutBus_signal2, который затем передается в выходной порт DUT. Поскольку другие порты ввода и вывода не используются на уровне DUT, эти порты удаляются из сгенерированного кода HDL.

ARCHITECTURE rtl OF mid_Subsystem IS
-- Component Declarations
COMPONENT inner_Subsystem
  PORT( clk              :   IN    std_logic;
        reset            :   IN    std_logic;
        enb              :   IN    std_logic;
        InBus_signal3    :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        OutBus_signal2   :   OUT   std_logic_vector(31 DOWNTO 0)  -- single
        );
END COMPONENT;
...
END rtl;

Отключить оптимизацию удаления неиспользуемых портов

По умолчанию оптимизация включена, и неиспользуемые порты удаляются из сгенерированного кода HDL.

Если не требуется удалять из конструкции неподключенные порты:

  • В диалоговом окне «Параметры конфигурации» снимите флажок «Удалить неиспользуемые порты».

  • При запуске помощника по рабочим процессам HDL в задаче Задать параметры генерации кода > Задать параметры оптимизации снимите флажок Удалить неиспользуемые порты.

  • В командной строке установить DeleteUnusedPorts кому off с hdlset_param или makehdl. Например, чтобы указать, что требуется сохранить неиспользуемые порты в hdlcoder_RemoveUnconnectedPorts модель, выполните следующую команду:

makehdl('hdlcoder_RemoveUnconnectedPorts/dut', 'DeleteUnusedPorts', 'off')

Созданный код HDL сохраняет неиспользуемые порты элементов шины.

ARCHITECTURE rtl OF mid_Subsystem IS
-- Component Declarations
COMPONENT inner_Subsystem
  PORT( clk                :   IN    std_logic;
        reset              :   IN    std_logic;
        enb                :   IN    std_logic;
        InBus_signal1      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        InBus_signal2      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        InBus_signal3      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        InBus_signal4      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        OutBus_signal1     :   OUT   std_logic_vector(31 DOWNTO 0);  -- single
        OutBus_signal2     :   OUT   std_logic_vector(31 DOWNTO 0)  -- single
        );
END COMPONENT;
...
END rtl;

Удаление неиспользуемого порта для портов подсистемы

Эта оптимизация позволяет удалить неиспользуемые порты данных подсистемы. Управляющие порты и порты ссылочной модели не удаляются.

Порт данных подсистемы считается активным, когда он вносит вклад в выходной порт DUT в нисходящем направлении, или подключен к активной подсистеме черного ящика, или к компоненту, который сохраняется во время генерации кода HDL.

Открытие модели hdlcoder_subsys_ports_unused.

open_system('hdlcoder_subsys_ports_unused')
sim('hdlcoder_subsys_ports_unused');

Модель содержит normal_subsys_dead_out подсистема, содержащая выходной порт out3 который завершается и не участвует в выводе DUT.

open_system('hdlcoder_subsys_ports_unused/DUT')

Чтобы создать код HDL для подсистемы DUT, выполните следующую команду:

makehdl('hdlcoder_subsys_ports_unused/DUT')

По умолчанию, когда DeleteUnusedPorts является on, порт вычисления и вывода Add block, Out3, удаляются из сгенерированного кода HDL.

ENTITY normal_subsys_dead_out IS
 PORT( In1       :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1      :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2      :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END normal_subsys_dead_out;
ARCHITECTURE rtl OF normal_subsys_dead_out IS
...
  Out1 <= std_logic_vector(Gain_out1);
...
  Out2 <= std_logic_vector(Gain1_out1);
END rtl;

Отключить DeleteUnusedPorts оптимизация, выполните следующую команду:

makehdl('hdlcoder_subsys_ports_unused/DUT', 'DeleteUnusedPorts', 'off')

При установке DeleteUnusedPorts кому offэтот порт и вычисление блока Add сохраняются в сгенерированном коде HDL.

ENTITY normal_subsys_dead_out IS
 PORT( In1     :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1    :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2    :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out3    :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END normal_subsys_dead_out;
ARCHITECTURE rtl OF normal_subsys_dead_out IS
...
  Out1 <= std_logic_vector(Gain_out1);
...
  Out2 <= std_logic_vector(Gain1_out1
  Add_out1 <= to_signed(16#0000#, 16);
  Out3 <= std_logic_vector(Add_out1);
END rtl;

Удаление неиспользуемого порта для атомных подсистем

Для неиспользуемых портов вне атомных подсистем экземпляры атомных подсистем удаляются из сгенерированного кода HDL.

Открытие модели hdlcoder_atomic_subsys3_redundant

open_system('hdlcoder_atomic_subsys3_redundant')
sim('hdlcoder_atomic_subsys3_redundant');

DUT подсистема содержит три экземпляра атомной подсистемы. Выходы двух экземпляров атомной подсистемы соединены с блоками Терминатора.

open_system('hdlcoder_atomic_subsys3_redundant/DUT')

Чтобы создать код HDL для подсистемы DUT, выполните следующую команду:

makehdl('hdlcoder_atomic_subsys3_redundant/DUT')
ENTITY DUT IS
 PORT( In1      :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1     :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2     :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT atomic_subsys_dead_out_instance_1
  PORT( In1    :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        Out1   :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
        Out2   :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
        );
END COMPONENT;
...
END rtl;

Установить DeleteUnusedPorts кому off, выполните следующую команду:

makehdl('hdlcoder_atomic_subsys3_redundant/DUT', 'DeleteUnusedPorts', 'off')

Если установить DeleteUnusedPorta кому off, входной порт In2 сохраняется в сгенерированном коде HDL, но подается во входной порт, который управляет неиспользуемым компонентом.

ENTITY DUT IS
 PORT( In1        :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1       :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2       :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT atomic_subsys_dead_out_instance_1
  PORT( In1      :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In2      :   IN    std_logic_vector(7 DOWNTO 0);  -- int8
        Out1     :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
        Out2     :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
        );
END COMPONENT;
...
END rtl;

Удаление неиспользуемых портов для выходных портов атомных подсистем

При наличии нескольких активных экземпляров атомной подсистемы резервная логика на границе, включая любые порты, сохраняется в коде HDL независимо от DeleteUnusedPorts установка. Если имеется только один экземпляр Atomic Subsystem, по умолчанию, когда DeleteUnusedPorts является onвсе избыточные логики и порты на границе подсистемы удаляются. Однако, если задать DeleteUnusedPorts кому offлюбой неиспользуемый порт сохраняется, хотя логика является избыточной.

Открытие модели hdlcoder_atomic_subsys2_ports_redundant.

open_system('hdlcoder_atomic_subsys2_ports_redundant')
sim('hdlcoder_atomic_subsys2_ports_redundant');

DUT подсистема содержит блок Atomic Subsystem, который содержит блок Add, подключенный к выходному порту, заканчивающемуся вне подсистемы.

open_system('hdlcoder_atomic_subsys2_ports_redundant/DUT')

Создание кода HDL для DUT подсистема, выполните следующую команду:

makehdl('hdlcoder_atomic_subsys2_ports_redundant/DUT')

В сгенерированном коде HDL блок Add и соответствующий Out3 порта вывода удаляются, поскольку они не способствуют активному выходу.

ENTITY DUT IS
 PORT( In1    :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1   :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2   :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT single_instance_atomic_subsys_dead_out
  PORT( In1    :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        Out1   :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
        Out2   :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
        );
END COMPONENT;
...
END rtl;

Установить DeleteUnusedPorts кому off, выполните следующую команду:

makehdl('hdlcoder_atomic_subsys2_ports_redundant/DUT', 'DeleteUnusedPorts', 'off')

Если установить DeleteUnusedPorts кому off, порт вывода Out3 сохраняется в сгенерированном коде HDL.

ENTITY DUT IS
 PORT( In1    :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1   :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2   :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT single_instance_atomic_subsys_dead_out
  PORT( In1    :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        Out1   :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
        Out2   :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
        Out3   :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
        );
END COMPONENT;
...
END rtl;
ENTITY single_instance_atomic_subsys_dead_out IS
 PORT( In1      :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1     :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2     :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out3     :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END single_instance_atomic_subsys_dead_out;
ARCHITECTURE rtl OF single_instance_atomic_subsys_dead_out IS
...
Add_out1 <= to_signed(16#0000#, 16);
Out3 <= std_logic_vector(Add_out1);
END rtl;

При наличии нескольких неактивных экземпляров атомных подсистем неиспользуемый порт и логика удаляются или сохраняются в зависимости от DeleteUnusedPorts установка.

Открытие модели hdlcoder_atomic_subsys3_ports_redundant.

open_system('hdlcoder_atomic_subsys3_ports_redundant')
sim('hdlcoder_atomic_subsys3_ports_redundant');

DUT подсистема содержит блок Atomic Subsystem, который содержит блок Add, подключенный к выходному порту, заканчивающемуся вне подсистемы.

open_system('hdlcoder_atomic_subsys3_ports_redundant/DUT')

В сгенерированном коде HDL удаляются два экземпляра атомной подсистемы, у которых выходные порты оканчиваются. В другом блоке атомной подсистемы расчет блока Add и его выходные данные удаляются.

ENTITY DUT IS
 PORT( In1          :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1         :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2         :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT atomic_subsys_instance_1
  PORT( In1        :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        Out1       :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
        Out2       :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
        );
END COMPONENT;
...
-- Removed
--
-- Removed
u_atomic_subsys_instance_1 : atomic_subsys_instance_1
  PORT MAP( In1 => In1,  -- int16
            Out1 => atomic_subsys_instance_1_out1,  -- int16
            Out2 => atomic_subsys_instance_1_out2  -- int16
            );
Out1 <= atomic_subsys_instance_1_out1;
Out2 <= atomic_subsys_instance_1_out2;
END rtl;

Установить DeleteUnusedPorts кому off, выполните следующую команду:

makehdl('hdlcoder_atomic_subsys3_ports_redundant/DUT', 'DeleteUnusedPorts', 'off')

Если установить DeleteUnusedPorts кому off, порт вывода Out3 сохраняется в сгенерированном коде HDL.

ENTITY DUT IS
 PORT( In1         :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1        :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2        :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT atomic_subsys_instance_1
  PORT( In1        :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        Out1       :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
        Out2       :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
        Out3       :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
        );
END COMPONENT;

Если вы видите сгенерированный код HDL для экземпляра атомной подсистемы, он показывает, что вычисление и Out3 блока Add сохраняются в сгенерированном коде HDL.

ENTITY atomic_subsys_instance_1 IS
 PORT( In1          :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
       Out1         :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out2         :   OUT   std_logic_vector(15 DOWNTO 0);  -- int16
       Out3         :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END atomic_subsys_instance_1;
ARCHITECTURE rtl OF atomic_subsys_instance_1 IS
...
Add_out1 <= In1_signed + In1_signed;
Out3 <= std_logic_vector(Add_out1);
END rtl;

Ограничения

Если модель содержит несколько экземпляров атомных подсистем, ссылок на модель или блоков подсистемы Foreach, и эти блоки активны во время генерации кода HDL, то порты сохраняются в сгенерированном коде. Компоненты, подключенные к этим портам в восходящем направлении, также считаются активными. Порты сохраняются независимо от того, активизируется или деактивизируется DeleteUnusedPorts установка.

Это ограничение также относится к шинным сигналам. В этом случае вся шина сохраняется в сгенерированном коде HDL. Пример см. в разделе Удаление избыточной логики и неиспользуемых блоков в сгенерированном коде HDL.

Связанные темы