exponenta event banner

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

Если конструкция содержит избыточные логические или неиспользуемые блоки, HDL Coder™ удаляет блоки, компоненты или часть кода HDL, которая не участвует в выводе.

Вопросы избыточной логики

Компоненты, которые не вносят вклад в вывод в проекте, удаляются во время генерации кода HDL. Удаление избыточной логики уменьшает размер кода и позволяет избежать возможных сбоев синтеза с помощью последующих средств при развертывании кода на целевой платформе. Если компонент или логика сохраняются во время генерации кода HDL, этот компонент или логика считается активным. Эта оптимизация повышает производительность конструкции на целевом оборудовании. Оптимизация не влияет на поддержку отслеживания.

Избыточная логика в конструкции удаляется в сочетании с неиспользуемой оптимизацией удаления портов. Сведения об этой оптимизации см. в разделе Оптимизация неподключенных портов в коде HDL для моделей Simulink.

Кодер HDL не считает компонент или логику избыточными в следующих случаях:

  • Компонент имеет, по меньшей мере, один выходной порт, который способствует оценке выходного сигнала DUT.

  • Компонент имеет, по меньшей мере, один выходной порт, который вносит вклад в оценку управляющего порта активного блока подсистемы.

  • Компонент имеет, по меньшей мере, один выходной порт, который вносит вклад в оценку ввода компонента, который сохраняется во время генерации кода HDL.

  • Компонент является активной подсистемой черного ящика или содержит активную подсистему черного ящика или подключен к активной подсистеме черного ящика, как описано ниже.

  • Компонент представляет собой блок захвата данных FPGA.

В других случаях генератор кода рассматривает логику как избыточную и удаляет связанные блоки или компоненты во время генерации кода. Кроме того, для блоков с архитектурой HDL установлено значение No HDLтакие блоки, как «Область», «Утверждение», «Терминатор» и «До рабочей области», считаются избыточными и удаляются во время создания кода.

Как работает удаление избыточной логики

Во время генерации кода кодер HDL удаляет резервную логику или блоки, которые не участвуют в выводе DUT. Открытие модели hdlcoder_remove_redundant_logic.

open_system('hdlcoder_remove_redundant_logic')
set_param('hdlcoder_remove_redundant_logic', 'SimulationCommand', 'update');

DUT блок подсистемы содержит блок коммутатора и блок включенной подсистемы. На основе управляющего ввода в блок Switch, ложный путь от Subsystem_2 передается на выход. EnabledSubsystem_1 вывод блока завершается блоком отображения и не вносит активного вклада в вывод.

open_system('hdlcoder_remove_redundant_logic/DUT')

Для создания кода HDL для проекта в командной строке MATLAB ® введите:

makehdl('hdlcoder_remove_redundant_logic/DUT')

Сгенерированный код VHDL показывает, что кодер HDL оценивал состояние блока коммутатора во время компиляции для передачи входных данных из 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. См. раздел Создание интерфейса черного ящика для подсистемы.

Подсистемы черного ящика, имеющие хотя бы один входной порт, считаются действительными и сохраняются при формировании кода 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;

Резервированная логика в блоках подсистем

Блоки подсистемы сохраняются в сгенерированном коде HDL, если блоки имеют по меньшей мере один выходной порт, который вносит вклад в оценку выходного сигнала DUT. Блоки подсистемы также сохраняются, если они содержат действительную подсистему черного ящика. Подсистема черного ящика действительна, если она содержит входной порт или выходной порт, который подключен, как описано выше.

Этому соглашению следуют различные типы блоков подсистем.

  • Подсистема

  • Атомная подсистема

  • Ссылки на модель

  • Вариационная подсистема

  • Подсистема Foreach

  • Срабатывающая подсистема

  • Включенная подсистема

  • Синхронные подсистемы

  • Маскированные подсистемы

Для отдельных портов подсистемы удаление избыточной логики также зависит от того, задан ли параметр «Удалить неиспользуемые порты» в диалоговом окне «Параметры конфигурации». См. раздел Удаление неиспользуемых портов.

Открытие модели hdlcoder_subsys_redundant_logic.

open_system('hdlcoder_subsys_redundant_logic')
sim('hdlcoder_subsys_redundant_logic');

DUT подсистема содержит блоки подсистемы внутри блоков с маркировкой Preserved и Removed. Блоки подсистемы внутри 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;

Резервированная логика в портах подсистемы

Для портов данных подсистемы удаление избыточной логики также зависит от того, задан ли параметр «Удалить неиспользуемые порты». См. раздел Оптимизация неподключенных портов в коде HDL для моделей Simulink.

Параметр «Удалить неиспользуемые порты» не влияет на управляющие порты. Управляющие порты и компоненты, способствующие оценке управляющих портов, сохраняются в сгенерированном коде 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 включение порта управления и входного сигнала удаляется в сгенерированный код ЛПВП.

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;

Избыточная логика в атомных подсистемах и ссылках на модели

Избыточная логика в атомных подсистемах, ссылках на модели и блоках подсистемы Foreach обрабатывается одинаково во время генерации кода HDL. Избыточная логика на границе атомных подсистем удаляется при формировании кода ЛВП.

Открытие модели hdlcoder_atomic_subsys2_redundant.

open_system('hdlcoder_atomic_subsys2_redundant')
sim('hdlcoder_atomic_subsys2_redundant');

DUT подсистема содержит один блок атомной подсистемы. Блок константы вводится в подсистему, которая имеет блок добавления, подключенный к блоку терминатора.

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');

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-коде, но вычисление блока усиления удаляется из кода. В этом случае экземпляры нескольких атомных подсистем активны, и, таким образом, избыточная логика не удаляется через границу порта.

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 не активен и если за пределами блоков Atomic Subsystem имеются неиспользуемые выходные порты, генерируемый код HDL изменяется в зависимости от параметра Remove Unused Porta. См. раздел Оптимизация неподключенных портов в коде HDL для моделей Simulink.

Избыточная логика в маскированных подсистемах

Избыточная логика в маскированных подсистемах удаляется таким же образом, как и для обычных блоков подсистем. При формировании параметров маски как дженерик-программ в коде 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 определяет, что подсистема, содержащая аннотацию или 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 блок и блок добавления. Один из сигналов шины подключен к блокам терминатора на выходе.

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. Если модель содержит несколько экземпляров атомных подсистем, ссылок на модель или блоков Foreach Subsystem, если эти блоки определены как активные во время генерации кода 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 показывает, что блок усиления, который управляет блоками атомной подсистемы, сохраняется.

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');

DUT подсистема содержит innerSubsystem блок. Эта подсистема имеет один активный выходной порт, а другой порт завершается.

open_system('hdlcoder_vector_redundant_logic/DUT')

Чтобы создать код HDL для подсистемы DUT, выполните следующую команду:

makehdl('hdlcoder_vector_redundant_logic/DUT')

Сгенерированный код HDL показывает, что блок Add выполняет векторное вычисление 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;

Связанные темы