Генерация HDL-кода улучшает удобочитаемость кода, уменьшает размер кода и уменьшает использование области, удаляя несвязанные порты из сгенерированного кода. Это включает удаление несвязанных векторных и скалярных портов, портов элемента шины и портов шины. Удаление несвязанного порта может помочь избежать отказа синтеза, вызванного неиспользованными портами в сгенерированном коде.
Удаление неиспользованного порта работает в сочетании с удалением неиспользованных блоков в вашем проекте. См. раздел «Удаление избыточной логики и неиспользованных блоков в сгенерированном HDL-коде».
Эффект удаления неиспользованного порта можно увидеть в сгенерированном HDL-коде. Порты не удаляются из моделей DUT верхнего уровня или подсистем, моделей реализации или моделей валидации.
Откройте модель hdlcoder_RemoveUnconnectedPorts
содержит порты Элемент и порт, соединенный с неактивным выходом.
open_system('hdlcoder_RemoveUnconnectedPorts') set_param('hdlcoder_RemoveUnconnectedPorts', 'SimulationCommand', 'update');
Откройте dut
Блок Subsystem, а затем откройте mid_Subsystem
блок. The mid_Subsystem
содержит порты элемента шины. Один из выходных сигналов соединяется с блоком 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-коде.
Если вы не хотите, чтобы несвязанные порты были удалены из проекта:
В диалоговом окне Параметры конфигурации снимите флажок Удалить неиспользуемые порты.
Когда вы запускаете HDL Workflow Advisor, в задаче Set Генерации кода Опций > Set Optimization Опций, снимите флажок 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
, этот порт и вычисление блок сохранены в сгенерированном 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');
The DUT
подсистема содержит три образцов атомарных подсистем. Выходы двух образцов атомарной подсистемы соединяются с блоками Terminator.
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
любой неиспользуемый порт сохраняется, хотя логика избыточна.
Откройте модель hdlcoder_atomic_subsys2_ports_redundant
.
open_system('hdlcoder_atomic_subsys2_ports_redundant') sim('hdlcoder_atomic_subsys2_ports_redundant');
The DUT
подсистема содержит блок Атомарная подсистема, который содержит блок 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');
The DUT
подсистема содержит блок Атомарная подсистема, который содержит блок Add, соединенный с выходным портом, завершенным вне подсистемы.
open_system('hdlcoder_atomic_subsys3_ports_redundant/DUT')
Два образцов атомарной подсистемы, у которых завершены выходные порты, удаляются в сгенерированном HDL-коде. В другом блоке Атомарная подсистема вычисление Add block и его выход удаляются.
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 блок сохранены в сгенерированном 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-коде.