Проектируйте DDR5 модели IBIS-AMI для поддержки обратной Ссылки обучения

В этом примере показано, как создать модели AMI передатчика и приемника, которые поддерживают коммуникацию обучения ссылки (обратный канал) с использованием метода, аналогичного методу, заданному в спецификации IBIS 7.0, путем добавления к библиотечным блокам в SerDes Toolbox™. Этот пример использует передачу записи DDR5 (Controller to SDRAM), чтобы продемонстрировать настройку.

Введение

IBIS 7.0 представила возможность для моделей выполнять обучение ссылкам или автоматическое согласование путем предоставления механизма для связи исполняемых моделей Tx и Rx AMI во время работы GetWave. Алгоритм настройки ссылок может либо эмулировать то, что делает кремний, либо использовать методы анализа канала, чтобы определить оптимальные настройки эквализации Tx и Rx, затем заблокировать эти настройки на оставшуюся часть симуляции.

Связь между исполняемыми моделями Tx и Rx находится в сообщениях, которые понимают и исполняемые модели Tx, и Rx, и инструмент EDA не должен понимать. Эти согласованные сообщения называются протоколом интерфейса обратного канала. Спецификация IBIS не описывает детали протокола интерфейса Back-Channel Interface Protocol, а только метод, позволяющий обеспечить работу связи. В этом примере мы будем генерировать новый протокол с именем DDRx_Write.

В настоящее время SerDes Toolbox не поддерживает непосредственно резервные параметры интерфейса обратного канала IBIS-AMI. Вместо этого он поддерживает специфические параметры модели, которые имеют «_ST», добавленные к их имени, которые выполняют аналогичную функцию. Поскольку эти специфические параметры модели не используют то же имя что и зарезервированные параметры из спецификации IBIS, они должны использоваться или в качестве «согласованного набора» или с другими модели заднего канала, разработанными SerDes Toolbox, которые поддерживают тот же протокол. Эти модели должны хорошо работать в любом промышленном стандартном симуляторе модели AMI.

DDR5 Setup модели Tx/Rx IBIS-AMI в приложении SerDes Designer

Первая часть этого примера начинается с модели передатчика DDR5 контроллера DDR5 модели IBIS-AMI передатчика/получателя контроллера и модели AMI приемника SDRAM DDR5 модели IBIS-AMI передатчика/получателя SDRAM. Мы добавили несколько дополнительных сквозных блоков для поддержки межканальной связи, и затем вы экспортируете модель в Simulink ® для дальнейшей индивидуальной настройки.

Откройте модель DDR5_Write_txrx_ami путем ввода следующей команды в командном окне MATLAB ®:

>> serdesDesigner('DDR5_Write_txrx_ami')

Для транзакции записи передатчик (Tx) является DDR5 контроллером, использующим 3-контактную прямую эквализацию (FFE), в то время как приемник (Rx) использует усилитель переменного усиления (VGA) с 7 предопределенными настройками и эквалайзер обратной связи с 4-контактным решением (DFE) со встроенным восстановлением тактовых данных. Для поддержки этого строения система SerDes настраивается следующим образом:

Setup строения

  • Для параметра Symbol Time задано значение 208.3 ps, так как целевой уровень работы 4.8Gbps для DDR5-4800.

  • Целевое BER установлено в 100e-18.

  • Для сигнализации задано значение Single-ended.

  • Выборки по символу и модуляции сохраняются на значениях по умолчанию, которые 16 и NRZ (без возврата к нулю), соответственно.

Setup модели передатчика

  • Блок Tx_BCI Pass-Through является блоком, используемым для поддержки этой реализации обратного канала. Операция этого блока будет описываема ниже в этом примере.

  • Блок Tx FFE настраивается на одно предварительное касание, одно главное касание и одно последующее касание путем включения трех весов касания. Это делается с массивом [0 1 0], где основное касание задается самым большим значением в массиве. Области значений касаний будут добавлены позже в примере, когда модель экспортируется в Simulink.

  • Модель Tx AnalogOut настраивается так, чтобы Напряжение 1.1 V, Время нарастания 100 ps, R (выходное сопротивление) 50 ohms, и C (емкость) 0.65 pF. Фактические аналоговые модели, используемые в конечной модели, будут сгенерированы позже в этом примере.

Setup модели канала

  • Потеря канала установлена на 5 dB, что типично для каналов DDR.

  • Импеданс с одним концом установлен в 40 ом.

  • Целевая частота устанавливается в 2.4 ГГц, который является частотой Nyquist для 4,8 ГГц

Setup модели приемника

  • Модель Rx AnalogIn настраивается так, чтобы R (входное сопротивление) было 40 Ом и С (емкость) 0.65pF. Фактические аналоговые модели, используемые в конечной модели, будут сгенерированы позже в этом примере.

  • Блок Rx_BCI_Read Pass-Through является блоком, используемым для поддержки этой реализации обратного канала. Операция этого блока будет описываема ниже в этом примере.

  • Блок VGA настраивается с коэффициентом усиления 1, и Режим устанавливается на on. Конкретные пресеты VGA будут добавлены позже в этом примере после экспорта модели в Simulink.

  • Блок DFECDR настраивается для четырех ответвлений DFE, включая четыре значения начальных весов ответвлений, установленные на 0. Минимальное значение отвода установлено в [-0.2 -0.075 -0.06 -0.045] V, и Максимальное значение отвода установлено на [0.05 0.075 0.06 0.045] V. DFE настроена на использование 2x весов касаний в порядок, чтобы соответствовать определению касания JEDEC DFE.

  • Блок Rx_BCI_Write Pass-Through является блоком, используемым для поддержки этой реализации обратного канала. Операция этого блока будет описываема ниже в этом примере.

Экспорт системы SerDes в Simulink

Нажмите кнопку Экспорт, чтобы экспортировать строение в Simulink для дальнейшей индивидуальной настройки и генерации исполняемых файлов модели AMI.

DDR5 Setup модели Tx/Rx IBIS-AMI в Simulink

Эта часть примера берет систему SerDes, экспортированную приложением SerDes Designer, и настраивает ее по мере необходимости для DDR5 обратного канала операции в Simulink.

Просмотр Setup модели Simulink

Система SerDes, импортированная в Simulink, состоит из блоков Configuration, Stimulus, Tx, Analog Channel и Rx. Все настройки из приложения SerDes Designer переносятся в модель Simulink. Сохраните модель и проверьте каждую настройку блока.

  • Внутри подсистемы Tx дважды нажатие кнопки блок FFE, чтобы открыть диалоговое окно FFE Параметры Блоков. Разверните параметры IBIS-AMI и отмените выбор параметра Mode, эффективно жестко кодируя текущее значение Mode в конечной модели AMI, чтобы Fixed.

  • Внутри подсистемы Rx дважды нажатие кнопки блок VGA, чтобы открыть диалоговое окно параметров блоков VGA. Настройки Mode и Gain переносятся из приложения SerDes Designer.

  • Внутри подсистемы Rx дважды нажатие кнопки блок DFECDR, чтобы открыть диалоговое окно DFECDR Block Parameters. Начальные веса тапа, минимальное значение тапа DFE и максимальные настройки RMS передаются из приложения SerDes Designer. Адаптивный коэффициент усиления и адаптивный размер шага заданы равными 3e-06 и 1e-06, соответственно, которые являются разумными значениями, основанными на DDR5 ожиданиях SDRAM. Разверните параметры IBIS-AMI и отмените выбор параметров смещение и Reference offset, эффективно жестко кодируя эти параметры до их текущих значений.

Обновление параметров AMI передатчика (Tx)

Откройте вкладку AMI-Tx в диалоговом окне SerDes IBIS-AMI Manager. Сначала перечисляются зарезервированные параметры, за которыми следуют специфичные для модели параметры, придерживающиеся формата типового файла AMI.

  • Установите касание предварительного акцента: Edit TapWeights -1 и установите Формат на Range, Typ to 0, Min к -0.2, и Max to 0.2.

  • Установите основной тап: Edit TapWeights 0 и установите Формат на Range, Typ to 1, Min к 0.6, и Max to 1.

  • Установите после акцента касание: Edit TapWeights 1 и установите Формат на Range, Typ to 0, Min к -0.2, и Max to 0.2.

Создайте новые параметры AMI обратного канала Tx

