Если ваш проект содержит избыточную логику или неиспользованные блоки, HDL- Coder™ удаляет блоки, компоненты или часть HDL-кода, которая не способствует выходу.
Компоненты, которые не вносят вклад в выход в проекте, удаляются во время генерации HDL-кода. Удаление избыточной логики уменьшает размер кода и избегает возможных отказов синтеза с помощью нисходящих инструментов при развертывании кода на целевой платформе. Если компонент или логика сохраняются во время генерации HDL-кода, этот компонент или логика рассматривается как активная. Эта оптимизация улучшает эффективность вашего проекта на целевом компьютере. Оптимизация не влияет на поддержку трассируемости.
Избыточная логика в вашем проекте удаляется в сочетании с неиспользованной оптимизацией удаления портов. Чтобы узнать об этой оптимизации, смотрите Оптимизацию несвязанных портов в HDL-коде для моделей Simulink.
HDL Coder не рассматривает компонент или логику как избыточные в следующих случаях:
Компонент имеет по меньшей мере один выходной порт, который способствует evaulation выхода DUT.
Компонент имеет по меньшей мере один выходной порт, который способствует оценке порта управления блока Subsystem, который является активным.
Компонент имеет по меньшей мере один выходной порт, который способствует оценке входов компонента, который сохраняется во время генерации HDL-кода.
Компонент является активной подсистемой черного ящика или содержит активную подсистему черного ящика, или соединяется с активной подсистемой черного ящика, как описано ниже.
Компонентом является блок FPGA Data Capture.
В других случаях генератор кода обрабатывает логику как избыточную и удаляет связанные блоки или компоненты во время генерации кода. В сложение блоки, для которых HDL- архитектуры задано значение No HDL
, такие как возможности, Assertion, Terminator и To Workspace считаются избыточными и удаляются во время генерации кода.
Во время генерации кода HDL Coder удаляет избыточную логику или блоки, которые не вносят свой вклад в выход DUT. Откройте модель hdlcoder_remove_redundant_logic
.
open_system('hdlcoder_remove_redundant_logic') set_param('hdlcoder_remove_redundant_logic', 'SimulationCommand', 'update');
The DUT
блок подсистемы содержит блок Switch и блок Enabled Subsystem. На основе управляющего входа в блок Switch, ложный путь от Subsystem_2
передается в выход. The 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
входная ветвь. The 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');
The 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
Триггируемая подсистема
Включенная подсистема
Синхронные подсистемы
Маскированные подсистемы
Для отдельных портов подсистемы удаление избыточной логики также изменяется в зависимости от того, задан ли параметр Remove Unused Ports в диалоговом окне Параметры Конфигурации. См. Раздел «Удаление неиспользованных портов»
Откройте модель hdlcoder_subsys_redundant_logic
.
open_system('hdlcoder_subsys_redundant_logic') sim('hdlcoder_subsys_redundant_logic');
The 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.
Настройка «Удалить неиспользуемые порты» не влияет на порты управления. Порты и компоненты управления, которые способствуют оценке портов управления, сохраняются в сгенерированном HDL-коде, только если весь образец подсистемы считается активным.
open_system('hdlcoder_control_redundant_logic') sim('hdlcoder_control_redundant_logic');
The DUT
подсистема содержит две атомарные подсистемы с входом, который управляет портом Enable. Подсистема atomic_subsys_dead_out_instance_2
не активен, так как выходы прекращены.
open_system('hdlcoder_control_redundant_logic/DUT')
Чтобы сгенерировать HDL-код для DUT
подсистема, выполните эту команду:
makehdl('hdlcoder_control_redundant_logic/DUT')
The 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');
The DUT
подсистема содержит один блок Атомарная подсистема. Блок 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;
Если существует несколько активных образцов блоков Атомарная подсистема, избыточная логическая ОВК не пересекает контур подсистемы, и блоки сохраняются в сгенерированном HDL-коде.
Откройте модель hdlcoder_atomic_subsys1_redundant
.
open_system('hdlcoder_atomic_subsys1_redundant') sim('hdlcoder_atomic_subsys1_redundant');
The 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');
The 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;
Когда, по крайней мере, один образец блока Атомарная подсистема не активен и когда существуют неиспользованные выходные порты вне блоков Атомарная подсистема, сгенерированный HDL-код изменяется в зависимости от настройки Удалить неиспользованную Порту. Смотрите Оптимизацию несвязанных портов в 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');
The 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');
The DUT
подсистема содержит виртуальную шину, которая управляет innerSubsystem
блок и блок Add. Один из сигналов шины соединяется с блоками Terminator на выходе.
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');
The 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 выступают в качестве контуров для избыточной логической оптимизации. Избыточная логика и компоненты, расположенные ниже блока Demux, удаляются во время генерации HDL-кода. Оптимизация не пересекает контур блока Demux и поэтому сохраняет компоненты, которые находятся в восходящем направлении блока Demux. Это ограничение при использовании векторов также применяется при преобразовании шин в векторы.
Откройте модель hdlcoder_vector_redundant_logic
.
open_system('hdlcoder_vector_redundant_logic') sim('hdlcoder_vector_redundant_logic');
The DUT
подсистема содержит innerSubsystem
блок. Эта подсистема имеет один активный выходной порт, а другой порт отключен.
open_system('hdlcoder_vector_redundant_logic/DUT')
Чтобы сгенерировать HDL-код для подсистемы DUT, запустите эту команду:
makehdl('hdlcoder_vector_redundant_logic/DUT')
Сгенерированный HDL-код показывает, что блок Add выполняет векторное вычисление 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;