Оптимизация несвязанных портов в HDL-коде для моделей Simulink

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

Как работает удаление неиспользованных портов

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

Эффект удаления неиспользованного порта можно увидеть в сгенерированном HDL-коде. Порты не удаляются из моделей DUT верхнего уровня или подсистем, моделей реализации или моделей валидации.

Откройте модель hdlcoder_RemoveUnconnectedPorts содержит порты Элемент и порт, соединенный с неактивным выходом.

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

Откройте dut Блок Subsystem, а затем откройте mid_Subsystem блок. The mid_Subsystem содержит порты элемента шины. Один из выходных сигналов соединяется с блоком Terminator.

open_system('hdlcoder_RemoveUnconnectedPorts/dut/mid_Subsystem')

Чтобы сгенерировать HDL-код для проекта, в командной строке MATLAB ® введите:

makehdl('hdlcoder_RemoveUnconnectedPorts/dut')

Сгенерированный код mid_Subsystem.vhd показывает, что несвязанные порты удаляются во время генерации HDL-кода. Область входа InBus_signal3 в DUT входной порт умножается на блок Gain и затем соединяется с выходом портом OutBus_signal2, который затем передается в выходной порт DUT. Поскольку другие входные и выходные порты не используются на уровне DUT, эти порты удаляются из сгенерированного HDL-кода.

ARCHITECTURE rtl OF mid_Subsystem IS
-- Component Declarations
COMPONENT inner_Subsystem
  PORT( clk              :   IN    std_logic;
        reset            :   IN    std_logic;
        enb              :   IN    std_logic;
        InBus_signal3    :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        OutBus_signal2   :   OUT   std_logic_vector(31 DOWNTO 0)  -- single
        );
END COMPONENT;
...
END rtl;

Отключить неиспользованную оптимизацию удаления портов

По умолчанию оптимизация включена и неиспользованные порты удаляются в сгенерированном HDL-коде.

Если вы не хотите, чтобы несвязанные порты были удалены из проекта:

  • В диалоговом окне Параметры конфигурации снимите флажок Удалить неиспользуемые порты.

  • Когда вы запускаете HDL Workflow Advisor, в задаче Set Генерации кода Опций > Set Optimization Опций, снимите флажок Remove Unused Ports.

  • В командной строке задайте DeleteUnusedPorts на off с hdlset_param или makehdl. Например, чтобы указать, что вы хотите сохранить неиспользованные порты в hdlcoder_RemoveUnconnectedPorts модель, запустите эту команду:

makehdl('hdlcoder_RemoveUnconnectedPorts/dut', 'DeleteUnusedPorts', 'off')

Сгенерированный HDL-код сохраняет неиспользованные порты Bus Elements.

ARCHITECTURE rtl OF mid_Subsystem IS
-- Component Declarations
COMPONENT inner_Subsystem
  PORT( clk                :   IN    std_logic;
        reset              :   IN    std_logic;
        enb                :   IN    std_logic;
        InBus_signal1      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        InBus_signal2      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        InBus_signal3      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        InBus_signal4      :   IN    std_logic_vector(31 DOWNTO 0);  -- single
        OutBus_signal1     :   OUT   std_logic_vector(31 DOWNTO 0);  -- single
        OutBus_signal2     :   OUT   std_logic_vector(31 DOWNTO 0)  -- single
        );
END COMPONENT;
...
END rtl;

Удаление неиспользованного порта для портов подсистемы

Эта оптимизация может удалить неиспользованные порты данных подсистемы. Порты управления и порты ссылочной модели не удаляются.

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

Откройте модель hdlcoder_subsys_ports_unused.

open_system('hdlcoder_subsys_ports_unused')
sim('hdlcoder_subsys_ports_unused');

Модель содержит normal_subsys_dead_out подсистема, содержащая выход порт out3 это завершено и не способствует выходу DUT.

open_system('hdlcoder_subsys_ports_unused/DUT')

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

makehdl('hdlcoder_subsys_ports_unused/DUT')

По умолчанию, когда DeleteUnusedPorts является on, порт вычисления блока и выхода Add, Out3, удаляются в сгенерированном HDL-коде.

ENTITY normal_subsys_dead_out 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 normal_subsys_dead_out;
ARCHITECTURE rtl OF normal_subsys_dead_out IS
...
  Out1 <= std_logic_vector(Gain_out1);
...
  Out2 <= std_logic_vector(Gain1_out1);
END rtl;

Как отключить DeleteUnusedPorts оптимизация, выполните эту команду:

makehdl('hdlcoder_subsys_ports_unused/DUT', 'DeleteUnusedPorts', 'off')

Когда вы задаете DeleteUnusedPorts на off, этот порт и вычисление блок сохранены в сгенерированном HDL-коде.

ENTITY normal_subsys_dead_out 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
       );
END normal_subsys_dead_out;
ARCHITECTURE rtl OF normal_subsys_dead_out IS
...
  Out1 <= std_logic_vector(Gain_out1);
...
  Out2 <= std_logic_vector(Gain1_out1
  Add_out1 <= to_signed(16#0000#, 16);
  Out3 <= std_logic_vector(Add_out1);
END rtl;

Неиспользованное удаление портов для атомарных подсистем

Для неиспользованных портов вне атомарных подсистем образцы атомарных подсистем удаляются из сгенерированного HDL-кода.

Откройте модель hdlcoder_atomic_subsys3_redundant

open_system('hdlcoder_atomic_subsys3_redundant')
sim('hdlcoder_atomic_subsys3_redundant');

The DUT подсистема содержит три образцов атомарных подсистем. Выходы двух образцов атомарной подсистемы соединяются с блоками Terminator.

open_system('hdlcoder_atomic_subsys3_redundant/DUT')

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

makehdl('hdlcoder_atomic_subsys3_redundant/DUT')
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
       );
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
        );