Для поддержки операции обратного канала необходимы дополнительные параметры управления. На вкладке AMI-Tx в диалоговом окне SerDes IBIS-AMI Manager выделите Tx_BCI и добавьте следующие 6 новых параметров:

  • FFE_Tapm1: Этот параметр создает хранилище данных, которое используется для передачи значения предварительного отвода FFE между блоками Tx во время обучения. Нажмите Add Parameter... кнопка. Установите имя параметра в FFE_Tapm1, Текущее Значение для 0, Использование для InOut, Введите в Float, и Формат для Value. Установите описание следующим образом Tx FFE Tap -1 for back-channel training. Сохраните изменения и обратите внимание, что это автоматически создает Хранилища данных в Tx_BCI блоке PassThrough.

  • FFE_Tap0: Этот параметр создает хранилище данных, которое используется для передачи значения основного отвода FFE между блоками Tx во время обучения. Нажмите Add Parameter... кнопка. Установите имя параметра в FFE_Tap0, Текущее Значение для 0, Использование для InOut, Введите в Float, и Формат для Value. Установите описание следующим образом Tx FFE Tap 0 for back-channel training. Сохраните изменения.

  • FFE_Tap1: Этот параметр создает хранилище данных, которое используется для передачи значения post tap FFE между блоками Tx во время обучения. Нажмите Add Parameter... кнопка. Установите имя параметра в FFE_Tap1, Текущее Значение для 0, Использование для InOut, Введите в Float, и Формат для Value. Установите описание следующим образом Tx FFE Tap 1 for back-channel training. Сохраните изменения.

  • BCI_Protocol_ST: Этот параметр используется только для генерации параметра с именем «BCI_Protocol_ST» в файле .ami для частичной податливости спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_Protocol_ST, Текущее Значение в "DDRx_Write", Использование для Info, Введите в String, и Формат для Value. Установите описание следующим образом This model supports the DDRx Write Example back-channel protocol. NOTE: This model does not currently support the reserved parameter BCI_Protocol as an input to the model. Сохраните изменения.

  • BCI_ID_ST: Этот параметр используется только для генерации параметра с именем «BCI_ID_ST» в файле .ami для частичной податливости спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_ID_ST, Текущее Значение для "bci_comm", Использование для Info, Введите в String, и Формат для Value. Установите описание следующим образом This model creates files with names beginning with 'bci_comm' for back-channel communication. NOTE: This model does not currently support the AMI reserved parameter BCI_ID as an input to the model. Сохраните изменения.

  • BCI_State_ST: Этот параметр создает хранилище данных, которое используется для передачи состояния обратного обучения: 1 = Off, 2 = Training, 3 = Converged, 4 = Failed, 5 = ошибка. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_State_ST, Использование для InOut, Введите в Integer, и Формат для List. Установите описание следующим образом Back channel training status. NOTE: This model does not currently support the AMI reserved parameter BCI_State as an input to the model. Установите значение по умолчанию 2, Перечислите значения для [1 2 3 4 5] и List_Tip значения в ["Off" "Training" "Converged" "Failed" "Error"], затем установите значение Текущего значения "Training". Сохраните изменения.

Параметры AMI Приемник (Rx)

На вкладке AMI-Rx в диалоговом окне SerDes IBIS-AMI Manager сначала перечисляются зарезервированные параметры, за которыми следуют специфичные для модели параметры, придерживающиеся формата типового файла AMI.

  • Установите коэффициент усиления VGA: Edit Gain. Установите описание как: Rx Amplifier Gain. Убедитесь, что для формата задано значение List и установите значение По умолчанию на 1. Установите значения списка следующим [0.5 0.631 0.794 1 1.259 1.585 2] и List_Tip значения как ["-6 dB" "-4 dB" "-2 dB" "0 dB" "2 dB" "4 dB" "6 dB"], затем установите Текущее значение равным 0dB. Сохраните изменения.

  • Установите первый вес касания DFE: Edit TapWeights 1. Убедитесь, что для формата задано значение Range и установите Typ = 0, Min = -0.2, и Max = 0.05. Сохраните изменения.

  • Установите второй вес касания DFE: Edit TapWeights 2. Убедитесь, что для формата задано значение Range и установите Typ = 0, Min = -0.075, и Max = 0.075. Сохраните изменения.

  • Установите третий вес касания DFE: Edit TapWeights 3. Убедитесь, что для формата задано значение Range и установите Typ = 0, Min = -0.06, и Max = 0.06. Сохраните изменения.

  • Установите четвертый вес касания DFE: Edit TapWeights 4. Убедитесь, что для формата задано значение Range и установите Typ = 0, Min = -0.045, и Max = 0.045. Сохраните изменения.

Создайте новые параметры AMI обратного канала Rx

Для поддержки операции обратного канала необходимы дополнительные параметры управления. На вкладке AMI-Rx в диалоговом окне SerDes IBIS-AMI Manager подсветите Rx_BCI_Write и добавьте следующие новые параметры (Примечание: Rx_BCI_Read не требует никаких дополнительных параметров):

  • sampleVoltage: Этот параметр создает Хранилище Данных, которое будет использоваться, чтобы передать напряжение выборки CDR в другие блоки Rx во время обучения. Нажмите Add Parameter... кнопка. Установите имя параметра в sampleVoltage, Текущее Значение для 0, Использование для InOut, Введите в Float, и Формат для Value. Установите описание следующим образом Sample Voltage for back-channel training. Сохраните изменение и обратите внимание, что это автоматически создает Хранилища данных в Rx_BCI_Write блоке PassThrough.

  • BCI_Protocol_ST: Этот параметр генерирует только параметр с именем «BCI_Protocol_ST» в файле .ami для частичной податливости спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_Protocol_ST, Текущее Значение в "DDRx_Write", Использование для Info, Введите в String, и Формат для Value. Установите описание следующим образом This model supports the DDRx Write Example back-channel protocol. NOTE: This model does not currently support the AMI reserved parameter BCI_Protocol as an input to the model. Сохраните изменения.

  • BCI_ID_ST: Этот параметр генерирует только параметр с именем «BCI_ID_ST» в файле .ami для частичной податливости спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_ID_ST, Текущее значение для «bci_comm,» использования в Info, Введите в String, и Формат для Value. Установите описание как: T his model creates files with names beginning with 'bci_comm' for back-channel communication. NOTE: This model does not currently support the reserved parameter BCI_ID as an input to the model. Сохраните изменения.

  • BCI_State_ST: Этот параметр создает хранилище данных, которое используется для передачи состояния обратного обучения: 1 = Off, 2 = Training, 3 = Converged, 4 = Failed, 5 = ошибка. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_State_ST, Использование для InOut, Введите в Integer, и Формат для List. Установите описание следующим образом Back channel training status. NOTE: This model does not currently support the AMI reserved parameter BCI_State as an input to the model. Установите значение по умолчанию 2, Перечислите значения для [1 2 3 4 5] и List_Tip значения в ["Off" "Training" "Converged" "Failed" "Error"], затем установите значение Текущего значения "Training". Сохраните изменения.

  • BCI_Message_Interval_UI_ST: Этот параметр генерирует только параметр с именем «BCI_Message_Interval_UI» в файле .ami для частичной податливости спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_Message_Interval_UI_ST, Текущее Значение для 64, Использование для Info, Введите в Integer, и Формат для Value. Установите описание как: Thie BCI model requires 1024 Samples Per Bit for proper operation. Сохраните изменения.

  • BCI_Training_UI_ST: Этот параметр генерирует только параметр с именем «BCI_Training_U_STI» в файле .ami для частичной податливости спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter... кнопка. Установите имя параметра в BCI_Training_UI_ST, Текущее Значение для 100000, Использование для Info, Введите в Integer, и Формат для Value. Установите описание следующим образом BCI training may require 100,000 UI to complete. NOTE: This model does not currently support the AMI reserved parameter BCI_Training_UI as an input to the model. Сохраните изменения.

Запуск инициализации обновления

Чтобы распространить все новые параметры AMI, запустите Refresh Init на обоих блоках Tx и Rx.

  • Дважды кликните подсистему Init внутри блока Tx и нажмите кнопку Refresh Init.

  • Дважды кликните подсистему Init внутри блока Rx и нажмите кнопку Refresh Init.

Запуск модели

Запустите модель, чтобы симулировать систему SerDes и проверить, что текущая настройка компилируется и запускается без ошибок или предупреждений. Сгенерированы два графика. Первый - это глазковая диаграмма в области времени (GetWave), которая обновляется во время работы модели. Второй график содержит четыре представления статистических результатов (Init), таких как графики, доступные в SerDes Designer App плюс два представления из результатов Временной интервал (GetWave).

Примечание.Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически сгенерированных блоков хранилища данных, которые будут рассмотрены позже.

Предоставленные файлы

Для поддержки обучения в обратном канале требуются три набора внешних файлов. Генерация этих файлов выходит за возможности этого примера, поэтому они включены в этот пример. Загрузите следующие 9 файлов в директорию модели (расположение файла Simulink .slx) перед запуском полной системы SerDes или генерацией исполняемых файлов модели AMI.

Запись в файлы связи для обратного канала

Эти три файла используются, чтобы записать текущее состояние параметров обучения обратного канала и метрики (ов) глаза во внешний файл для связи между моделями Tx и Rx AMI.

  • Файл функции MATLAB: writeBCIfile.m

  • Файлы C++, необходимые для codegen: writeamidata.cpp и writeamidata.h

Чтение из файлов связи с обратным каналом

Эти три файла используются, чтобы считать текущее состояние параметров обучения обратного канала и метрики (ов) глаза из внешнего файла для связи между моделями Tx и Rx AMI.

  • Файл функции MATLAB: readBCIfile.m

  • Файлы C++, необходимые для codegen: readamidata.cpp и readamidata.h

Запись в файлы журнала обратного канала

Эти три файла используются, чтобы записать текущее состояние параметров обучения обратного канала и метрики (ов) глаза после каждого шага обучения в файл журнала для отладки.

  • Файл функции MATLAB: writeBCIhistory.m

  • Файлы C++, необходимые для codegen: writebcihist.cpp и writebcihist.h

Измените Tx FFE, чтобы включить внешнее управление значениями отвода

Чтобы управлять весами Tx FFE из блока Tx_BCI, когда включено обучение по заднему каналу, замените блок FFEParameter.TapWeights Constant на блок DataStoreRead. Этот datastore позволяет изменять значения отвода FFE во время симуляции и передавать их из каждого из блоков datapath.

