Генерация кода 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.