Во время генерации 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-коде.