Внутри подсистемы Tx щелкните на блоке FFE и введите Ctrl-U, чтобы заглянуть под маску блока FFE.

  1. Удалите блок FFETapWeights Constant.

  2. Добавьте блок DataStoreRead, помеченный BCIFFETapWeightsIn.

  3. Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: Tx_BCISignal.

  4. На вкладке Element Selection разверните Tx_BCISignal сигнала и подсветите FFE_Tapm1, FFE_Tap0 и FFE_Tap1.

  5. Нажмите кнопку Select > >, чтобы выбрать эти 3 элемента.

  6. Сохраните изменения.

Добавьте блок Mux и установите количество входов 3, чтобы мультиплексировать эти три параметра в вектор для блока FFE.

Соедините выход блока Mux с входом TapWeights на FFE.

Окончательный блок FFE должен выглядеть следующим образом:

Введите Ctrl-D, чтобы скомпилировать модель и проверить на ошибки. Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически сгенерированных блоков хранилища данных, которые будут рассмотрены позже

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

Для определения качества заданного набора значений эквализации во время обучения в обратном канале будет использоваться напряжение, которое дискретизируется CDR в центре глаза для каждого символа. Это значение захватывается блоком DataStoreWrite так, чтобы его значение было доступно другим блокам управления BCI.

Внутри подсистемы Rx щелкните на блоке DFECDR и введите Ctrl-U, чтобы просмотреть под маской блока Rx DFECDR.

Откройте объект BusSelector

  1. Выделите voltageSample из списка элементов в шине.

  2. Щелкните Выбрать > >, чтобы переместить его в список Выбранных элементов.

  3. Сохраните изменения.

Добавьте блок DataStoreWrite с меткой: CDR sample Voltage

  1. Дважды кликните блок DataStoreWrite и установите имя хранилища данных равным: Rx_BCI_WriteSignal на вкладке Parameters.

  2. На вкладке Element Assignment разверните Rx_BCI_WriteSignal сигнала и подсветите sampleVoltage.

  3. Нажмите кнопку Select > >, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Подключите выход voltageSample BusSelector к входу нового блока DataStoreWrite.

Этот фрагмент блока DFECDR должна выглядеть следующим образом:

Введите Ctrl-D, чтобы скомпилировать модель и проверить на ошибки. Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически сгенерированных блоков хранилища данных, которые будут рассмотрены позже

Измените DFECDR, чтобы переопределить Режим, когда обучение включено

Во время обучения в обратном канале режимы FFE и DFE должны быть установлены на «Fixed». Режим FFE был жестко закодирован на «Fixed». Простая функция MATLAB используется, чтобы позволить вам установить режим DFE, когда обучение не включено.

Внутри подсистемы Rx щелкните на блоке DFECDR и введите Ctrl-U, чтобы просмотреть под маской блока Rx DFECDR.

Удалите соединение между блоком DFECDRMode и DFECDR.

Добавьте новый блок MATLAB function и установите метку равной DFEModeSelect. Этот функциональный блок считывает значения BCI_State_ST и DFE.Mode и принудительно устанавливает режим DFE в 1 (Фиксированный), когда обучение включено или завершено. Скопируйте/Вставьте следующий код в функциональный блок DFEModeSelect MATLAB, заменив содержимое по умолчанию.

function Mode = DFEModeSelect(DFEModeIn, BCI_State_In)

if BCI_State_In == 1  % Training is Off
    Mode = DFEModeIn;
else
    Mode = 1;         % Force DFE Mode to Fixed for all other Training states
end

Добавьте блок DataStoreRead, помеченный Rx_BCI_Write_BCI_State_In, поэтому значение BCI_State_ST может быть подано в блок MATLAB function.

  1. Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: Rx_BCI_WriteSignal.

  2. На вкладке Element Selection разверните Rx_BCI_WriteSignal сигнала и подсветите BCI_State_ST.

  3. Нажмите кнопку Select > >, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Подключите эти новые блоки, как показано на рисунке. Окончательный блок DFECDR должен выглядеть следующим образом:

Введите Ctrl-D, чтобы скомпилировать модель и проверить на ошибки. Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически сгенерированных блоков хранилища данных, которые будут рассмотрены позже

Настройка пользовательского кода Tx Init

Функция Tx Initialize используется, чтобы настроить модель Tx AMI для выполнения обратного обучения во время анализа GetWave. Это создает файлы межканальной связи и журналов, настраивает различные параметры и переопределяет все пользовательские значения ответвлений FFE.

Внутри подсистемы Tx дважды кликните по блоку Init, затем нажмите Show Init, чтобы открыть Initialize Function в MATLAB.

Функция Initialize является автоматически сгенерированной функцией, которая обеспечивает импульсной характеристике обработку системного блока SerDes (IBIS AMI-Init). The %% BEGIN: и % END: линии обозначают раздел, в который можно ввести пользовательский код. Данные в этом разделе не переписываются при запуске Refresh Init:

%% BEGIN: Custom user code area (retained when 'Refresh Init' button is pressed)
Tx_BCIBCI_State_ST = Tx_BCIParameter.BCI_State_ST; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap0 = Tx_BCIParameter.FFE_Tap0; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap1 = Tx_BCIParameter.FFE_Tap1; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tapm1 = Tx_BCIParameter.FFE_Tapm1; % User added AMI parameter from SerDes IBIS-AMI Manager

% END: Custom user code area (retained when 'Refresh Init' button is pressed)

Используйте эту пользовательскую область кода для инициализации параметров обратного канала, записи первой записи в файл связи обратного канала «BCI_comm.csv» и создания файла журнала обратного канала «BCI_comm_log.csv.» Чтобы добавить пользовательские обратные коды системы управления, прокрутите вниз до пользовательской области кода и Скопируйте/Вставьте следующий код:

Tx_BCIBCI_State_ST = Tx_BCIParameter.BCI_State_ST; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap0 = Tx_BCIParameter.FFE_Tap0; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap1 = Tx_BCIParameter.FFE_Tap1; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tapm1 = Tx_BCIParameter.FFE_Tapm1; % User added AMI parameter from SerDes IBIS-AMI Manager

%% Set up for GetWave back-channel operation
if Tx_BCIBCI_State_ST == 2 % Training enabled
    bciWrFile = 'BCI_comm.csv'; %% Tx/Rx back-channel communication file
    Protocol = ['DDR5' 0];      %% Null terminate string to keep fprintf happy in C++
    State = ['Training' 0];     %% Null terminate string to keep fprintf happy in C++
    Sequence = 1;               %% Initialize sequence counter
    EyeHeight = 0.0;            %% Initialize training metric
    % Publish Tx capabilities
    numFFEtaps = 3;
    FFEtaps = [0.0, 1.0, 0.0];
    FFEInit.TapWeights = [0.0, 1.0, 0.0];
    % Initialize Rx capabilities (actual values set by Rx)
    numDFEtaps = 1;
    DFEtaps = 0.0000;
    
    % Create new file for back-channel communication
    writeBCIfile(bciWrFile, 'w', Protocol, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, State, EyeHeight)

    % Create new BCI_ID_log.csv file (for back-channel history)
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Tx', 'Init', 0, Tx_BCIBCI_State_ST, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, EyeHeight)
    
end

Чтобы проверить, что новый пользовательский код работает правильно, сохраните и запустите модель, затем проверьте, что новые файлы связи (BCI_comm.csv) и log (BCI_comm_log.csv) обратного канала были созданы в директории модели и что значения в файлах совпадают со значениями, установленными выше.

Настройка пользовательского кода Rx Init

Функция Rx Initialize используется, чтобы настроить модель Rx AMI для выполнения обратного обучения во время анализа GetWave. Это считывается в файле связи с обратным каналом и затем обновляется файл с помощью информации о строении Rx (количество ответвлений DFE и значений отвода DFE). Он также обновляет файл журнала.

Внутри подсистемы Rx дважды нажатие кнопки по блоку Init, затем нажмите Show Init, чтобы открыть Initialize Function в MATLAB.

Функция Initialize является автоматически сгенерированной функцией, которая обеспечивает импульсной характеристике обработку системного блока SerDes (IBIS AMI-Init). The %% BEGIN: и % END: линии обозначают раздел, в который можно ввести пользовательский код. Данные в этом разделе не переписываются при запуске Refresh Init:

%% BEGIN: Custom user code area (retained when 'Refresh Init' button is pressed)
Rx_BCI_WritesampleVoltage = Rx_BCI_WriteParameter.sampleVoltage; % User added AMI parameter from SerDes IBIS-AMI Manager
Rx_BCI_WriteBCI_State_ST = Rx_BCI_WriteParameter.BCI_State_ST; % User added AMI parameter from SerDes IBIS-AMI Manager

% END: Custom user code area (retained when 'Refresh Init' button is pressed)

Используйте эту пользовательскую область кода, чтобы считать строение из Tx, инициализировать дополнительные параметры обратного канала, требуемые Rx, записать следующую запись в файл связи обратного канала «BCI_comm.csv,» и добавить к файлу журнала обратного канала «BCI_comm_log.csv.» Чтобы добавить пользовательские обратные коды системы управления, прокрутите вниз пользовательскую область кода и Скопируйте/Вставьте следующий код:

Rx_BCI_WritesampleVoltage = Rx_BCI_WriteParameter.sampleVoltage; % User added AMI parameter from SerDes IBIS-AMI Manager
Rx_BCI_WriteBCI_State_ST = Rx_BCI_WriteParameter.BCI_State_ST; % User added AMI parameter from SerDes IBIS-AMI Manager

