В этом примере показано, как использовать оптимизацию совместного использования подсистемы в HDL Coder.
Совместное использование - это оптимизация уровня подсистемы, поддерживаемая HDL Coder для реализации экономичного оборудования.
По умолчанию кодер реализует оборудование, которое является отображением 1 к 1 блоков Simulink для реализации аппаратных модулей. Оптимизация совместного использования ресурсов позволяет пользователям совместно использовать оборудование ресурсы путем включения N-to-1 отображение функционально эквивалентных блоков Simulink 'N в одно оборудование модуль. Пользователь задает 'N', используя параметр реализации 'SharingFactor'.
Поскольку мультиплексированная по времени архитектура имеет большую задержку для завершения операции, HDL- Coder™ автоматически управляет расхождением во времени в зависимости от того, какие ресурсы разделяются. Предположим, что общие ресурсы работают с базовой частотой дискретизации, затем совместное использование ресурсов реализуется как локальная многоскоростная архитектура, которая описывается в этом примере. Если общие ресурсы работают с более медленной частотой дискретизации, чем базовая частота дискретизации, то HDL- Coder™ вызывает конвейеризацию тактовой частоты, чтобы синтезировать реализацию, которая использует бюджет задержки, заданный в дифференциале скорости. В этом случае совместно используемая архитектура ресурсов является реализацией с одной скоростью и делает несколько временных шагов, чтобы выполнить все общие операции. Архитектура совместного использования ресурсов с одной скоростью описывает детали этой реализации.
Остальная часть этого примера иллюстрирует локальную многоскоростную архитектуру совместного использования ресурсов. Рассмотрим следующую симметричную модель конечной импульсной характеристики фильтра. Он содержит 4 блока продукта, которые являются функционально эквивалентными и которые сопоставлены с 4 умножителями в оборудовании. В отчете об использовании ресурсов перечислены используемые аппаратные ресурсы.
bdclose all; load_system('sfir_fixed'); open_system('sfir_fixed/symmetric_fir'); hdlset_param('sfir_fixed', 'ResourceReport', 'on'); makehdl('sfir_fixed/symmetric_fir');
### Generating HDL for 'sfir_fixed/symmetric_fir'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('sfir_fixed', { 'HDL Code Generation' } )">sfir_fixed</a> for HDL code generation parameters. ### Running HDL checks on the model 'sfir_fixed'. ### Begin compilation of the model 'sfir_fixed'... ### Applying HDL optimizations on the model 'sfir_fixed'... ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'sfir_fixed'. ### Working on sfir_fixed/symmetric_fir as hdlsrc/sfir_fixed/symmetric_fir.vhd. ### Code Generation for 'sfir_fixed' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/sfir_fixed/html/sfir_fixed_codegen_rpt.html');">sfir_fixed_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/sfir_fixed/symmetric_fir_report.html ### HDL check for 'sfir_fixed' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
Чтобы уменьшить ресурсы области, можно вызвать оптимизацию совместного использования, задав параметру 'SharingFactor' в подсистеме положительное целое значение. Этот параметр задает 'N' в N-to-1 аппаратном отображении. В этом примере существует 4 блока продукта, поэтому генерация HDL с набором 'SharingFactor', равным 4, генерирует HDL с 1 умножителем.
Модель генерации кода отражает архитектуру совместного использования. Входы в общие блоки мультиплексируются во времени по общему ресурсу с более высокой скоростью (в этом случае в 4 раза быстрее, показано красным цветом). Выходы затем направляются соответствующим потребителям с более медленной скоростью (показана зеленым цветом).
hdlset_param('sfir_fixed/symmetric_fir', 'SharingFactor', 4); hdlset_param('sfir_fixed', 'GenerateValidationModel', 'on'); makehdl('sfir_fixed/symmetric_fir'); open_system('gm_sfir_fixed/symmetric_fir'); set_param('gm_sfir_fixed', 'SimulationCommand', 'update');
### Generating HDL for 'sfir_fixed/symmetric_fir'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('sfir_fixed', { 'HDL Code Generation' } )">sfir_fixed</a> for HDL code generation parameters. ### Running HDL checks on the model 'sfir_fixed'. ### Begin compilation of the model 'sfir_fixed'... ### Applying HDL optimizations on the model 'sfir_fixed'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 1 cycles. ### Output port 2: 1 cycles. ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('gm_sfir_fixed_vnl')">gm_sfir_fixed_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'sfir_fixed'. ### MESSAGE: The design requires 4 times faster clock with respect to the base rate = 1. ### Working on symmetric_fir_tc as hdlsrc/sfir_fixed/symmetric_fir_tc.vhd. ### Working on sfir_fixed/symmetric_fir as hdlsrc/sfir_fixed/symmetric_fir.vhd. ### Generating package file hdlsrc/sfir_fixed/symmetric_fir_pkg.vhd. ### Code Generation for 'sfir_fixed' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/sfir_fixed/html/sfir_fixed_codegen_rpt.html');">sfir_fixed_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/sfir_fixed/symmetric_fir_report.html ### HDL check for 'sfir_fixed' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Оптимизация совместного использования реализована с помощью мультиплексирования с разделением по времени. Simulink требует, чтобы выходы совместно используемого ресурса были дискретизированы с предопределенной частотой дискретизации, поэтому HDL Coder разгоняет общий ресурс с более высокой скоростью, чем скорость передачи данных. В приведенном выше примере общая архитектура, которая включает в себя общий ресурс, мультиплексор-сериализатор на входах и демультиплексор-десериализатор на выходах, работает с 4-кратной скоростью входных данных, потому что 'Sharingfactor' = 4.
Переходы скорости, которые реализуют мультиплексирование во времени в архитектуре совместного использования ресурсов, вводят дополнительную задержку. Чтобы сохранить функциональную эквивалентность, балансировка задержки автоматически вставляет соответствующие задержки в параллельные пути слияния. Сгенерированная модель валидации позволяет пользователю проверить функциональную эквивалентность путем сравнения операции общей аппаратной архитектуры с исходной моделью.
sim('gm_sfir_fixed_vnl'); open_system('gm_sfir_fixed_vnl/Compare/Assert_y_out/compare: y_out') open_system('gm_sfir_fixed_vnl/Compare/Assert_delayed_xout/compare: delayed_xout')
Чистая избыточная дискретизация для всего проекта эквивалентна LCM всех значений 'SharingFactor', установленных на модели. Рассмотрим пример, hdlcoder_uniform_oversampling.slx. Он имеет две подсистемы: подсистема 'Share3' имеет 3 блока усиления, которые можно использовать совместно, и 'Share4' имеет 4 блока усиления, которые можно использовать совместно.
saved_warning_state = warning('off', 'hdlcoder:makehdl:DeprecateMaxOverSampling'); warning('off', 'hdlcoder:makehdl:DeprecateMaxComputationLatency'); bdclose('all'); load_system('hdlcoder_uniform_oversampling'); open_system('hdlcoder_uniform_oversampling/Subsystem'); set_param('hdlcoder_uniform_oversampling', 'SimulationCommand', 'update'); hdlsaveparams('hdlcoder_uniform_oversampling/Subsystem');
%% Set Model 'hdlcoder_uniform_oversampling' HDL parameters hdlset_param('hdlcoder_uniform_oversampling', 'GenerateValidationModel', 'on'); hdlset_param('hdlcoder_uniform_oversampling', 'HDLSubsystem', 'hdlcoder_uniform_oversampling'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_uniform_oversampling/Subsystem/Share3', 'SharingFactor', 3); % Set SubSystem HDL parameters hdlset_param('hdlcoder_uniform_oversampling/Subsystem/Share4', 'SharingFactor', 4);
Заметьте, что 'Share3' устанавливает свой 'SharingFactor' равным 3, а 'Share4' устанавливает свой 'SharingFactor' равным 4. HDL Coder™ применяет локальное совместное использование ресурсов к каждой подсистеме, и в результате для реализации HDL требуется LCM (3, 4) = 12x избыточная дискретизация. Об этом сообщается в сообщении во время генерации HDL-кода.
makehdl('hdlcoder_uniform_oversampling/Subsystem');
### Generating HDL for 'hdlcoder_uniform_oversampling/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_uniform_oversampling', { 'HDL Code Generation' } )">hdlcoder_uniform_oversampling</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_uniform_oversampling'. ### Begin compilation of the model 'hdlcoder_uniform_oversampling'... ### Applying HDL optimizations on the model 'hdlcoder_uniform_oversampling'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 1 cycles. ### Output port 2: 1 cycles. ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_uniform_oversampling_vnl')">gm_hdlcoder_uniform_oversampling_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_uniform_oversampling'. ### MESSAGE: The design requires 12 times faster clock with respect to the base rate = 0.1. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share3 as hdlsrc/hdlcoder_uniform_oversampling/Share3.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share4 as hdlsrc/hdlcoder_uniform_oversampling/Share4.vhd. ### Working on Subsystem_tc as hdlsrc/hdlcoder_uniform_oversampling/Subsystem_tc.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem as hdlsrc/hdlcoder_uniform_oversampling/Subsystem.vhd. ### Generating package file hdlsrc/hdlcoder_uniform_oversampling/Subsystem_pkg.vhd. ### Code Generation for 'hdlcoder_uniform_oversampling' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdlcoder_uniform_oversampling/Subsystem_report.html ### HDL check for 'hdlcoder_uniform_oversampling' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Один из способов обойти этот мультипликативный эффект избыточной дискретизации - установить «SharingFactor» всех подсистем в доступный бюджет передискретизации. В приведенном выше примере, если бюджет передискретизации составляет только 4x, задайте 'SharingFactor' = 4 для обоих 'Share3' и 'Share4'. В этом случае HDL Coder может делить меньше ресурсов, чем SharingFactor, и оставаться в простое для остальных циклов.
hdlset_param('hdlcoder_uniform_oversampling/Subsystem/Share3', 'SharingFactor', 4); makehdl('hdlcoder_uniform_oversampling/Subsystem');
### Generating HDL for 'hdlcoder_uniform_oversampling/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_uniform_oversampling', { 'HDL Code Generation' } )">hdlcoder_uniform_oversampling</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_uniform_oversampling'. ### Begin compilation of the model 'hdlcoder_uniform_oversampling'... ### Applying HDL optimizations on the model 'hdlcoder_uniform_oversampling'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 1 cycles. ### Output port 2: 1 cycles. ### Begin model generation. ### Model generation complete. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_uniform_oversampling_vnl')">gm_hdlcoder_uniform_oversampling_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_uniform_oversampling'. ### MESSAGE: The design requires 4 times faster clock with respect to the base rate = 0.1. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share3 as hdlsrc/hdlcoder_uniform_oversampling/Share3.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share4 as hdlsrc/hdlcoder_uniform_oversampling/Share4.vhd. ### Working on Subsystem_tc as hdlsrc/hdlcoder_uniform_oversampling/Subsystem_tc.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem as hdlsrc/hdlcoder_uniform_oversampling/Subsystem.vhd. ### Generating package file hdlsrc/hdlcoder_uniform_oversampling/Subsystem_pkg.vhd. ### Code Generation for 'hdlcoder_uniform_oversampling' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdlcoder_uniform_oversampling/Subsystem_report.html ### HDL check for 'hdlcoder_uniform_oversampling' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Заметьте, что коэффициент избыточной дискретизации теперь является LCM (4,4) = 4, и что это значение, сообщаемое во время генерации кода. В целом, рекомендуется задать значения 'SharingFactor' для доступного бюджета передискретизации. Если ваш проект содержит меньше общедоступных ресурсов, чем заданное значение 'SharingFactor', HDL Coder делит доступные ресурсы и разгоняет их на значение 'SharingFactor'. Однако, если вы хотите применить и совместное использование ресурсов, и другие оптимизации, которые используют оверклокинг, такие как потоковая передача или применение совместного использования ресурсов в нескольких вложенных подсистемах, это общее руководство может привести к более высокому коэффициенту избыточной дискретизации.
HDL Coder поддерживает совместное использование ресурсов 4 типов блока: Продукт, Gain, Атомарная подсистема и Функция MATLAB. Для блоков MATLAB Function используйте MATLAB Datapath
архитектура с фиксированными фиксированными точками. Эта архитектура является настройкой по умолчанию для типов с плавающей точкой. Вы можете задать HDL Architecture в диалоговом окне HDL Block Properties блока MATLAB Function.
Обмен функционально эквивалентными блоками Product и Gain означает совместное использование множителей в реализации HDL. Два блока Продукта являются функционально эквивалентными, если: a) типы данных их входов и выходов идентичны, b) их настройки параметры блоков идентичны, и c) их свойства HDL-блоков идентичны. Для блока Gain функциональная эквивалентность дополнительно требует, чтобы постоянное значение и типы данных также были идентичными. Однако, если типы данных константы усиления идентичны для двух блоков Gain с различными постоянными значениями усиления, HDL Coder может совместно использовать их. Точно так же, если блок Gain может быть реализован как блок Product с постоянным входом, и он имеет совпадающие типы данных, что и другой блок Product в проекте, кодер может совместно использовать их.
Третий тип блока, Atomic Subsystem, полезен для совместного использования функционально эквивалентных островков логики, инкапсулированных внутри атомарных подсистем. Две атомарные подсистемы функционально эквивалентны и могут совместно использоваться, если:
Их контрольные суммы Simulink идентичны
Их свойства блоков идентичны.
% The following example demonstrates an audio filtering model that applies % the same filter on the left and right channels. By default, HDL Coder % generates two filter modules in hardware. bdclose all; load_system('hdlcoder_audiofiltering'); open_system('hdlcoder_audiofiltering/Audio filter'); % The filters on the two audio channels can be shared by specifying a % 'SharingFactor' value of 2 on the encompassing subsystem. This generates % an architecture that uses only one filter, as shown below. hdlset_param('hdlcoder_audiofiltering/Audio filter', 'SharingFactor', 2); makehdl('hdlcoder_audiofiltering/Audio filter'); open_system('gm_hdlcoder_audiofiltering/Audio filter'); set_param('gm_hdlcoder_audiofiltering', 'SimulationCommand', 'update');
### Generating HDL for 'hdlcoder_audiofiltering/Audio filter'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_audiofiltering', { 'HDL Code Generation' } )">hdlcoder_audiofiltering</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_audiofiltering'. ### Begin compilation of the model 'hdlcoder_audiofiltering'... ### Applying HDL optimizations on the model 'hdlcoder_audiofiltering'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 1 cycles. ### Output port 2: 1 cycles. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_audiofiltering'. ### MESSAGE: The design requires 2 times faster clock with respect to the base rate = 0.00012207. ### Working on hdlcoder_audiofiltering/Audio filter/Filter_left as hdlsrc/hdlcoder_audiofiltering/Filter_left.vhd. ### Working on Audio filter_tc as hdlsrc/hdlcoder_audiofiltering/Audio_filter_tc.vhd. ### Working on hdlcoder_audiofiltering/Audio filter as hdlsrc/hdlcoder_audiofiltering/Audio_filter.vhd. ### Generating package file hdlsrc/hdlcoder_audiofiltering/Audio_filter_pkg.vhd. ### Code Generation for 'hdlcoder_audiofiltering' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdlcoder_audiofiltering/Audio_filter_report.html ### HDL check for 'hdlcoder_audiofiltering' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Поскольку 'SharingFactor' является параметром уровня подсистемы, различные подсистемы на разных уровнях иерархии могут задавать различные значения совместного использования. В примере аудиофильтра фильтры на каждом канале используют 3 блока усиления соответственно.
open_system('hdlcoder_audiofiltering/Audio filter/Filter_left');
Мы можем задать значение 'SharingFactor' 2 на верхнем уровне DUT, чтобы использовать фильтры на двух каналах. Кроме того, мы можем задать значение 'SharingFactor' 3 на каждой из подсистем фильтра, чтобы разрешить совместное использование 3 блоков усиления в каждом канале. Когда HDL-код теперь сгенерирован, сначала заметьте, что левый и правый фильтры были разделены, и у нас есть только один фильтр на верхнем уровне иерархии.
hdlset_param('hdlcoder_audiofiltering/Audio filter', 'SharingFactor', 2); hdlset_param('hdlcoder_audiofiltering/Audio filter/Filter_left', 'SharingFactor', 3); hdlset_param('hdlcoder_audiofiltering/Audio filter/Filter_right', 'SharingFactor', 3); makehdl('hdlcoder_audiofiltering/Audio filter'); open_system('gm_hdlcoder_audiofiltering/Audio filter'); set_param('gm_hdlcoder_audiofiltering', 'SimulationCommand', 'update');
### Generating HDL for 'hdlcoder_audiofiltering/Audio filter'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_audiofiltering', { 'HDL Code Generation' } )">hdlcoder_audiofiltering</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdlcoder_audiofiltering'. ### Begin compilation of the model 'hdlcoder_audiofiltering'... ### Applying HDL optimizations on the model 'hdlcoder_audiofiltering'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 2 cycles. ### Output port 2: 2 cycles. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_audiofiltering'. ### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 0.00012207. ### Working on hdlcoder_audiofiltering/Audio filter/Filter_left as hdlsrc/hdlcoder_audiofiltering/Filter_left.vhd. ### Working on Audio filter_tc as hdlsrc/hdlcoder_audiofiltering/Audio_filter_tc.vhd. ### Working on hdlcoder_audiofiltering/Audio filter as hdlsrc/hdlcoder_audiofiltering/Audio_filter.vhd. ### Generating package file hdlsrc/hdlcoder_audiofiltering/Audio_filter_pkg.vhd. ### Code Generation for 'hdlcoder_audiofiltering' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdlcoder_audiofiltering/Audio_filter_report.html ### HDL check for 'hdlcoder_audiofiltering' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Кроме того, 3 блока усиления в нижней части иерархии (внутри подсистемы фильтра) также являются общими. Конечным результатом является то, что мы сократили использование ресурсов с 6 умножителей до всего одного.
open_system('gm_hdlcoder_audiofiltering/Audio filter/Filter_left'); set_param('gm_hdlcoder_audiofiltering', 'SimulationCommand', 'update');
Совместное использование ресурсов также может быть объединено с другими оптимизациями, такими как потоковая оптимизация.
Рассмотрим модель ниже: она содержит 24-элементный вектор datapath и 3 векторов блока усиления, которые будут сопоставлены с 72 умножителями, по умолчанию. Потоковая передача может скаляризировать векторный канал данных, в то время как совместное использование может совместно использовать 3 блока Gain.
bdclose all; load_system('hdl_areaopt1'); open_system('hdl_areaopt1/Controller'); set_param('hdl_areaopt1', 'SimulationCommand', 'update');
Чтобы вызвать обе оптимизации, мы задаем 'StreamingFactor' равным 24 и 'SharingFactor' равным 3. Первый уменьшает количество умножителей с 72 до 3, а второй уменьшает 3 скалярных умножителя до 1.
hdlset_param('hdl_areaopt1/Controller', 'StreamingFactor', 24); hdlset_param('hdl_areaopt1/Controller', 'SharingFactor', 3); makehdl('hdl_areaopt1/Controller'); open_system('gm_hdl_areaopt1/Controller'); set_param('gm_hdl_areaopt1', 'SimulationCommand', 'update');
### Generating HDL for 'hdl_areaopt1/Controller'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_areaopt1', { 'HDL Code Generation' } )">hdl_areaopt1</a> for HDL code generation parameters. ### Running HDL checks on the model 'hdl_areaopt1'. ### Begin compilation of the model 'hdl_areaopt1'... ### Applying HDL optimizations on the model 'hdl_areaopt1'... ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 1: 2 cycles. ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdl_areaopt1'. ### MESSAGE: The design requires 72 times faster clock with respect to the base rate = 2. ### Working on Controller_tc as hdlsrc/hdl_areaopt1/Controller_tc.vhd. ### Working on hdl_areaopt1/Controller as hdlsrc/hdl_areaopt1/Controller.vhd. ### Generating package file hdlsrc/hdl_areaopt1/Controller_pkg.vhd. ### Code Generation for 'hdl_areaopt1' completed. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/tp687696c7/hdlsrc/hdl_areaopt1/Controller_report.html ### HDL check for 'hdl_areaopt1' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.