Если ваш проект содержит избыточную логику или неиспользованные блоки, HDL Coder™ удаляет блоки, компоненты или часть HDL-кода, который не способствует выходу.
Компоненты, которые не способствуют выходу в проекте, удалены во время генерации HDL-кода. Удаление избыточной логики уменьшает размер кода и избегает потенциальных отказов синтеза с нисходящими инструментами при развертывании кода на целевую платформу. Если компонент или логика сохраняются во время генерации HDL-кода, тот компонент или логика рассматриваются активными. Эта оптимизация улучшает производительность вашего проекта на целевом компьютере. Оптимизация не влияет на поддержку трассируемости.
Избыточная логика в вашем проекте удалена в сочетании с оптимизацией удаления неиспользуемого порта. Чтобы узнать об этой оптимизации, смотрите, Оптимизируют Неподключенные порты в HDL-коде для Моделей Simulink.
HDL Coder не обрабатывает компонент или логику как избыточные в этих случаях:
Компонент имеет по крайней мере один выходной порт, который вносит в оценку DUT выход.
Компонент имеет по крайней мере один выходной порт, который способствует оценке порта управления блока Subsystem, который активен.
Компонент имеет по крайней мере один выходной порт, который способствует оценке входа компонента, который сохраняется во время генерации HDL-кода.
Компонент является активной подсистемой черного квадрата, или содержит активную подсистему черного квадрата или соединяется с активной подсистемой черного квадрата, аналогичной описанному ниже.
Компонент является блоком FPGA Data Capture.
В других случаях генератор кода обрабатывает логику как избыточную и удаляет связанные блоки или компоненты во время генерации кода. Кроме того, блоки, которым установили архитектуру HDL на No HDL
, такой как Осциллограф, Утверждение, Терминатор, и С блоками Рабочей области рассматривается избыточным, и удален во время генерации кода.
Во время генерации кода HDL Coder удаляет избыточную логику или блоки, которые не вносят в DUT выход. Откройте модель hdlcoder_remove_redundant_logic
.
open_system('hdlcoder_remove_redundant_logic') set_param('hdlcoder_remove_redundant_logic', 'SimulationCommand', 'update');
DUT
блок подсистемы содержит блок switch и Enabled блок Subsystem. На основе входа управления к блоку switch, ложному пути от Subsystem_2
передается выходу. EnabledSubsystem_1
блок выход отключен блоком Display и активно не способствует выходу.
open_system('hdlcoder_remove_redundant_logic/DUT')
Сгенерировать HDL-код для проекта, в командной строке MATLAB®, введите:
makehdl('hdlcoder_remove_redundant_logic/DUT')
Сгенерированный код VHDL показывает, что HDL Coder оценил условие блока switch во время компиляции, чтобы передать вход от Subsystem_2
к выходу и устраненному Subsystem_1
введите ветвь. EnabledSubsystem_1
блок удален во время генерации HDL-кода, поскольку это не имеет активного выхода.
ARCHITECTURE rtl OF DUT IS
-- Component Declarations COMPONENT Subsystem_2 PORT( Out1 : OUT std_logic_vector(31 DOWNTO 0) -- single ); END COMPONENT;
-- Component Configuration Statements FOR ALL : Subsystem_2 USE ENTITY work.Subsystem_2(rtl);
-- Signals SIGNAL Subsystem_2_out1 : std_logic_vector(31 DOWNTO 0); -- ufix32
BEGIN u_Subsystem_2 : Subsystem_2 PORT MAP( Out1 => Subsystem_2_out1 -- single );
Out1 <= Subsystem_2_out1;
END rtl;
Подсистемы черного квадрата являются блоками подсистемы, которым установили архитектуру HDL на BlackBox
. Интерфейс черного квадрата для подсистемы является сгенерированным компонентом VHDL или модулем Verilog, который включает только определения порта ввода и вывода HDL для подсистемы. Используйте сгенерированный интерфейс, чтобы интегрировать существующий вручную записанный HDL-код, сторонний IP или другой код, сгенерированный HDL Coder. Смотрите Генерируют Интерфейс Черного квадрата для Подсистемы.
Подсистемы черного квадрата, которые имеют по крайней мере один входной порт, рассматриваются допустимыми и сохраненными во время генерации HDL-кода. Входной порт может быть не связан. В этом случае Simulink® вставляет виртуальный сигнал, который имеет постоянное нулевое значение, как введено с блоком. В случае выходных портов подсистемы черного квадрата должны иметь по крайней мере один выходной порт, который соединяется с нисходящим блоком. Когда выходной порт соединяется, генератор кода идентифицирует подсистему черного квадрата как источник, который способствует расчету выходного значения и сохраняет его во время генерации кода.
Откройте модель hdlcoder_blackbox_redundant_logic
.
open_system('hdlcoder_blackbox_redundant_logic') sim('hdlcoder_blackbox_redundant_logic');
DUT
подсистема содержит подсистемы черного квадрата в полях, пометил Preserved
и Removed
. Подсистемы черного квадрата в Preserved
не удалены во время генерации кода, потому что у них есть по крайней мере один входной порт. Другие подсистемы черного квадрата, которые не имеют входного порта или имеют несвязанный выходной порт, удалены во время генерации кода.
open_system('hdlcoder_blackbox_redundant_logic/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_remove_redundant_logic/DUT')
Сгенерированный HDL-код показывает подсистемы в Preserved
раздел. Несвязанный входной порт автоматически соединяется с постоянным нулем.
ARCHITECTURE rtl OF DUT IS
-- Component Declarations COMPONENT bbx_with_io PORT( clk : IN std_logic; clk_enable : IN std_logic; reset : IN std_logic; In1 : IN vector_of_std_logic_vector8(0 TO 3); -- int8 [4] Out1 : OUT vector_of_std_logic_vector9(0 TO 3) -- sfix9 [4] ); END COMPONENT;
COMPONENT no_io_subsys_bbx_with_in PORT( clk : IN std_logic; reset : IN std_logic; enb : IN std_logic ); END COMPONENT;
COMPONENT bbx_with_in PORT( clk : IN std_logic; clk_enable : IN std_logic; reset : IN std_logic; In1 : IN std_logic_vector(15 DOWNTO 0) -- int16 ); END COMPONENT;
COMPONENT sink_bbx PORT( clk : IN std_logic; clk_enable : IN std_logic; reset : IN std_logic; In1 : IN std_logic_vector(7 DOWNTO 0) -- int8 ); END COMPONENT;
COMPONENT bbx_with_connected_out PORT( clk : IN std_logic; clk_enable : IN std_logic; reset : IN std_logic; Output : OUT std_logic_vector(16 DOWNTO 0) -- ufix17 ); END COMPONENT;
...
END rtl;
Блоки Subsystem сохраняются в сгенерированном HDL-коде, если блоки имеют по крайней мере один выходной порт, который вносит в оценку DUT выход. Блоки Subsystem также сохраняются, если они содержат подсистему черного квадрата, которая допустима. Подсистема черного квадрата допустима, если она содержит входной порт или выходной порт, который соединяется, аналогичен описанному выше.
Различные виды блоков подсистемы следуют этому соглашению.
Подсистема
Атомарная подсистема
Модели - ссылки
Различная подсистема
Подсистема Foreach
Триггируемая подсистема
Enabled подсистема
Синхронные подсистемы
Подсистемы маскированные
Для отдельных портов подсистемы удаление избыточной логики также варьируется в зависимости от того, задаете ли вы установку Remove Unused Ports в диалоговом окне Configuration Parameters. Смотрите Удаляют Неиспользуемые порты.
Откройте модель hdlcoder_subsys_redundant_logic
.
open_system('hdlcoder_subsys_redundant_logic') sim('hdlcoder_subsys_redundant_logic');
DUT
подсистема содержит блоки подсистемы в полях, пометил Preserved
и Removed
. Блоки Subsystem в Preserved
не удалены во время генерации кода, потому что у них есть по крайней мере один выходной порт, которые вносят в оценку DUT выход или имеют допустимую подсистему черного квадрата. Другие подсистемы черного квадрата, которые не имеют активного выходного порта, удалены во время генерации кода.
open_system('hdlcoder_subsys_redundant_logic/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_subsys_redundant_logic/DUT')
Сгенерированный HDL-код показывает подсистемы в Preserved
раздел.
ARCHITECTURE rtl OF DUT IS
-- Component Declarations COMPONENT subsys_with_io 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;
COMPONENT subsys_with_out PORT( Out2 : OUT std_logic_vector(7 DOWNTO 0) -- int8 ); END COMPONENT;
COMPONENT subsys_with_no_io_valid_bbx PORT( clk : IN std_logic; reset : IN std_logic; enb : IN std_logic ); END COMPONENT;
...
END rtl;
Для портов данных подсистемы удаление избыточной логики также зависит от того, задаете ли вы установку Remove Unused Ports. Смотрите Оптимизируют Неподключенные порты в HDL-коде для Моделей Simulink.
Порты управления не затронуты установкой Remove Unused Ports. Порты управления и компоненты, которые способствуют оценке портов управления, сохраняются в сгенерированном HDL-коде, только если целый экземпляр подсистемы рассматривается активным.
open_system('hdlcoder_control_redundant_logic') sim('hdlcoder_control_redundant_logic');
DUT
подсистема содержит две атомарных подсистемы с входом, который управляет портом Enable. Подсистема atomic_subsys_dead_out_instance_2
не активно, когда выходные параметры отключены.
open_system('hdlcoder_control_redundant_logic/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_control_redundant_logic/DUT')
atomic_subsys_dead_out_instance_2
включая порт управления и входной сигнал удален в сгенерированном HDL-коде.
ENTITY DUT IS PORT( clk : IN std_logic; reset : IN std_logic; clk_enable : IN std_logic; In1 : IN std_logic_vector(15 DOWNTO 0); -- int16 ce_out : OUT std_logic; 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( clk : IN std_logic; reset : IN std_logic; enb : IN std_logic; In1 : IN std_logic_vector(15 DOWNTO 0); -- int16 Enable : IN std_logic; Out1 : OUT std_logic_vector(15 DOWNTO 0); -- int16 Out2 : OUT std_logic_vector(15 DOWNTO 0) -- int16 ); END COMPONENT;
...
END rtl;
Избыточная логика в атомарных подсистемах, моделях - ссылках и блоках Subsystem Foreach обработана таким же образом во время генерации HDL-кода. Избыточная логика за пределами атомарных подсистем удалена во время генерации HDL-кода.
Откройте модель hdlcoder_atomic_subsys2_redundant
.
open_system('hdlcoder_atomic_subsys2_redundant') sim('hdlcoder_atomic_subsys2_redundant');
DUT
подсистема содержит один блок Atomic Subsystem. Блок Constant вводится к подсистеме, которой соединили блок Add с блоком Terminator.
open_system('hdlcoder_atomic_subsys2_redundant/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_atomic_subsys2_redundant/DUT')
Когда вы генерируете HDL-код, блок Add и входной порт удалены, потому что блоки не способствуют оценке выходного порта DUT.
ENTITY atomic_subsys_dead_out_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 ); END atomic_subsys_dead_out_instance_1;
ARCHITECTURE rtl OF atomic_subsys_dead_out_instance_1 IS
...
In1_signed <= signed(In1);
Gain_mul_temp <= to_signed(16#000A#, 16) * In1_signed; Gain_out1 <= Gain_mul_temp(15 DOWNTO 0);
Out1 <= std_logic_vector(Gain_out1);
Gain1_mul_temp <= to_signed(16#0014#, 16) * In1_signed; Gain1_out1 <= Gain1_mul_temp(15 DOWNTO 0);
Out2 <= std_logic_vector(Gain1_out1);
END rtl;
Если существует больше чем один активный экземпляр блоков Атомарной подсистемы, избыточная логика oomputation не пересекает контур подсистемы, и блоки сохраняются в сгенерированном HDL-коде.
Откройте модель hdlcoder_atomic_subsys1_redundant
.
open_system('hdlcoder_atomic_subsys1_redundant') sim('hdlcoder_atomic_subsys1_redundant');
DUT
подсистема содержит две атомарных подсистемы. В этих подсистемах блок Add соединяется с блоком Terminator.
open_system('hdlcoder_atomic_subsys1_redundant/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_atomic_subsys1_redundant/DUT')
Когда вы генерируете HDL-код, блок Add удален, потому что это не способствует оценке выходного порта DUT. Как существует два экземпляра атомарной подсистемы, которые активны, входной порт с блоком Add сохраняется во время генерации HDL-кода.
Один файл HDL atomic_subsys_dead_out_instance_1
сгенерирован для атомарных подсистем. Этот файл содержит In2
объявление порта, но не использовано в HDL-коде. На уровне DUT, DUT.vhd
, блок Constant сохраняется, хотя он питается во входной порт, который не управляет никаким компонентом в Атомарной подсистеме.
ENTITY atomic_subsys_dead_out_instance_1 IS 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 atomic_subsys_dead_out_instance_1;
ARCHITECTURE rtl OF atomic_subsys_dead_out_instance_1 IS
-- Signals SIGNAL In1_signed : signed(15 DOWNTO 0); -- int16 SIGNAL Gain_mul_temp : signed(31 DOWNTO 0); -- sfix32 SIGNAL Gain_out1 : signed(15 DOWNTO 0); -- int16 SIGNAL Gain1_mul_temp : signed(31 DOWNTO 0); -- sfix32 SIGNAL Gain1_out1 : signed(15 DOWNTO 0); -- int16
...
END rtl;
Когда у вас есть несколько экземпляров блоков Атомарной подсистемы, которые активны, эти экземпляры сохраняются в сгенерированном коде.
Откройте модель hdlcoder_atomic_subsys1_ports_redundant
.
open_system('hdlcoder_atomic_subsys1_ports_redundant') sim('hdlcoder_atomic_subsys1_ports_redundant');
DUT
подсистема содержит две атомарных подсистемы, которые активны.
open_system('hdlcoder_atomic_subsys1_ports_redundant/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_atomic_subsys1_ports_redundant/DUT')
Атомарные подсистемы сохраняются в сгенерированном HDL-коде, но вычисление блока Gain удалено из кода. В этом случае несколько экземпляров атомарной подсистемы активны таким образом, избыточная логика не удалена через контур порта.
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 Out3 : OUT std_logic_vector(15 DOWNTO 0); -- int16 Out4 : 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 Out3 : OUT std_logic_vector(15 DOWNTO 0) -- int16 ); END COMPONENT;
...
Out1 <= atomic_subsys_dead_out_instance_1_out1;
Out2 <= atomic_subsys_dead_out_instance_1_out2;
Out3 <= atomic_subsys_dead_out_instance_2_out1;
Out4 <= atomic_subsys_dead_out_instance_2_out2;
END rtl;
Когда по крайней мере один экземпляр блока Atomic Subsystem не активен и когда существуют неиспользованные выходные порты вне блоков Атомарной подсистемы, сгенерированный HDL-код варьируется в зависимости от установки Remove Unused Porta. Смотрите Оптимизируют Неподключенные порты в HDL-коде для Моделей Simulink.
Избыточная логика в подсистемах маскированных удалена таким же образом что касается регулярных блоков Subsystem. При генерации параметров маски как дженериков в HDL-коде установкой MaskParameterAsGeneric
к on
, типовые порты сохраняются в коде.
Откройте модель hdlcoder_masked_subsys_redundant
.
open_system('hdlcoder_masked_subsys_redundant') sim('hdlcoder_masked_subsys_redundant');
Модель содержит подсистему маскированную, которая имеет два параметра маски Gain
и Gain1
. Gain
имеет значение 10
и} Gain1 | имеет значение |20}.
open_system('hdlcoder_masked_subsys_redundant/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_masked_subsys_redundant/DUT')
Сгенерированный код показывает что типовые порты Gain
и Gain1
сохраняются, но выходной порт Out2
удален.
ENTITY Subsystem IS GENERIC( Gain : integer := 10; Gain1 : integer := 20 ); PORT( In1 : IN std_logic_vector(15 DOWNTO 0); -- int16 Out1 : OUT std_logic_vector(15 DOWNTO 0) -- int16 ); END Subsystem;
ARCHITECTURE rtl OF Subsystem IS
...
kconst <= to_signed(Gain, 16);
In1_signed <= signed(In1);
Gain_mul_temp <= kconst * In1_signed; Gain_out1 <= Gain_mul_temp(15 DOWNTO 0);
Out1 <= std_logic_vector(Gain_out1);
END rtl;
Аннотации или блоки DocBlock, которые являются внутренними активными подсистемами, сохраняются в сгенерированном HDL-коде. Подсистема активна, если она содержит по крайней мере один выходной порт, который приводит к оценке DUT выход или имеет активную подсистему черного квадрата, аналогичную описанному выше. Если HDL Coder решает, что подсистема, содержащая аннотацию или DocBlock, избыточна, то та аннотация или DocBlock также удалены из сгенерированного кода.
Откройте модель hdlcoder_annotations_redundant_logic
.
open_system('hdlcoder_annotation_redundant_logic') sim('hdlcoder_annotation_redundant_logic');
DUT
подсистема содержит Inner annotation
подсистема. Эта подсистема избыточна, потому что она не имеет активного выходного порта.
open_system('hdlcoder_annotation_redundant_logic/DUT')
Сгенерировать HDL-код для DUT
подсистема, запустите эту команду:
makehdl('hdlcoder_annotation_redundant_logic/DUT')
Сгенерированный HDL-код показывает Inner annotation
подсистема включая аннотацию Inner annotation
удаленный из сгенерированного HDL-кода.
ENTITY DUT IS PORT( In1 : IN vector_of_std_logic_vector8(0 TO 3); -- int8 [4] Out2 : OUT vector_of_std_logic_vector8(0 TO 3) -- int8 [4] ); END DUT;
ARCHITECTURE rtl OF DUT IS
BEGIN -- Removed -- -- Outer annotation
Out2 <= In1;
END rtl;
Избыточная логика и неиспользованные блоки удалены из модели, когда это содержит шины. Избыточная логическая оптимизация применяется таким же образом к виртуальным шинам, невиртуальным шинам и портам элемента шины.
Откройте модель hdlcoder_virtual_bus_redundant
.
open_system('hdlcoder_virtual_bus_redundant') sim('hdlcoder_virtual_bus_redundant');
DUT
подсистема содержит виртуальную шину, которая управляет innerSubsystem
блокируйтесь и блок Add. Один из сигналов шины соединяется с блоками Терминатора при выходе.
open_system('hdlcoder_virtual_bus_redundant/DUT')
Чтобы сгенерировать HDL-код для подсистемы DUT, запустите эту команду:
makehdl('hdlcoder_virtual_bus_redundant/DUT')
Сгенерированный HDL-код показывает, что избыточная логика удалена в проекте и входном порту и выходных портах, которые активны, сохраняются.
ENTITY DUT IS PORT( In1 : IN std_logic_vector(7 DOWNTO 0); -- int8 Out1 : OUT std_logic_vector(7 DOWNTO 0); -- int8 Out2 : OUT std_logic_vector(7 DOWNTO 0) -- int8 ); END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations COMPONENT innerS PORT( In1_signal1 : IN std_logic_vector(7 DOWNTO 0); -- int8 Out1 : OUT std_logic_vector(7 DOWNTO 0) -- int8 ); END COMPONENT;
...
END rtl;
В innerSubsystem
блокируйтесь, блок Add, соединенный с блоком Terminator, удален.
ENTITY innerSubsystem IS PORT( In1_signal1 : IN std_logic_vector(7 DOWNTO 0); -- int8 Out1 : OUT std_logic_vector(7 DOWNTO 0) -- int8 ); END innerSubsystem;
ARCHITECTURE rtl OF innerSubsystem IS
-- Signals SIGNAL signal1 : signed(7 DOWNTO 0); -- int8
BEGIN -- Removed
signal1 <= signed(In1_signal1);
Out1 <= std_logic_vector(signal1);
END rtl;
1. Когда ваша модель содержит несколько экземпляров атомарных подсистем, моделей - ссылок или блоков Subsystem Foreach, если эти блоки полны решимости быть активными во время генерации HDL-кода, то все порты сохраняются в сгенерированном коде. Компоненты, соединенные в восходящем направлении с этими портами, также рассматриваются активными. Порты сохраняются независимые от того, разрешаете ли вы или отключаете DeleteUnusedPorts
установка. Это ограничение также применяется, когда вы используете сигналы шины. В случае сигналов шины, когда существует несколько экземпляров атомарных подсистем или моделей - ссылок, которые рассматриваются активными, сохраняется целая шина.
Откройте модель hdlcoder_atomic_bus_virtual_redundant
.
open_system('hdlcoder_atomic_virtual_bus_redundant') sim('hdlcoder_atomic_virtual_bus_redundant');
DUT
подсистема содержит две атомарных подсистемы, innerSubsystem
и innerSubsystem
блок. Оба экземпляра атомарной подсистемы активны.
open_system('hdlcoder_atomic_virtual_bus_redundant/DUT')
Чтобы сгенерировать HDL-код для подсистемы DUT, запустите эту команду:
makehdl('hdlcoder_atomic_virtual_bus_redundant/DUT')
Сгенерированный HDL-код показывает, что блок Gain, который управляет блоками атомарной подсистемы, сохраняется.
ENTITY DUT IS PORT( In1 : IN std_logic_vector(7 DOWNTO 0); -- int8 Out1 : OUT std_logic_vector(7 DOWNTO 0); -- int8 Out2 : OUT std_logic_vector(7 DOWNTO 0) -- int8 ); END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations COMPONENT innerSubsystem PORT( In1_signal1 : IN std_logic_vector(7 DOWNTO 0); -- int8 In1_signal2 : IN std_logic_vector(7 DOWNTO 0); -- int8 Out1 : OUT std_logic_vector(7 DOWNTO 0) -- int8 ); END COMPONENT;
...
u_innerSubsystem : innerSubsystem
PORT MAP( In1_signal1 => In1, -- int8
In1_signal2 => std_logic_vector(Gain_out1), -- int8
Out1 => innerSubsystem_out1 -- int8
);
u_innerSubsystem1 : innerSubsystem
PORT MAP( In1_signal1 => In1, -- int8
In1_signal2 => std_logic_vector(Gain_out1), -- int8
Out1 => innerSubsystem1_out1 -- int8
);
In1_signed <= signed(In1);
Gain_cast <= resize(In1_signed & '0', 16);
Gain_out1 <= Gain_cast(7 DOWNTO 0);
Out1 <= innerSubsystem_out1;
Out2 <= innerSubsystem1_out1;
END rtl;
2. Для моделей, которые имеют векторные сигналы, действие блоков Демультиплексора как контуры для избыточной логической оптимизации. Избыточная логика и компоненты, которые являются нисходящими из блока Demux, удалены во время генерации HDL-кода. Оптимизация не пересекает контур блока Demux и поэтому сохраняет компоненты, которые являются восходящими из блока Demux. Это ограничение при использовании векторов также применяется, когда вы преобразуете шины в векторы.
Откройте модель hdlcoder_vector_redundant_logic
.
open_system('hdlcoder_vector_redundant_logic') sim('hdlcoder_vector_redundant_logic');
DUT
подсистема содержит innerSubsystem
блок. Эта подсистема имеет один активный выходной порт, и другой порт отключен.
open_system('hdlcoder_vector_redundant_logic/DUT')
Чтобы сгенерировать HDL-код для подсистемы DUT, запустите эту команду:
makehdl('hdlcoder_vector_redundant_logic/DUT')
Сгенерированный HDL-код показывает, что блок Add выполняет вектор, Добавляет вычисление. И блок Gain и блок Add сохраняются в сгенерированном HDL-коде, когда избыточная логическая оптимизация не пересекает контур блока Demux.
ENTITY DUT IS PORT( In1 : IN std_logic_vector(7 DOWNTO 0); -- int8 Out1 : OUT std_logic_vector(8 DOWNTO 0); -- sfix9 Out2 : OUT std_logic_vector(8 DOWNTO 0) -- sfix9 ); END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations COMPONENT innerSubsystem PORT( In1 : IN vector_of_std_logic_vector9(0 TO 1); -- sfix9 [2] Out1 : OUT std_logic_vector(8 DOWNTO 0) -- sfix9 ); END COMPONENT;
...
In1_signed <= signed(In1);
Gain1_cast <= resize(In1_signed & '0' & '0', 16); Gain1_out1 <= Gain1_cast(7 DOWNTO 0);
Mux_out1(0) <= signed(In1); Mux_out1(1) <= Gain1_out1;
Add_out1_gen: FOR t_0 IN 0 TO 1 GENERATE Add_out1(t_0) <= resize(Mux_out1(t_0), 9) + resize(Mux_out1(t_0), 9); END GENERATE Add_out1_gen;
outputgen: FOR k IN 0 TO 1 GENERATE Add_out1_1(k) <= std_logic_vector(Add_out1(k)); END GENERATE;
Out2 <= std_logic_vector(Add_out1(0));
...
END rtl;