%% Set up for GetWave back-channel operation
if Rx_BCI_WriteBCI_State_ST == 2 % Training enabled
    %% Read from back-channel communication file to get setup from Tx
    bciRdFile = 'BCI_comm.csv';
    [Protocol, ~, numFFEtaps, ~, FFEtaps, Sequence, State, EyeHeight] = readBCIfile(bciRdFile);

    %% Write Rx setup to back-channel communication file.
    bciWrFile = 'BCI_comm.csv';
    Sequence = Sequence + 1;   %% Initialize sequence counter
    % Publish Rx capabilities
    numDFEtaps = 4;
    DFEtaps = [0.0000, 0.0000, 0.0000, 0.0000];
    
    writeBCIfile(bciWrFile, 'w', Protocol, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, State, EyeHeight)
    
    % Write to log file
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Rx', 'Init', 0, Rx_BCI_WriteBCI_State_ST, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, EyeHeight)
    
    % Force DFE Mode to Fixed when training is enabled.
    DFECDRInit.Mode = 1;
    
end

Чтобы проверить, что новый пользовательский код работает правильно, сохраните и запустите модель, затем проверьте, что файлы связи (BCI_comm.csv) и журнала (BCI_comm_log.csv) заднего канала были созданы и что значения в файлах совпадают со значениями, установленными выше. В файле BCI_comm_log.csv вы увидите, что первый вызов RX был добавлен к файлу журнала (последовательность # 2).

Настройте блок Tx Tx_BCI pass-through

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

Первым шагом является настройка блока Tx_BCI для операции в обратном канале. Блок MATLAB function, который управляет операцией блока Tx_BCI, записан позже в этом примере.

Посмотрите под маску в блоке Tx_BCI. Вы увидите 8 автоматически сгенерированных блоков чтения/записи Datastore.

Удалите системный объект Pass-Through, так как он не используется. Обязательно подключите входной порт к выходному порту.

Добавьте блок Mux и установите количество входов равным 3. Это будет использоваться, чтобы мультиплексировать три сигнала tapWeightsIn DataStoreRead в один вектор.

Добавьте блок Demux и установите количество выходов равным 3. Это будет использоваться, чтобы демультиплексировать вектор tapWeightsOut в три отдельных сигнала DataStoreWrite.

Добавьте новый блок MATLAB function и установите метку равной Counter. Эта функция MATLAB возвращает количество общего количества выборок, обработанных моделью, и полученное количество UI. Откройте этот новый блок MATLAB function, а затем Скопируйте/Вставьте следующий код, заменив содержимое по умолчанию.

function [sampCount, uiCount] = counter(SymbolTime, SampleInterval)

% Calculate Samples Per Bit
sampBit = round(SymbolTime/SampleInterval);

% Set up persistent variables
persistent x y
if isempty(x)
    x = int32(1);
    y = int32(1);
else
    x = x + 1;
end

% Start counting by UI
if mod(x,sampBit) == 0
    y = y + 1;
end

% Output results
sampCount = x;
uiCount   = y;

Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются от Рабочего пространства Модели и, следовательно, не должны отображаться как узлы на блоке MATLAB function. Чтобы удалить эти узлы из блока MATLAB function:

  1. Сохраните функцию MATLAB.

  2. В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.

  3. Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".

  4. Измените возможности данных из Signal на Parameter.

  5. Повторите этот процесс для SampleInterval.

  6. Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.

Тип данных для выходов этой функции, samsungCount и uiCount, по умолчанию имеют значение Inherit. Поскольку этот функциональный блок создает значения для этих двух параметров, их тип данных должен быть явно определен вместо того, чтобы определяться на основе эвристики. Чтобы явным образом определить типы данных для этих двух параметров:

  1. Откройте Simulink Model Explorer и перейдите к разделу Tx- > Tx _ BCI- > Counter.

  2. Подсветите параметр samsungCount.

  3. Обновите тип из Inherit в int32 и нажмите Применить.

  4. Повторите этот процесс для uiCount.

Добавьте другой новый блок MATLAB function и установите метку на txBackChannel. Этот блок MATLAB function используется для управления обратным процессом обучения. Содержимое этой функции будет рассмотрено позже в этом примере. Однако для завершения подключения Tx_BCI блоков необходимо отобразить все правильные узлы. Чтобы включить это:

  1. Дважды кликните Блок MATLAB function txBackChannel, чтобы открыть его в редакторе MATLAB.

  2. Удалите все содержимое по умолчанию.

  3. Вставьте следующую сигнатуру функции:

function [tapWeightsOut, BCIStateOut] = txBCtraining(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)

Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются от Рабочего пространства Модели и, следовательно, не должны отображаться как узлы на блоке MATLAB function. Чтобы удалить эти узлы из блока MATLAB function:

  1. Сохраните функцию MATLAB.

  2. В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.

  3. Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".

  4. Измените возможности данных из Signal на Parameter.

  5. Повторите этот процесс для SampleInterval.

  6. Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.

Соедините все вместе, как показано ниже:

Настройте блок Rx Rx_BCI_Read

Блок Rx_BCI_Read используется, чтобы считать значения параметров Rx, запрошенные блоком Tx_BCI, и задать эти значения для следующего обратного цикла обучения канала. Если Tx_BCI блок сигнализирует, что обучение завершено, этот блок устанавливает окончательные значения, которые будут использоваться для оставшейся части симуляции.

Первым шагом является настройка блока Rx_BCI_Read для операции в обратном канале. Блок MATLAB function, который управляет операцией блока Rx_BCI_Read, записан позже в примере.

Посмотрите под маску в блоке Rx_BCI_Read.

Удалите системный объект Pass-Through, так как он не будет использоваться. Обязательно подключите входной порт к выходному порту.

Добавьте блок DataStoreRead, помеченный DFECDRTapWeightsIn

  1. Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: DFECDRSignal.

  2. На вкладке Element Selection разверните сигнал DFECDRSignal и подсветите TapWeights [1,4].

  3. Нажмите кнопку Select > >, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте блок DataStoreRead, помеченный RxBCIStateIn

  1. Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: Rx_BCI_WriteSignal.

  2. На вкладке Element Selection разверните Rx_BCI_WriteSignal сигнала и подсветите BCI_State_ST.

  3. Нажмите кнопку Select > >, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте блок DataStoreWrite, помеченный RxBCIStateOut

  1. Дважды кликните блок DataStoreWrite и установите имя хранилища данных равным: Rx_BCI_WriteSignal.

  2. На вкладке Element Assignment разверните Rx_BCI_WriteSignal сигнала и подсветите BCI_State_ST.

  3. Нажмите кнопку Select > >, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте блок DataStoreWrite, помеченный DFECDRTapWeightsOut

  1. Дважды кликните блок DataStoreWrite и установите имя хранилища данных равным: DFECDRSignal.

  2. На вкладке Element Assignment разверните сигнал DFECDRSignal и подсветите TapWeights [1,4].

  3. Нажмите кнопку Select > >, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Скопируйте функциональный блок Counter MATLAB из блока Tx Tx_BCI в этот блок.

Добавьте новый блок MATLAB function и установите метку равной rxBackChannelRead. Этот блок MATLAB function используется для управления обратным процессом обучения. Содержимое этой функции будет рассмотрено позже в этом примере. Однако для завершения подключения Rx_BCI_Read блоков необходимо отобразить все правильные узлы. Чтобы включить это:

  1. Дважды кликните Блок MATLAB function rxBackChannelRead, чтобы открыть его в редакторе MATLAB.

  2. Удалите все содержимое по умолчанию.

  3. Вставьте следующую сигнатуру функции:

function [BCIStateOut, tapWeightsOut] = rxBCtrainingRead(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)

Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются от Рабочего пространства Модели и, следовательно, не должны отображаться как узлы на блоке MATLAB function. Чтобы удалить эти узлы из блока MATLAB function:

  1. Сохраните функцию MATLAB.

  2. В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.

  3. Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".

  4. Измените возможности данных из Signal на Parameter.

  5. Повторите этот процесс для SampleInterval.

  6. Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.

Соедините все вместе, как показано ниже:

Настройте блок Rx Rx_BCI_Write

Блок Rx_BCI_Write используется в конце каждого цикла обучения обратного канала, чтобы вычислить текущие метрики глаза и сообщить эти метрики обратно в блок Tx_BCI для анализа.

Первым шагом является настройка блока Rx_BCI_Write для операции в обратном канале. Блок MATLAB function, который управляет операцией блока Rx_BCI_Write, записан позже в примере.

Посмотрите под маску в блоке Rx_BCI_Write. Вы должны 4 автоматически сгенерировать блоки чтения/записи Datastore.

Удалите системный объект Pass-Through, так как он не используется. Обязательно подключите входной порт к выходному порту.

Удалите маркированный блок DataStoreWrite sampleVoltage напишите. Он не будет использоваться.

Добавьте блок DataStoreRead, помеченный DFECDRTapWeightsIn.

  1. Дважды кликните блок DataStoreRead и установите имя хранилища данных равным DFECDRSignal.

  2. На вкладке Element Selection разверните сигнал DFECDRSignal и подсветите TapWeights [1,4].

  3. Нажмите кнопку Select > >, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Скопируйте функциональный блок Counter MATLAB из блока Tx Tx_BCI в этот блок.

Добавьте новый блок MATLAB function и установите метку равной rxBackChannelWrite. Этот блок MATLAB function используется для управления обратным процессом обучения. Содержимое этой функции будет рассмотрено позже в этом примере. Однако для завершения подключения Rx_BCI_Write блоков необходимо отобразить все правильные узлы. Чтобы включить это:

  1. Дважды кликните Блок MATLAB function rxBackChannelWrite, чтобы открыть его в редакторе MATLAB.

  2. Удалите все содержимое по умолчанию.

  3. Вставьте следующую сигнатуру функции:

function BCIStateOut = rxBCtrainingWrite(sampleV, tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)

Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются от Рабочего пространства Модели и, следовательно, не должны отображаться как узлы на блоке MATLAB function. Чтобы удалить эти узлы из блока MATLAB function:

  1. Сохраните функцию MATLAB.

  2. В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.

  3. Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".

  4. Измените возможности данных из Signal на Parameter.

  5. Повторите этот процесс для SampleInterval.

  6. Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.

Соедините все вместе, как показано ниже:

Отредактируйте txBCtraining Блока MATLAB function

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

Блок Tx_BCI был настроен для операции в обратном канале ранее в этом примере. Теперь вы создадите блок MATLAB function в основе блока Tx_BCI. Этот блок MATLAB function, который был помечен txBackChannel, управляет всем процессом обучения в обратном канале. В этом процессе участвуют следующие шаги:

  1. Определите сигнатуру функции

  2. Инициализируйте параметры и установите постоянные переменные

  3. Определите параметры, которые будут протянуты, и их области значений

  4. При первом вызове GetWave настройте начальные значения параметров для Tx и Rx

  5. Каждый цикл обучения в обратном канале считывает метрики глаза, вычисленные Rx, и решает, что делать дальше. Когда обучение завершает сигнал завершения обучения, выводите оптимальные значения параметров Tx и Rx, которые будут использоваться во время симуляции, и записывайте эти окончательные значения в файл журнала.

  6. Установите соответствующее состояние обучения и выведите параметры FFE, которые будут использоваться

В следующих разделах рассматривается код, используемый в Блок MATLAB function txBackChannel. В блоке Tx щелкните по Tx_BCI блоку pass-through и введите Ctrl-U, чтобы затолкнуть в Tx_BCI блок pass-through, установленный ранее. Дважды кликните на Блок MATLAB function txBackChannel, затем Скопируйте/Вставьте код, описанный в следующих разделах.

Определите сигнатуру функции

Сигнатура функции для блока txBCtraining имеет 6 входов и 2 выхода. Входные входы:

  • tapWeightsIn: массив весов касаний FFE, заданный в маске FFE.

  • BCIS tate In: Значение состояния обратного канала из хранилища данных Tx BCIS tate In.

  • sampleCounter: Общее количество выборок.

  • uiCounter: счетчик общего количества UI.

  • SymbolTime: пользовательский интерфейс (в секундах). Это значение унаследовано от Рабочего пространства Модели и, следовательно, не должно отображаться как узел в блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, возможности была ранее устанавливаемы на «Parameter».

  • SampleInterval: Размер шага симуляции (в секундах). Это значение унаследовано от Рабочего пространства Модели и, следовательно, не должно отображаться как узел в блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, возможности была ранее устанавливаемы на «Parameter».

Существует два выхода:

  • tapWeightsOut: массив отводов FFE выводится в хранилище данных BCIFFETapWeightsOut.

  • BCIStateOut: значение состояния обратного канала, выводимое в хранилище данных TxBCIStateOut.

Сигнатура функции была добавлена ранее при первоначальном создании блока MATLAB function, и так уже присутствует.

Инициализируйте параметры и переменные

В этом разделе настраиваются три константы, необходимые для вычисления размера цикла обучения за задним каналом:

  • samppBit: Количество выборок в каждом пользовательском интерфейсе.

  • messageInterval: длина (в пользовательском интерфейсе) каждого обратного цикла обучения. В настоящее время это значение установлено на ~ 2 PRBS7 итерации.

  • BCIwait: время задержки (в пользовательском интерфейсе) перед началом обучения в обратном канале. В настоящее время это значение установлено на ~ 4 PRBS7 итерации.

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

  • Протокол: Протокол, используемый этой модели обратного канала.

  • numDFEtaps: Количество ответвлений DFE, включаемых в этот обратный алгоритм настройки.

  • numFFEtaps: Число ответвлений FFE, включаемых в этот обратный алгоритм настройки.

  • DFEtaps: текущие значения отвода DFE.

  • FFEtaps: текущие значения отвода FFE.

  • Последовательность: Целочисленный счетчик, используемый для регистрации последовательности событий обучения.

  • Состояние: Текущее состояние обучения в обратном канале.

  • EyeHeight: Текущая высота глаза (в вольтах), сообщаемая Rx.

  • Шаг: Текущий выполняемый шаг обучающей последовательности.

  • indx: Индексная переменная для циклов управления.

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

Чтобы инициализировать эти параметры и переменные, Скопируйте/Вставьте следующий код в Блок MATLAB function txBackChannel:

%% Setup
sampBit = round(SymbolTime/SampleInterval);  %% Calculate Samples Per Bit
messageInterval = 256;                       %% Length (in UI) of back-channel training cycle iteration (~2 PRBS7 iterations)
BCIwait = 512;                               %% Delay time (in UI) before starting training(~4 PRBS7 iterations)

%% Read BCI file to determine training values
% Make variables available between time steps
persistent Protocol numDFEtaps numFFEtaps DFEtaps FFEtaps Sequence State EyeHeight step indx metric

% Initialize variable initial conditions
if isempty(Protocol)
    Protocol = 'Defaults';
end
if isempty(numDFEtaps)
    numDFEtaps = 4;
end
if isempty(numFFEtaps)
    numFFEtaps = 3;
end
if isempty(DFEtaps)
    DFEtaps = [0.000,0.000,0.000,0.000];
end
if isempty(FFEtaps)
    FFEtaps = [0.000,1.000,0.000];
end
if isempty(Sequence)
    Sequence = 1;
end
if isempty(State)
    State = 'Testing';
end
if isempty(EyeHeight)
    EyeHeight = 0.000;
end
if isempty(step)
    step = 1;
end
if isempty(indx)
    indx = 1;
end
if isempty(metric)
    metric = zeros(50,1);
end

Задайте параметры сдвига

Алгоритм настройки, реализованный в этом примере, выводит значения до и после FFE и все 4 контакта DFE по отдельности, затем выбирает оптимальное значение для каждого контакта. Восемь параметров используются, чтобы задать области значений для каждого из отводов и размер шага, который будет использоваться во время обучения:

  • ffeTapStep: размер шага, который будет использоваться при сдвиге ответвлений FFE. Это значение отрицательно, так как значения отвода FFE всегда < = 0.

  • dfeTapStep: размер шага, который будет использоваться при сдвиге отводов DFE.

  • regFFEtapm1: минимальная / максимальная область значений значений, которые будут использоваться при протаскивании предтекста FFE.

  • regFFEtap1: минимальная / максимальная область значений значений, которые будут использоваться при протаскивании FFE после тапа.

  • regDFEtap1: Область значений min/max значений, которые будут использоваться при протаскивании первого касания DFE.

  • regDFEtap2: Область значений min/max значений, которые будут использоваться при протаскивании второго контакта DFE.

  • regDFEtap3: Область значений min/max значений, которые будут использоваться при протаскивании третьего касания DFE.

  • regDFEtap4: Область значений min/max значений, которые будут использоваться при протаскивании четвертого касания DFE.

Чтобы определить все параметры, которые будут отображаться во время обучения, Скопируйте/Вставьте следующий код в Блок MATLAB function txBackChannel:

% Define parameter step sizes
ffeTapStep = -0.050;
dfeTapStep = 0.010;

% Map ranges to register values
regFFEtapm1 = ( 0.000:ffeTapStep:-0.300);
regFFEtap1  = ( 0.000:ffeTapStep:-0.300);
regDFEtap1  = (-0.200:dfeTapStep: 0.050);
regDFEtap2  = (-0.075:dfeTapStep: 0.075);
regDFEtap3  = (-0.060:dfeTapStep: 0.060);
regDFEtap4  = (-0.045:dfeTapStep: 0.045);

Первый вызов GetWave

Когда обучение включено, самый первый вызов этой функции MATLAB должен считать файл связи обратного канала, записанный во время Init, чтобы определить полные возможности моделей Tx и Rx. Этот раздел также устанавливает начальные значения, которые будут использоваться для первого обратного цикла обучения. Наконец, все эти значения записываются в файл журнала межканальной связи.

Чтобы реализовать первый вызов GetWave, Скопируйте/Вставьте следующий код в Блок MATLAB function txBackChannel:

%% First Tx GetWave Call (Sequence=3)
if sampleCounter == 1 && BCIStateIn == 2 % Training enabled
    % Read back-channel communication file to get current settings
    bciRdFile = 'BCI_comm.csv';
    [~, numDFEtaps, numFFEtaps, ~, ~, Sequence, ~, EyeHeight] = readBCIfile(bciRdFile);

    % Decide what to do first
    % Tx Params
    FFEtaps = [0.000,1.000,0.000];
    % Rx Params
    DFEtaps = [0.0000, 0.0000, 0.0000, 0.0000];
    
    % Write back-channel communication file with first pass settings for Rx
    bciWrFile = 'BCI_comm.csv';
    Protocol = ['DDR5' 0];   %% Null terminate string to keep fprintf happy in C++
    State = ['Training' 0];  %% Null terminate string to keep fprintf happy in C++
    Sequence = Sequence + 1;
    writeBCIfile(bciWrFile, 'w', Protocol, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, State, EyeHeight)
    
    % Write to log file
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Tx', 'GetW', sampleCounter, BCIStateIn, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, EyeHeight)
end

Обратный алгоритм настройки

Когда обучение включено, после ожидания количества UI, заданного константой BCIwait, алгоритм настройки заднего канала вызывается каждым обучающим блоком, заданным константой messageInterval. Сначала считываются текущие метрики, сообщенные Rx, затем эти результаты записываются в файл журнала связи с обратным каналом. В алгоритм настройки используются следующие шаги:

  1. Протяните все значения предтекста FFE и определите, какое значение приводит к наибольшему открытию глаза.

  2. Протяните все значения FFE после тапа и определите, какое значение приводит к наибольшему открытию глаза.

  3. Протяните все значения отвода 1 DFE и определите, какое значение приводит к наибольшему открытию глаза.

  4. Протяните все значения DFE tap 2 и определите, какое значение приводит к наибольшему открытию глаза.

  5. Протяните все значения отвода DFE 3 и определите, какое значение приводит к наибольшему открытию глаза.

  6. Протяните все значения DFE tap 4 и определите, какое значение приводит к наибольшему открытию глаза.

  7. Когда обучение будет завершено, смените состояние на «Converged» и запишите окончательные значения в файл журнала связи для обратного канала.

Для реализации обратного алгоритма настройки Скопируйте/Вставьте следующий код в Блок MATLAB function txBackChannel:

%% Each subsequent BCI Block (Sequence=5,7,9,11...)
if  uiCounter > BCIwait + 2 && mod(sampleCounter - 1, (messageInterval * sampBit)) == 0 && BCIStateIn == 2 % Training enabled
    % Read setup used for previous 16 GetWaveblocks from back-channel communication file
    bciRdFile = 'BCI_comm.csv';
    [~, ~, ~, ~, ~, Sequence, ~, EyeHeight] = readBCIfile(bciRdFile);
    
    % Write current results to log file
    Sequence = Sequence + 1;
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Tx', 'GetW', sampleCounter, BCIStateIn, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, EyeHeight)
    if indx ~= 1
        % Store current metrics
        metric(indx - 1) = EyeHeight;
    end
    
    % Decide what to do next
    switch step
        case 1  % Step 1: Determine best value for FFE tap -1
            State = ['Training' 0];  %% Null terminate string to keep fprintf happy in C++
            if indx <= length(regFFEtapm1)
                % Set values for next iteration
                FFEtaps(1) = regFFEtapm1(indx);
                FFEtaps(3) = 0.0;
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));
                indx = indx + 1;
            elseif indx == length(regFFEtapm1) + 1
                % Set best metric
                [~, jj] = max(metric);
                FFEtaps(1) = regFFEtapm1(jj);
                FFEtaps(3) = 0.0;
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));

                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 2  % Step 2: Determine best value for FFE tap 1
            State = ['Training' 0];
            if indx <= length(regFFEtap1)
                % Set values for next iteration
                %FFEtaps(1) = 0.0;   %% Use value from step 1
                FFEtaps(3) = regFFEtap1(indx);
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));
                indx = indx + 1;
            elseif indx == length(regFFEtap1) + 1
                % Set best metric
                [~, jj] = max(metric);
                FFEtaps(3) = regFFEtap1(jj);
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));

                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 3  % Step 3: Determine best value for DFE tap 1
            State = ['Training' 0];
            if indx <= length(regDFEtap1)
                % Set values for next iteration
                DFEtaps = [regDFEtap1(indx), 0.0000, 0.0000, 0.0000];
                indx = indx + 1;
            elseif indx == length(regDFEtap1) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps = [regDFEtap1(jj), 0.0000, 0.0000, 0.0000];
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 4  % Step 4: Determine best value for DFE tap 2
            State = ['Training' 0];
            if indx <= length(regDFEtap2)
                % Set values for next iteration
                DFEtaps(2:4) = [regDFEtap2(indx), 0.0000, 0.0000];
                indx = indx + 1;
            elseif indx == length(regDFEtap2) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps(2:4) = [regDFEtap2(jj), 0.0000, 0.0000];
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 5  % Step 5: Determine best value for DFE tap 3
            State = ['Training' 0];
            if indx <= length(regDFEtap3)
                % Set values for next iteration
                DFEtaps(3:4) = [regDFEtap3(indx), 0.0000];
                indx = indx + 1;
            elseif indx == length(regDFEtap3) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps(3:4) = [regDFEtap3(jj), 0.0000];
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 6  % Step 6: Determine best value for DFE tap 4
            State = ['Training' 0];
            if indx <= length(regDFEtap4)
                % Set values for next iteration
                DFEtaps(4) = regDFEtap4(indx);
                indx = indx + 1;
            elseif indx == length(regDFEtap4) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps(4) = regDFEtap4(jj);
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 7  % Step 7: Training is complete
            State = ['Converged' 0];
            % Write final entry in log file
            logFileName = 'BCI_comm_log.csv';
            Sequence = Sequence + 1;
            writeBCIhistory(logFileName, 'Tx', 'GetW', sampleCounter, 3, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, EyeHeight)
        otherwise
            State = ['Error' 0];
    end
    
    % Write to back-channel communication file with next pass settings for Rx
    bciWrFile = 'BCI_comm.csv';
    Protocol = ['DDR5' 0];   %% Null terminate string to keep fprintf happy in C++
    writeBCIfile(bciWrFile, 'w', Protocol, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, State, EyeHeight)

