Распределённая конвейеризация для оптимизации тактовой частоты

В этом примере показано, как использовать распределенную конвейерную и контурную оптимизацию в HDL Coder, чтобы оптимизировать тактовую частоту.

Введение

Распределённая конвейеризация является оптимизацией всего проекта, поддерживаемой HDL Coder для улучшения тактовой частоты. Когда вы включаете опцию 'Distribute Pipeline Registers' в HDL Coder, кодер перераспределяет вход и выход регистры конвейера функции верхнего уровня вместе с другими регистрами в проекте в порядок, чтобы минимизировать комбинаторную логику между регистрами и, таким образом, максимизировать тактовую частоту чипа, синтезированного из сгенерированного HDL-кода.

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

MATLAB ® Design

Код MATLAB, используемый в примере, является простым конечная импульсная характеристика. Пример также показывает испытательный стенд MATLAB, который упражняет фильтр.

design_name = 'mlhdlc_fir';
testbench_name = 'mlhdlc_fir_tb';
  1. Проект: mlhdlc_fir

  2. Испытательный стенд: mlhdlc_fir_tb

Создайте новую папку и скопируйте соответствующие файлы

Выполните следующие строки кода, чтобы скопировать необходимые файлы примера во временную папку.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_fir'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

Моделируйте проект

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

mlhdlc_fir_tb

Создайте объект Config преобразования с фиксированной точкой

Чтобы выполнить преобразование с фиксированной точкой, вам нужен объект config 'fixpt'.

Создайте объект config 'fixpt' и укажите имя испытательного стенда:

close all;
fixptcfg = coder.config('fixpt');
fixptcfg.TestBenchName = 'mlhdlc_fir_tb';

Создайте объект Config генерации HDL-кода

Чтобы сгенерировать код, необходимо создать объект config 'hdl' и задать имя испытательного стенда:

hdlcfg = coder.config('hdl');
hdlcfg.TestBenchName = 'mlhdlc_fir_tb';

Распределённая конвейеризация

Чтобы увеличить тактовую частоту, пользователь может задать ряд входа и выходных этапов трубопровода для любого проекта. В этом конкретном примере опция Input pipelining устанавливается на '1', а опция Output pipelining устанавливается на '20'. Без каких-либо дополнительных опций, включенных эти настройки, вход один регистр трубопровода во всех портах входа проекта верхнего уровня и 20 выходы регистров трубопровода в каждом из портов выхода.

Если включена опция 'Distribute pipeline registers', HDL Coder пытается изменить положение регистров, чтобы достичь лучшей тактовой частоты.

В сложение с перемещением входа и выхода регистров конвейера HDL Coder также пытается переместить регистры, смоделированные внутри проекта, используя постоянные переменные или с такими системными объектами, как dsp. Задержка.

Дополнительные возможности для улучшений становятся доступными, если вы разворачиваете циклы. Опция 'Unroll Loops' разворачивает явные циклы for-loops в коде MATLAB в дополнение к неявным циклам for-loops, которые выводятся для векторных и матричных операций. 'Unroll Циклов' необходим для того, чтобы этот пример делал распределенные конвейеризации.

hdlcfg.InputPipeline = 1;
hdlcfg.OutputPipeline = 20;
hdlcfg.DistributedPipelining = true;
hdlcfg.LoopOptimization = 'UnrollLoops';

Исследуйте результаты синтеза

Если на вашей машине установлен ISE, запустите шаг логического синтеза

hdlcfg.SynthesizeGeneratedCode = true;
codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_fir

Просмотр отчета о результатах

edit codegen/mlhdlc_fir/hdlsrc/ise_prj/mlhdlc_fir_fixpt_syn_results.txt

В отчете о синтезе обратите внимание на тактовую частоту, сообщаемую инструментом синтеза. Когда вы синтезируете дизайн с циклом включенными опциями развертывания и распределённой конвейеризации, вы видите значительное увеличение тактовой частоты с конвейеризацией опциями включенными.

Очистка сгенерированных файлов

Выполните следующие команды, чтобы очистить временную папку проекта.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_fir'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');