Оптимизируйте неподключенные порты в сгенерированном HDL-коде для моделей Simulink

Во время генерации HDL-кода неподключенные порты от сгенерированного кода удалены, не удаляя порты из моделей DUT верхнего уровня или подсистем. Эта оптимизация включает удаляющие несвязанные векторные и скалярные порты, порты элемента шины и входы шины. Удаление неподключенных портов улучшает удобочитаемость сгенерированного кода VHDL или Verilog и уменьшает использование области и размер кода. Сокращение избегает отказа синтеза, вызванного неиспользуемыми портами в сгенерированном коде.

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

Удаление неиспользуемого порта работает в сочетании с удалением неиспользованных блоков в вашем проекте. Чтобы изучить, как неиспользованные блоки удалены, смотрите, Удаляют Избыточную Логику и Неиспользованные Блоки в Сгенерированном HDL-коде.

Смотрите сгенерированный HDL-код, чтобы наблюдать эффект этой оптимизации. Сгенерированная модель и модель валидации не показывают эффект этой оптимизации. Эти модели содержат неиспользуемые порты, которые удалены из HDL-кода.

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

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

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

open_system('hdlcoder_RemoveUnconnectedPorts/dut/mid_Subsystem')

Сгенерировать HDL-код для проекта, в командной строке MATLAB®, введите:

makehdl('hdlcoder_RemoveUnconnectedPorts/dut')

Сгенерированный код mid_Subsystem.vhd показывает, что неподключенные порты удалены во время генерации HDL-кода. Вход InBus_signal3 во входном порту DUT умножается на блок Gain и затем соединяется с выходным портом 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-коде.

Если вы не хотите, чтобы неподключенные порты были удалены из проекта:

  • В диалоговом окне Configuration Parameters снимите флажок Remove Unused Ports.

  • Когда вы запускаете HDL Workflow Advisor, в Опциях Генерации кода Набора> задача Опций Оптимизации Набора, снимаете флажок Remove Unused Ports.

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

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

Сгенерированный HDL-код сохраняет неиспользованные порты Bus Elements.

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

Откройте model|hdlcoder_atomic_subsys2_ports_redundant |.

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

DUT subystem содержит блок 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 subystem содержит блок Atomic Subsystem, который содержит блок Add, соединенный с выходным портом, отключенным вне подсистемы.

open_system('hdlcoder_atomic_subsys3_ports_redundant/DUT')

Два экземпляра атомарной подсистемы, которым отключили выходные порты, удалены в сгенерированном HDL-коде. В другом блоке Atomic Subsystem, вычислении блока 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-код для экземпляра Атомарной подсистемы, он показывает, что расчет блока Add и Out3 сохраняются в сгенерированном 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;

Ограничения

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

Это ограничение также применяется к сигналам шины. В этом случае целая шина сохраняется в сгенерированном HDL-коде. Для примера смотрите, Удаляют Избыточную Логику и Неиспользованные Блоки в Сгенерированном HDL-коде.

Похожие темы