end

Установите состояние обучения и значения выходных параметров

Последнее, что необходимо сделать с помощью этой функции MATLAB, это обновить состояние для BCI_State_ST Data Store и обновить значения массива касаний FFE.

Чтобы задать состояние обучения и выходные значения, Скопируйте/Вставьте следующий код в Блок MATLAB function txBackChannel:

%% Set back-channel state
if strcmpi(State,'Off') || strcmpi(State,['Off' 0])
    BCIStateOut = 1;
elseif strcmpi(State,'Training') || strcmpi(State,['Training' 0])
    BCIStateOut = 2;
elseif strcmpi(State,'Converged') || strcmpi(State,['Converged' 0])
    BCIStateOut = 3;
elseif strcmpi(State,'Failed') || strcmpi(State,['Failed' 0])
    BCIStateOut = 4;
else %Error
    BCIStateOut = 5;
end

%% Set output FFE values based on Training
if BCIStateOut == 2 || BCIStateOut == 3 % Training enabled/Converged
    tapWeightsOut = FFEtaps(:);
else  % Training Off/Failed/Error
    tapWeightsOut = tapWeightsIn;
end

Сохраните и закройте этот блок MATLAB function.

Отредактируйте Блок MATLAB function rxBCtrainingRead

Блок Rx_BCI_Read используется, чтобы считать значения параметров Rx, запрошенные блоком Tx_BCI, и задать их для следующего обратного цикла обучения. Если Tx_BCI блок сигнализирует, что обучение завершено, этот блок устанавливает окончательные значения, которые будут использоваться Rx для оставшейся части симуляции.

