HDL Coder™ может обнаружить атомарные подсистемы, которые идентичны, или идентичны за исключением их значений параметров маски, на любом уровне иерархии модели, и генерируют один допускающий повторное использование HDL module
или entity
. Допускающий повторное использование HDL-код генерируют как один файл и инстанцируют многократно.
Сгенерировать допускающий повторное использование HDL-код для атомарных подсистем:
DefaultParameterBehavior
Simulink® Configuration Parameter должен быть Inlined
. Можно установить этот параметр в командной строке при помощи set_param
или hdlsetup
функция. Чтобы задать эту установку в диалоговом окне Configuration Parameters, у вас должен быть Simulink Coder™.
Примечание
Используя hdlsetup
наборы InlineParams
свойство к on
. Включение этого параметра совпадает с установкой DefaultParameterBehavior
к Inlined
. Установка InlineParams
к off
изменения DefaultParameterBehavior
значение к Tunable
.
Логгирование функциональности не должно использоваться, такие как логгирование сигнала или использование блоков, таких как To Workspace или To File.
Атомарные подсистемы должны быть идентичными, или идентичными за исключением их значений параметров маски.
MaskParameterAsGeneric
должен быть on
. Для получения дополнительной информации смотрите, Генерируют параметрированный HDL-код от подсистемы маскированной.
Параметры маски должны быть ненастраиваемыми. Генератор кода не совместно использует атомарные подсистемы с параметрами маски, которые являются настраиваемыми.
Типами данных параметров маски не может быть double
или single
.
Настраиваемый параметр должен использоваться только в Constant или блоках Gain.
Типы данных порта должны соответствовать.
Если вы изменяете значение настраиваемого параметра маски, тип данных выходного порта может измениться. Если одна из атомарных подсистем имеет различный тип данных порта, код, сгенерированный для той подсистемы также, отличается.
Сгенерировать допускающий повторное использование HDL-код для виртуальных подсистем:
DefaultParameterBehavior
Параметром конфигурации Simulink должен быть Inlined
. Можно установить этот параметр в командной строке при помощи set_param
или hdlsetup
функция. Чтобы задать эту установку в диалоговом окне Configuration Parameters, у вас должен быть Simulink Coder.
Примечание
Используя hdlsetup
наборы InlineParams
свойство к on
. Включение этого параметра совпадает с установкой DefaultParameterBehavior
к Inlined
. Установка InlineParams
к off
изменения DefaultParameterBehavior
значение к Tunable
.
Логгирование функциональности не должно использоваться, такие как логгирование сигнала или использование блоков, таких как To Workspace или To File.
Виртуальные подсистемы должны быть идентичными, или идентичными за исключением их значений параметров маски.
SubsystemReuse
должен быть установлен в 'Atomic and Virtual'
.
Установка SubsystemReuse
к 'Atomic and Virtual'
уменьшает искусственные алгебраические ошибки и улучшает распознавание идентичных подсистем, независимо от их топологии в остальной части проекта. Идентификация подобных подсистем может помочь разделению ресурсов.
Устанавливать эти значения к вашей необходимой установке, в командном окне MATLAB, введите:
hdlset_param('myHDLModel', 'SubsystemReuse', 'Atomic and Virtual')
В качестве альтернативы можно установить эту опцию от панели HDL Code Generation верхнего уровня в диалоговом окне Configuration Parameters. Под Global Settings> Coding style, можно изменить настройки Code reuse к необходимой опции.
Предыдущий набор команд SubsystemReuse
опция для вашего проекта. Установить эту опцию только для текущего сеанса генерации кода, введите:
makehdl(<DUT system>, 'SubsystemReuse', 'Atomic and Virtual')
MaskParameterAsGeneric
должен быть on
. Для получения дополнительной информации смотрите, Генерируют параметрированный HDL-код от подсистемы маскированной.
Параметры маски должны быть ненастраиваемыми. Генератор кода не совместно использует атомарные подсистемы с параметрами маски, которые являются настраиваемыми.
Типами данных параметров маски не может быть double
или single
.
Настраиваемый параметр должен использоваться только в Constant или блоках Gain.
Типы данных порта должны соответствовать.
Если вы изменяете значение настраиваемого параметра маски, тип данных выходного порта может измениться. Если одна из атомарных подсистем имеет различный тип данных порта, код, сгенерированный для той подсистемы также, отличается.
Если ваш проект содержит идентичные атомарные подсистемы, кодер генерирует один HDL module
или entity
для подсистемы и инстанцирует его многократно.
hdlcoder_reusable_code_identical_subsystem
модель показывает пример подсистемы DUT, содержащей три идентичных атомарных подсистемы.
HDL Coder генерирует один файл VHDL®, vsum.vhd
, для этих трех подсистем.
makehdl('hdlcoder_reusable_code_identical_subsystem/DUT')
### Generating HDL for 'hdlcoder_reusable_code_identical_subsystem/DUT'. ### Starting HDL check. ### Generating new validation model: gm_hdlcoder_reusable_code_identical_subsystem_vnl. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_reusable_code_identical_subsystem'. ### Working on hdlcoder_reusable_code_identical_subsystem/DUT/vsum/Sum of Elements as hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\Sum_of_Elements.vhd. ### Working on hdlcoder_reusable_code_identical_subsystem/DUT/vsum as hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\vsum.vhd. ### Working on hdlcoder_reusable_code_identical_subsystem/DUT as hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\DUT.vhd. ### Generating package file hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\DUT_pkg.vhd. ### Creating HDL Code Generation Check Report DUT_report.html ### HDL check for 'hdlcoder_reusable_code_identical_subsystem' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
Сгенерированный код для подсистемы DUT, DUT.vhd
, содержит три инстанцирования vsum
компонент.
ARCHITECTURE rtl OF DUT IS -- Component Declarations COMPONENT vsum PORT( In1 : IN vector_of_std_logic_vector16(0 TO 9); -- int16 [10] Out1 : OUT std_logic_vector(19 DOWNTO 0) -- sfix20 ); END COMPONENT; -- Component Configuration Statements FOR ALL : vsum USE ENTITY work.vsum(rtl); -- Signals SIGNAL vsum_out1 : std_logic_vector(19 DOWNTO 0); -- ufix20 SIGNAL vsum1_out1 : std_logic_vector(19 DOWNTO 0); -- ufix20 SIGNAL vsum2_out1 : std_logic_vector(19 DOWNTO 0); -- ufix20 BEGIN u_vsum : vsum PORT MAP( In1 => In1, -- int16 [10] Out1 => vsum_out1 -- sfix20 ); u_vsum1 : vsum PORT MAP( In1 => In2, -- int16 [10] Out1 => vsum1_out1 -- sfix20 ); u_vsum2 : vsum PORT MAP( In1 => In3, -- int16 [10] Out1 => vsum2_out1 -- sfix20 ); Out1 <= vsum_out1; Out2 <= vsum1_out1; Out3 <= vsum2_out1; END rtl;
Если ваш проект содержит атомарные подсистемы, которые идентичны за исключением их настраиваемых значений параметров маски, можно сгенерировать один HDL module
или entity
для подсистемы. В сгенерированном коде, module
или entity
инстанцирован многократно.
Чтобы сгенерировать повторно используемый код для идентичных атомарных подсистем, включите MaskParameterAsGeneric
для модели. По умолчанию, MaskParameterAsGeneric
отключен.
Например, чтобы включить генерацию повторно используемого кода для атомарных подсистем с настраиваемыми параметрами в hdlcoder_reusable_code_parameterized_subsystem
модель, введите:
hdlset_param('hdlcoder_reusable_code_parameterized_subsystem','MaskParameterAsGeneric','on')
В качестве альтернативы в диалоговом окне Configuration Parameters, во вкладке HDL Code Generation> Global Settings> Coding Style, включают опцию Generate parameterized HDL code from masked subsystem.
hdlcoder_reusable_code_parameterized_subsystem
модель показывает пример подсистемы DUT, содержащей атомарные подсистемы, которые идентичны за исключением их настраиваемых значений параметров маски.
В hdlcoder_reusable_code_parameterized_subsystem/DUT
, модули усиления являются подсистемами со значениями усиления, представленными настраиваемыми параметрами маски. Значения усиления: 4 для gain_module
, 5 для gain_module1
, и 7 для gain_module2
.
С MaskParameterAsGeneric
активированный, HDL Coder генерирует один исходный файл, gain_module.v
, для трех подсистем модуля усиления.
makehdl('hdlcoder_reusable_code_parameterized_subsystem/DUT','MaskParameterAsGeneric','on',... 'TargetLanguage','Verilog')
### Generating HDL for 'hdlcoder_reusable_code_parameterized_subsystem/DUT'. ### Starting HDL check. ### Begin Verilog Code Generation for 'hdlcoder_reusable_code_parameterized_subsystem'. ### Working on hdlcoder_reusable_code_parameterized_subsystem/DUT/gain_module as hdlsrc\hdlcoder_reusable_code_parameterized_subsystem\gain_module.v. ### Working on hdlcoder_reusable_code_parameterized_subsystem/DUT as hdlsrc\hdlcoder_reusable_code_parameterized_subsystem\DUT.v. ### Creating HDL Code Generation Check Report DUT_report.html ### HDL check for 'hdlcoder_reusable_code_parameterized_subsystem' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
Сгенерированный код для подсистемы DUT, DUT.v
, содержит три инстанцирования gain_module
компонент.
module DUT ( In1, In2, In3, Out1, Out2, Out3 ); input [7:0] In1; // uint8 input [7:0] In2; // uint8 input [7:0] In3; // uint8 output [31:0] Out1; // uint32 output [31:0] Out2; // uint32 output [31:0] Out3; // uint32 wire [31:0] gain_module_out1; // uint32 wire [31:0] gain_module1_out1; // uint32 wire [31:0] gain_module2_out1; // uint32 gain_module # (.myGain(4) ) u_gain_module (.In1(In1), // uint8 .Out1(gain_module_out1) // uint32 ); assign Out1 = gain_module_out1; gain_module # (.myGain(5) ) u_gain_module1 (.In1(In2), // uint8 .Out1(gain_module1_out1) // uint32 ); assign Out2 = gain_module1_out1; gain_module # (.myGain(7) ) u_gain_module2 (.In1(In3), // uint8 .Out1(gain_module2_out1) // uint32 ); assign Out3 = gain_module2_out1; endmodule // DUT
В gain_module.v
, myGain
Verilog®
parameter
сгенерирован для настраиваемого параметра маски.
module gain_module ( In1, Out1 ); input [7:0] In1; // uint8 output [31:0] Out1; // uint32 parameter [31:0] myGain = 4; // ufix32 wire [31:0] kconst; // ufix32 wire [39:0] Gain_mul_temp; // ufix40 wire [31:0] Gain_out1; // uint32 assign kconst = myGain; assign Gain_mul_temp = kconst * In1; assign Gain_out1 = Gain_mul_temp[31:0]; assign Out1 = Gain_out1; endmodule // gain_module