END COMPONENT;
...
END rtl;

Как задать DeleteUnusedPorts на off, выполните эту команду:

makehdl('hdlcoder_atomic_subsys3_redundant/DUT', 'DeleteUnusedPorts', 'off')

Если вы задаете DeleteUnusedPorta на off, порт входа In2 сохраняется в сгенерированном 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
       );
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
        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 COMPONENT;
...
END rtl;

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

Когда у вас есть несколько активные образцы атомарной подсистемы, избыточная логика через контур, включая любые порты, сохраняется в HDL-коде независимо от DeleteUnusedPorts настройка. Когда у вас есть только один образец Атомарная подсистема, по умолчанию, когда DeleteUnusedPorts является onудаляются любая избыточная логика и порты через контур подсистемы. Однако, если вы задаете DeleteUnusedPorts на offлюбой неиспользуемый порт сохраняется, хотя логика избыточна.

Откройте модель hdlcoder_atomic_subsys2_ports_redundant.

open_system('hdlcoder_atomic_subsys2_ports_redundant')
sim('hdlcoder_atomic_subsys2_ports_redundant');

The DUT подсистема содержит блок Атомарная подсистема, который содержит блок Add, соединенный с выходным портом, завершенным вне подсистемы.

open_system('hdlcoder_atomic_subsys2_ports_redundant/DUT')

Чтобы сгенерировать HDL-код для DUT подсистема, выполните эту команду:

makehdl('hdlcoder_atomic_subsys2_ports_redundant/DUT')

В сгенерированном HDL-коде блок Add и соответствующий выходной порт Out3 удаляются, потому что он не способствует активному выходу.

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
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT single_instance_atomic_subsys_dead_out
  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;
...
END rtl;

Как задать DeleteUnusedPorts на off, выполните эту команду:

makehdl('hdlcoder_atomic_subsys2_ports_redundant/DUT', 'DeleteUnusedPorts', 'off')

Если вы задаете DeleteUnusedPorts на off, порт выхода Out3 сохраняется в сгенерированном 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
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT single_instance_atomic_subsys_dead_out
  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;
...
END rtl;
ENTITY single_instance_atomic_subsys_dead_out 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
       );
END single_instance_atomic_subsys_dead_out;
ARCHITECTURE rtl OF single_instance_atomic_subsys_dead_out IS
...
Add_out1 <= to_signed(16#0000#, 16);
Out3 <= std_logic_vector(Add_out1);
END rtl;

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

Откройте модель hdlcoder_atomic_subsys3_ports_redundant.

open_system('hdlcoder_atomic_subsys3_ports_redundant')
sim('hdlcoder_atomic_subsys3_ports_redundant');

The DUT подсистема содержит блок Атомарная подсистема, который содержит блок Add, соединенный с выходным портом, завершенным вне подсистемы.

open_system('hdlcoder_atomic_subsys3_ports_redundant/DUT')

Два образцов атомарной подсистемы, у которых завершены выходные порты, удаляются в сгенерированном HDL-коде. В другом блоке Атомарная подсистема вычисление Add block и его выход удаляются.

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
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT atomic_subsys_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
        );
END COMPONENT;
...
-- Removed
--
-- Removed
u_atomic_subsys_instance_1 : atomic_subsys_instance_1
  PORT MAP( In1 => In1,  -- int16
            Out1 => atomic_subsys_instance_1_out1,  -- int16
            Out2 => atomic_subsys_instance_1_out2  -- int16
            );
Out1 <= atomic_subsys_instance_1_out1;
Out2 <= atomic_subsys_instance_1_out2;
END rtl;

Как задать DeleteUnusedPorts на off, выполните эту команду:

makehdl('hdlcoder_atomic_subsys3_ports_redundant/DUT', 'DeleteUnusedPorts', 'off')

Если вы задаете DeleteUnusedPorts на off, порт выхода Out3 сохраняется в сгенерированном 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
       );
END DUT;
ARCHITECTURE rtl OF DUT IS
-- Component Declarations
COMPONENT atomic_subsys_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;

Если вы видите сгенерированный HDL-код для образца Атомарная подсистема, он показывает, что расчеты и Out3 блок сохранены в сгенерированном HDL-коде.

ENTITY atomic_subsys_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
       Out3         :   OUT   std_logic_vector(15 DOWNTO 0)  -- int16
       );
END atomic_subsys_instance_1;
ARCHITECTURE rtl OF atomic_subsys_instance_1 IS
...
Add_out1 <= In1_signed + In1_signed;
Out3 <= std_logic_vector(Add_out1);
END rtl;

Ограничения

Если ваша модель содержит несколько образцы атомарных подсистем, моделей-ссылок или Блоков Subsystem Foreach, и эти блоки активны во время генерации HDL-кода, то порты сохраняются в сгенерированном коде. Компоненты, подключенные в восходящем направлении к этим портам, также считаются активными. Порты сохраняются независимо от того, включите ли вы или отключите DeleteUnusedPorts настройка.

Это ограничение также относится к сигналам шины. При этом вся шина сохраняется в сгенерированном HDL-коде. Для получения примера смотрите Удалить избыточную логику и Неиспользованные блоки в Сгенерированном HDL-коде.

Похожие темы