Блок Rx_BCI_Read был настроен для операции в обратном канале ранее в этом примере. Теперь создайте блок MATLAB function в центре блока Rx_BCI_Read. Этот блок MATLAB function, который был помечен rxBCtrainingRead, устанавливает значения Rx DFE, которые будут использоваться. В этом процессе участвуют следующие шаги:

  1. Определите сигнатуру функции.

  2. Инициализируйте параметры и установите постоянные переменные.

  3. При первом вызове GetWave и в начале каждого обратного цикла обучения считывайте значения отвода Rx DFE, которые используются, как задано алгоритмом настройки обратного канала Tx.

  4. Установите соответствующее состояние обучения и выведите параметры DFE, которые будут использоваться.

В следующих разделах рассматривается код, используемый в Блок MATLAB function rxBCtrainingRead. В блоке Rx щелкните по Rx_BCI_Read проходному блоку и введите Ctrl-U, чтобы войти в Rx_BCI_Read проходной блок, установленный ранее. Дважды кликните Блок MATLAB function rxBCtrainingRead, затем Скопируйте/Вставьте код, описанный в следующих разделах.

Определите сигнатуру функции

Сигнатура функции для блока rxBCtrainingRead имеет 6 входов и 2 выхода. Входные входы:

  • tap Weights In: массив весов касаний DFE, заданный в хранилище данных DFECDRT ap Weights In.

  • BCIS tate In: Значение состояния обратного канала из хранилища данных Rx BCIS tate In.

  • sampleCounter: Общее количество выборок.

  • uiCounter: счетчик общего количества UI.

  • SymbolTime: пользовательский интерфейс (в секундах). Это значение унаследовано от Рабочего пространства Модели и, следовательно, не должно отображаться как узел в блоке MATLAB function. Чтобы удалить этот узел из Блоков MATLAB function, для Возможностей данных задано значение «Параметра».

  • SampleInterval: Размер шага симуляции (в секундах). Это значение унаследовано от Рабочего пространства Модели и, следовательно, не должно отображаться как узел в блоке MATLAB function. Чтобы удалить этот узел из Блоков MATLAB function, для Возможностей данных задано значение «Параметра».

Существует два выхода:

  • tapWeightsOut: DFE отводит вес массива в выход данных DFECDRTapWeightsOut.

  • BCIStateOut: значение состояния обратного канала, выводимое в хранилище данных RxBCIStateOut.

Сигнатура функции была введена ранее при первоначальном создании блока MATLAB function, и так уже присутствует.

