Удаление избыточных логических и неиспользованных блоков в сгенерированном HDL-коде

Если ваш проект содержит избыточную логику или неиспользованные блоки, 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

Блоки 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 и аннотациях

Аннотации или блоки 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;

Похожие темы