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

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

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

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

Похожие темы