Инициализируйте параметры и переменные

В этом разделе настраиваются три константы, необходимые для вычисления размера цикла обучения за задним каналом:

  • samppBit: Количество выборок в каждом пользовательском интерфейсе.

  • messageInterval: длина (в пользовательском интерфейсе) каждого обратного цикла обучения. В настоящее время это значение установлено на ~ 2 PRBS7 итерации.

  • BCIwait: время задержки (в пользовательском интерфейсе) перед началом обучения в обратном канале. В настоящее время это значение установлено на ~ 4 PRBS7 итерации.

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

  • Протокол: Протокол, используемый этой модели обратного канала.

  • numDFEtaps: Количество ответвлений DFE, включаемых в этот обратный алгоритм настройки.

  • numFFEtaps: Число ответвлений FFE, включаемых в этот обратный алгоритм настройки.

  • DFEtaps: текущие значения отвода DFE.

  • FFEtaps: текущие значения отвода FFE.

  • Последовательность: Целочисленный счетчик, используемый для регистрации последовательности событий обучения.

  • Состояние: Текущее состояние обучения в обратном канале.

Чтобы инициализировать параметры и переменные, Скопируйте/Вставьте следующий код в Блок MATLAB function rxBCtrainingRead:

%% Setup
sampBit = round(SymbolTime/SampleInterval);  %% Calculate Samples Per Bit
messageInterval = 256;                       %% Length (in UI) of back-channel training cycle iteration (~2 PRBS7 iterations)
BCIwait = 512;                               %% Delay time (in UI) before starting training(~4 PRBS7 iterations)

% Make variables available between time steps
persistent Protocol numDFEtaps numFFEtaps DFEtaps FFEtaps Sequence State;

% Initialize variable initial conditions
if isempty(Protocol)
    Protocol = 'Defaults';
end
if isempty(numDFEtaps)
    numDFEtaps = 4;
end
if isempty(numFFEtaps)
    numFFEtaps = 3;
end
if isempty(DFEtaps)
    DFEtaps = tapWeightsIn;
end
if isempty(FFEtaps)
    FFEtaps = [0,0,0];
end
if isempty(Sequence)
    Sequence = 1;
end
if isempty(State)
    if BCIStateIn == 1     % Off
        State = ['Off' 0];
    elseif BCIStateIn == 2 % Training
        State = ['Training' 0];
    elseif BCIStateIn == 3 % Converged
        State = ['Converged' 0];
    elseif BCIStateIn == 4 % Failed
        State = ['Failed' 0];
    else  % Error
        State = ['Error' 0];
    end
end

Считайте значения отвода DFE, которые будут использоваться

Когда обучение включено, при самом первом вызове этой функции MATLAB и в начале каждого блока обучения, как определено константой messageInterval, считывают файл связи обратного канала, чтобы определить обновленные значения отвода DFE, которые будут использоваться для следующего цикла обучения.

Чтобы настроить используемые значения DFE, Скопируйте/Вставьте следующий код в Блок MATLAB function rxBCtrainingRead:

%% First GetWave block of each BCI Block (Sequence=3,5,7,9,11,...)
% Read back-channel communication file to get current settings
if  (sampleCounter == 1 && BCIStateIn == 2) || ((uiCounter > BCIwait + 2 && mod(sampleCounter - 1, (messageInterval * sampBit)) == 0) && BCIStateIn == 2) % Training enabled
    bciRdFile = 'BCI_comm.csv';
    [Protocol, numDFEtaps, numFFEtaps, DFEtaps(1,1:4), FFEtaps, Sequence, State, ~] = readBCIfile(bciRdFile);
    
end

Установите состояние обучения и значения выходных параметров

Последнее, что должно быть сделано этим блоком MATLAB function, это обновить состояние для BCI_State_ST Data Store и обновить значения массива касаний DFE.

Чтобы задать состояние и выходные значения, Скопируйте/Вставьте следующий код в Блок MATLAB function rxBCtrainingRead:

%% Set back-channel state
if strcmpi(State,'Off') || strcmpi(State,['Off' 0])
    BCIStateOut = 1;
elseif strcmpi(State,'Training') || strcmpi(State,['Training' 0])
    BCIStateOut = 2;
elseif strcmpi(State,'Converged') || strcmpi(State,['Converged' 0])
    BCIStateOut = 3;
elseif strcmpi(State,'Failed') || strcmpi(State,['Failed' 0])
    BCIStateOut = 4;
else %Error
    BCIStateOut = 5;
end

%% Set output DFE values based on Training
if BCIStateOut == 2 % Training enabled
    tapWeightsOut = DFEtaps(1,1:4);
else
    tapWeightsOut = tapWeightsIn;
end

Сохраните и закройте этот блок MATLAB function.

Отредактируйте Блок MATLAB function rxBCtrainingWrite

Блок Rx_BCI_Write используется в конце каждого цикла обучения обратного канала, чтобы вычислить текущие метрики глаза и сообщить эти метрики обратно в блок Tx_BCI для анализа.

Блок Rx_BCI_Write был настроен для операции в обратном канале ранее в этом примере. Теперь будет создан блок MATLAB function в центре блока Rx_BCI_Write. Этот блок MATLAB function, который мы пометили rxBCtrainingWrite, вычисляет минимальную высоту глаз последних 127 бит и запишет эти значения в файл связи обратного канала и файл журнала. В этом процессе участвуют следующие шаги:

  1. Определите сигнатуру функции.

  2. Инициализируйте параметры и установите постоянные переменные.

  3. Сохраните вектор напряжений, которые будут использоваться при вычислении минимальной высоты глаза.

  4. В конце каждого цикла обучения обратного канала вычислите минимальную высоту глаза и запишите ее в файл связи обратного канала.

  5. Обновите состояние обучения.

В следующих разделах рассматривается код, используемый в Блок MATLAB function rxBCtrainingWrite. В блоке Rx щелкните по Rx_BCI_Write проходному блоку и введите Ctrl-U, чтобы войти в Rx_BCI_Write проходной блок, установленный ранее. Дважды кликните на Блок MATLAB function rxBCtrainingWrite, затем Скопируйте/Вставьте код, описанный в следующих разделах.

Определите сигнатуру функции

Сигнатура функции для блока rxBCtrainingWrite имеет 7 входов и 1 выход. Входные входы:

  • sampleV: Напряжение во шаге расчета CDR.

  • tap Weights In: массив весов касаний DFE, заданный в хранилище данных DFECDRT ap Weights In.

  • BCIS tate In: Значение состояния обратного канала из хранилища данных Rx BCIS tate In.

  • sampleCounter: Общее количество выборок.

  • uiCounter: счетчик общего количества UI.

  • SymbolTime: пользовательский интерфейс (в секундах). Это значение унаследовано от Рабочего пространства Модели и, следовательно, не должно отображаться как узел в блоке MATLAB function. Чтобы удалить этот узел из Блоков MATLAB function, для Возможностей данных задано значение «Параметра».

  • SampleInterval: Размер шага симуляции (в секундах). Это значение унаследовано от Рабочего пространства Модели и, следовательно, не должно отображаться как узел в блоке MATLAB function. Чтобы удалить этот узел из Блоков MATLAB function, для Возможностей данных задано значение «Параметра».

Существует один выход:

  • BCIStateOut: значение состояния обратного канала, выводимое в хранилище данных RxBCIStateOut.

Сигнатура функции была введена ранее при первоначальном создании блока MATLAB function, и так уже присутствует.

Инициализируйте параметры и переменные

В этом разделе настраиваются четыре константы, необходимые для вычисления размера обратного цикла обучения:

  • samppBit: Количество выборок в каждом пользовательском интерфейсе.

  • messageInterval: длина (в пользовательском интерфейсе) каждого обратного цикла обучения. В настоящее время это значение установлено на ~ 2 PRBS7 итерации.

  • BCIwait: время задержки (в пользовательском интерфейсе) перед началом обучения в обратном канале. В настоящее время это значение установлено на ~ 4 PRBS7 итерации.

  • windowLength: длина окна (в пользовательском интерфейсе), используемая для вычисления минимальной высоты глаза. В настоящее время это значение установлено на 1 PRBS7 итерации.

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

  • Протокол: Протокол, используемый этой модели обратного канала.

  • Последовательность: Целочисленный счетчик, используемый для регистрации последовательности событий обучения.

  • Состояние: Текущее состояние обучения в обратном канале.

  • EyeHeight: вычисленное значение высоты внутреннего глаза (в вольтах).

  • vSamp: Напряжение выборки, сообщаемое блоком CDR.

Чтобы инициализировать все параметры и переменные для этого блока, Скопируйте/Вставьте следующий код в Блок MATLAB function rxBCtrainingWrite:

%% Setup
sampBit = round(SymbolTime/SampleInterval);  %% Calculate Samples Per Bit
messageInterval = 256;                       %% Length (in UI) of back-channel training cycle iteration (~2 PRBS7 iterations)
BCIwait = 512;                               %% Delay time (in UI) before starting training(~4 PRBS7 iterations)
windowLength = 127;                          %% Length of window (in UI) used to calculate minimum eye height (1 PRBS7 iteration)

% Make variables available between time steps
persistent Protocol Sequence State EyeHeight vSamp

if isempty(State)
    if BCIStateIn == 1     % Off
        State = ['Off' 0];
    elseif BCIStateIn == 2 % Training
        State = ['Training' 0];
    elseif BCIStateIn == 3 % Converged
        State = ['Converged' 0];
    elseif BCIStateIn == 4 % Failed
        State = ['Failed' 0];
    else  % Error
        State = ['Error' 0];
    end
end

Сохраните вектор сообщаемых напряжений

В этом разделе накапливается вектор качения напряжений, который используется в вычислении минимальной высоты глаза. Предположим, что эти напряжения симметричны вокруг 0V, поэтому используется абсолютное значение.

Чтобы сохранить значения напряжения глаза отчета, Скопируйте/Вставьте следующий код в Блок MATLAB function rxBCtrainingWrite:

% Accumulate rolling vector of voltages for minimum eye height calculations
if isempty(vSamp)
    vSamp = zeros(1, windowLength * sampBit);
end
vSamp = circshift(vSamp, 1);
vSamp(1) = abs(sampleV);      % Assume symmetry and only use positive values

Вычислите минимальную высоту глаза и запись в файл

Когда обучение включено, после ожидания количества UI, заданного константой BCIwait, метрики обратного канала вычисляются в конце каждой итерации обучения, как определено константой messageInterval. Сначала строение обратного канала считывают из файла связи обратного канала, затем вычисляют значение высоты внутреннего глаза и результаты выводят в файл связи обратного канала и файл журнала.

Чтобы вычислить метрики глаза и записать в файл связи каждый цикл обратного канала, Скопируйте/Вставьте следующий код в Блок MATLAB function rxBCtrainingWrite:

%% Write current state and eye metrics at the end of each BCI block
if  uiCounter > BCIwait + 2 && mod(sampleCounter, (messageInterval * sampBit)) == 0 && BCIStateIn == 2 % Training enabled  (Sequence=4,6,8,10,12,...)

    % Read setup used for last 16 GetWaveblocks from back-channel communication file
    bciRdFile = 'BCI_comm.csv';
    [Protocol, ~, ~, ~, FFEtaps, Sequence, State, ~] = readBCIfile(bciRdFile);

    % Calculate inner eye height from sampled voltage:
    EyeHeight = min(vSamp) * 2;    % 2x since using absolute value.
    
    % Write new back-channel communication file with end of BCI-Block metrics
    bciWrFile = 'BCI_comm.csv';
    Sequence = Sequence + 1;
    writeBCIfile(bciWrFile, 'w', Protocol, numel(tapWeightsIn), numel(FFEtaps), tapWeightsIn, FFEtaps, Sequence, State, EyeHeight)
    %
    % Write to log file:
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Rx', 'GetW', sampleCounter, BCIStateIn, numel(tapWeightsIn), numel(FFEtaps), tapWeightsIn, FFEtaps, Sequence, EyeHeight)

end

Установите состояние обучения

Последнее, что нужно сделать в этом блоке MATLAB function, это обновить состояние для BCI_State_ST Data Store.

Чтобы задать состояние обучения, Скопируйте/Вставьте следующий код в Блок MATLAB function rxBCtrainingRead:

%% Update State Out if State In changed
if BCIStateIn == 3     % Converged
    State = ['Converged' 0];
elseif BCIStateIn == 4 % Failed
    State = ['Failed' 0];
end

if strcmpi(State,'Off') || strcmpi(State,['Off' 0])
    BCIStateOut = 1;
elseif strcmpi(State,'Training') || strcmpi(State,['Training' 0])
    BCIStateOut = 2;
elseif strcmpi(State,'Converged') || strcmpi(State,['Converged' 0])
    BCIStateOut = 3;
elseif strcmpi(State,'Failed') || strcmpi(State,['Failed' 0])
    BCIStateOut = 4;
else %Error
    BCIStateOut = 5;
end

Сохраните и закройте этот блок MATLAB function.

В Simulink введите Ctrl-D, чтобы скомпилировать модель и проверить на ошибки. Устраните все ошибки перед продолжением.

Запустите Модель и Проверьте результаты

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

Настройте параметры симуляции

Прежде чем запускать полную модель, откройте блок Stimulus, чтобы задать шаблон стимула, используемый для тестирования модели:

  • Установите PRBS на 7, так что шаблон PRBS7 будет использоваться во время симуляции.

  • Установите количество символов в 50000 чтобы позволить обратному алгоритму настройки завершить время.

Проверьте правильность операции моделей Tx и Rx

Запустите модель. Во время работы модели наблюдайте изменение формы волны во временном интервале, когда каждая из настроек касания протянута. Когда симуляция завершена, файл связи с обратным каналом, BCI_comm.csv, должен выглядеть примерно так:

Protocol,DDR5,
numDFEtaps,4,
numFFEtaps,3,
DFEtaps,0.01000,-0.00500,-0.01000,-0.00500,
FFEtaps,0.00000,0.85000,-0.15000,
Sequence,176,
State,Converged,
EyeHeight,0.610993,

Откройте файл журнала межканальной связи, BCI_comm_log.csv, в редакторе электронных таблиц. Каждая строка в файле журнала показывает номер последовательности, которая модель записала в файл (Tx или Rx), текущее Количество выборок, BCI_State и вычисленную Высоту глаз. В последних 7 столбцах журнала показаны текущие моделируемые значения ответвлений FFE и DFE. Наблюдайте, как изменяется Высота глаза, когда каждое значение сдвигается, и значение параметров, которое задает наибольшую Высоту Глаза, устанавливается после каждой итерации. Обратите внимание, что значение FFE0 всегда вычисляется из значений FFE-1 и FFE1.

Сгенерируйте DDR5 модель Tx/Rx IBIS-AMI

Заключительная часть этого примера берет настроенную модель Simulink и генерирует исполняемые файлы DDR5 совместимые с IBIS-AMI, IBIS и AMI.

Откройте SerDes IBIS-AMI Manager.

Экспорт моделей

На вкладке Экспорт в диалоговом окне SerDes IBIS-AMI Manager:

  • Обновите имя модели Tx на ddr5_bc_tx.

  • Обновите имя модели Rx на ddr5_bc_rx.

  • Обратите внимание, что процент угла Tx и Rx установлен на 10. Это приведет к масштабированию значений угла аналоговой модели min/max на +/-10%.

  • Проверьте, что Dual модель выбрана для настроек модели Tx и Rx AMI. Это создаст исполняемые файлы модели, которые поддерживают как статистический (Init), так и временной интервал (GetWave) анализ.

  • Установите биты модели Tx, чтобы игнорировать значение следующим образом 3 поскольку в Tx FFE существует три отвода.

  • Установите биты модели Rx, чтобы игнорировать значение, равное 5 0000 чтобы позволить достаточное время для обучения для завершения во время симуляций во временном интервале.

  • Установите Модели, чтобы экспортировать как Tx и Rx, чтобы все файлы были выбраны для генерации (IBIS-файл, AMI-файлы и DLL-файлы).

  • Установите имя файла IBIS таким ddr5_bc_txrx.ibs

  • Джиттер может быть добавлен при желании на вкладках AMI-Tx и AMI-Rx.

  • Нажмите кнопку Export, чтобы сгенерировать модели в директории Target.

Обновление файлов AMI (при желании)

Файлы Tx и Rx AMI, сгенерированные SerDes Toolbox, соответствуют спецификации IBIS 6.1, поэтому все специфические параметры обратного канала были помещены в Model_Specific раздел файла.

Параметр BCI_State_ST имеет 5 состояний, необходимых для полного обучения в обратном канале, однако, чтобы сделать эти модели более удобными для пользователя, конечному пользователю действительно нужно только 2 состояния: «Off» и «Training». Чтобы внести это изменение, обновите параметр BCI_State_ST в каждом файле AMI следующим образом:

  • Измените (список 1 2 3 4 5) на (List 1 2).

  • Измените (List_Tip "Off" "Training" "Converged" "Failed" "" ошибка ") на (List_Tip "Off" "Training").

  • Обратите внимание, что это не повлияет на операцию модели, только на значения параметров, видимые пользователю.

Тестовые модели IBIS-AMI

Модели DDR5 передатчика и приемника IBIS-AMI теперь полны и готовы к тестированию на любом промышленном стандартном симуляторе модели AMI.

Ограничения модели

При симуляции с этими моделями в промышленном стандартном симуляторе модели AMI имейте в виду следующие ограничения:

  • Предполагается, что эти модели будут запускаться как «соответствующий набор» или с другими моделями AMI, которые были сгенерированы с использованием SerDes Toolbox.

  • Эти модели не будут работать с моделями AMI, сгенерированными за пределами SerDes Toolbox. В частности, любая модель, которая использует стандарт IBIS BCI_ * keywords.

  • BCI_Protocol не поддерживается. Эти модели были жестко закодированы на протокол с именем «DDRx_Write.»

  • BCI_ID не поддерживается. Эти модели были жестко закодированы в BCI_ID с именем «bci_comm,», что означает, что каждая симуляция должна быть запущена в отдельной директории, чтобы избежать конфликтов имен файлов во время симуляции.

  • Для активации обучения в обеих моделях необходимо включить обучение в обратном канале. Это делается путем установки параметров BCI_State_ST на «Обучение».

  • Эти модели должны быть запущены с размером блока 1024 для корректной операции.

  • Эти модели будут работать правильно с любыми значениями UI или Samples Per Bit.

Ссылки

[1] Спецификация IBIS 7.0, https://ibis.org/ver7.0/ver7_0.pdf.

[2] Веб-сайт JEDEC, https://www.jedec.org/.

См. также

| | | |

Похожие темы

Внешние веб-сайты