В этом примере показано, как создать AMI-модели передатчика и приемника, которые поддерживают обучающую связь по линии связи (обратный канал), используя метод, аналогичный описанному в спецификации IBIS 7.0, путем добавления к блокам библиотеки в SerDes Toolbox™. В этом примере для демонстрации настройки используется DDR5 передача записи (контроллер в SDRAM).
IBIS 7.0 представила возможность для моделей выполнять обучение линии связи или автосогласование, предоставляя механизм для взаимодействия исполняемых моделей Tx и Rx AMI во время операции GetWave. Алгоритм обучения линии связи может либо эмулировать то, что делает кремний, либо использовать методы анализа канала для определения оптимальных настроек выравнивания Tx и Rx, затем блокировать эти настройки на оставшуюся часть моделирования.
Связь между исполняемыми моделями Tx и Rx осуществляется в сообщениях, которые понимают и исполняемые модели Tx и Rx, и инструмент EDA не нуждается в понимании. Эти согласованные сообщения называются протоколом интерфейса обратного канала. Спецификация IBIS не описывает детали протокола интерфейса обратного канала, а только метод для обеспечения работы связи. В этом примере мы создадим новый протокол с именем DDRx_Write.
В настоящее время SerDes Toolbox не поддерживает зарезервированные параметры интерфейса обратного канала IBIS-AMI напрямую. Вместо этого он поддерживает специфичные для модели параметры, к имени которых добавлены «_ST», выполняющие аналогичную функцию. Поскольку эти параметры модели не используют то же имя, что и зарезервированные параметры из спецификации IBIS, они должны использоваться либо как «согласованный набор», либо с другими моделями обратного канала, разработанными SerDes Toolbox, поддерживающими тот же протокол. Эти модели должны хорошо работать в любом модельном симуляторе AMI промышленного стандарта.
Первая часть этого примера начинает с модели передатчика диспетчера DDR5 от Диспетчера DDR5 Модель Transmitter/Receiver IBIS-AMI и приемник SDRAM модель AMI из Модели DDR5 SDRAM Transmitter/Receiver IBIS-AMI. Мы добавили несколько дополнительных блоков передачи для поддержки обратной связи, и затем вы экспортируете модель в Simulink ® для дальнейшей настройки.
Открытие модели DDR5_Write_txrx_ami путем ввода следующей команды в окне команд MATLAB ®:
>> serdesDesigner('DDR5_Write_txrx_ami')

Для транзакции записи передатчик (Tx) является DDR5 контроллером, использующим 3-отводное выравнивание прямой связи (FFE), в то время как приемник (Rx) использует усилитель с переменным коэффициентом усиления (VGA) с 7 заранее заданными настройками и 4-отводный эквалайзер обратной связи принятия решения (DFE) со встроенным восстановлением тактовых данных. Для поддержки этой конфигурации система SerDes настроена следующим образом:
Для параметра «Время символа» установлено значение 208.3 ps, так как целевая рабочая скорость 4.8Гбит/с для DDR5-4800.
Целевой BER имеет значение 100e-18.
Для сигнализации установлено значение Single-ended.
Выборки на символ и модуляция поддерживаются значениями по умолчанию, которые являются 16 и NRZ (не возвращать к нулю), соответственно.
Блок Tx_BCI сквозной передачи является блоком, используемым для поддержки этой реализации обратного канала. Работа этого блока будет описана ниже в этом примере.
Блок Tx FFE настраивается для одного предварительного, одного основного и одного последующего отводов, включая три веса отводов. Это делается с массивом [0 1 0], где главный отвод задается наибольшим значением в массиве. Диапазоны отводов будут добавлены позже в примере при экспорте модели в Simulink.
Модель Tx AnalogOut настроена таким образом, что напряжение равно 1.1 V, Время подъема равно 100 ps, R (выходное сопротивление) - 50 ohms, и C (емкость) 0.65 pF. Фактические аналоговые модели, используемые в окончательной модели, будут сгенерированы позже в этом примере.
Потеря канала установлена в значение 5 dB, что характерно для каналов DDR.
Односторонний импеданс установлен в 40 Ом.
Целевая частота установлена в значение 2.4 ГГц, который является частотой Найквиста для 4,8 ГГц
Модель Rx AnalogIn настроена таким образом, что R (входное сопротивление) равно 40 Ом и C (емкость) равно 0.65pF. Фактические аналоговые модели, используемые в окончательной модели, будут сгенерированы позже в этом примере.
Блок Rx_BCI_Read сквозной передачи является блоком, используемым для поддержки этой реализации обратного канала. Работа этого блока будет описана ниже в этом примере.
Блок VGA устанавливается с коэффициентом усиления 1, а режим включается. Конкретные стили VGA будут добавлены позже в этом примере после экспорта модели в Simulink.
Блок DFECDR настраивается для четырех отводов DFE путем включения четырех начальных весов отводов, установленных в 0. Для параметра «Минимальное значение» установлено значение [-0.2 -0.075 -0.06 -0.045] V, а для параметра Maximum tap установлено значение [0.05 0.075 0.06 0.045] V. DFE был сконфигурирован для использования 2x весов отводов, чтобы соответствовать определению отводов JEDEC DFE.
Блок Rx_BCI_Write сквозной передачи является блоком, используемым для поддержки этой реализации обратного канала. Работа этого блока будет описана ниже в этом примере.
Нажмите кнопку Экспорт, чтобы экспортировать конфигурацию в Simulink для дальнейшей настройки и создания исполняемых файлов модели AMI.
В этой части примера рассматривается система SerDes, экспортированная приложением SerDes Designer, и настраивается в соответствии DDR5 требованиями для работы с обратным каналом в Simulink.
Система SerDes, импортированная в Simulink, состоит из блоков конфигурации, стимула, передачи, аналогового канала и приема. Все настройки из приложения SerDes Designer переносятся в модель Simulink. Сохраните модель и просмотрите каждую настройку блока.
В подсистеме Tx дважды щелкните блок FFE, чтобы открыть диалоговое окно «Параметры блока FFE». Разверните параметры IBIS-AMI и отмените выбор параметра Mode, эффективно жестко закодировав текущее значение Mode в конечной модели AMI в Fixed.
В подсистеме Rx дважды щелкните блок VGA, чтобы открыть диалоговое окно Параметры блока VGA. Параметры режима и усиления переносятся из приложения SerDes Designer.
В подсистеме Rx дважды щелкните блок DFECDR, чтобы открыть диалоговое окно Параметры блока DFECDR. Начальные веса отводов, минимальное значение отводов DFE и максимальное значение отводов Настройки RMS переносятся из приложения SerDes Designer. Адаптивное усиление и адаптивный размер шага устанавливаются в 3e-06 и 1e-06соответственно, которые являются разумными значениями на основе DDR5 ожиданий SDRAM. Разверните параметры IBIS-AMI и отмените выбор параметров фазового смещения и опорного смещения, эффективно жестко закодировав эти параметры в их текущие значения.
Откройте вкладку AMI-Tx в диалоговом окне SerDes IBIS-AMI Manager. Сначала перечисляются зарезервированные параметры, за которыми следуют специфичные для модели параметры, соответствующие формату типичного файла AMI.
Установите предварительный акцент: Редактировать TapWeights -1 и установите Формат в Range, Typ to 0, мин. до -0.2, и Max to 0.2.
Установите главное касание «Редактировать TapWeights 0» и установите для параметра «Формат» значение Range, Typ to 1, мин. до 0.6, и Max to 1.
Установите пост-ударение: Редактировать TapWeights 1 и установите Формат в Range, Typ to 0, мин. до -0.2, и Max to 0.2.
Для поддержки работы обратного канала необходимы дополнительные параметры управления. На вкладке AMI-Tx диалогового окна SerDes IBIS-AMI Manager выделите Tx_BCI и добавьте следующие 6 новых параметров:
FFE_Tapm1: Этот параметр создает хранилище данных, которое используется для передачи значения предварительного отвода FFE между блоками Tx во время обучения. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение FFE_Tapm1, Текущее значение для 0, Использование для InOut, Введите для Floatи Форматировать в Value. Задайте описание как: Tx FFE Tap -1 for back-channel training. Сохраните изменения и обратите внимание, что при этом автоматически создаются хранилища данных в блоке Tx_BCI PassThrough.
FFE_Tap0: Этот параметр создает хранилище данных, которое используется для передачи значения основного отвода FFE между блоками Tx во время обучения. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение FFE_Tap0, Текущее значение для 0, Использование для InOut, Введите для Floatи Форматировать в Value. Задайте описание как: Tx FFE Tap 0 for back-channel training. Сохраните изменения.
FFE_Tap1: Этот параметр создает хранилище данных, которое используется для передачи значения FFE post tap между блоками Tx во время обучения. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение FFE_Tap1, Текущее значение для 0, Использование для InOut, Введите для Floatи Форматировать в Value. Задайте описание как: Tx FFE Tap 1 for back-channel training. Сохраните изменения.
BCI_Protocol_ST: Этот параметр используется только для создания параметра с именем «BCI_Protocol_ST» в файле .ami для частичного соответствия спецификации IBIS-AMI. Этот параметр не используется этой моделью. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение 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. Этот параметр не используется этой моделью. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение 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 = Error. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение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 в диалоговом окне SerDes IBIS-AMI Manager сначала перечисляются зарезервированные параметры, за которыми следуют специфичные для модели параметры, соответствующие формату типичного файла AMI.
Задайте коэффициент усиления VGA: Изменить коэффициент усиления. Задать описание как: 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: Изменить TapWeights 1. Убедитесь, что для параметра «Формат» установлено значение Range и установить Typ = 0, Мин = -0.2, и Max = 0.05. Сохраните изменения.
Задайте второй вес отводов DFE: Редактировать TapWeights 2. Убедитесь, что для параметра «Формат» установлено значение Range и установить Typ = 0, Мин = -0.075, и Max = 0.075. Сохраните изменения.
Установите третий вес отводов DFE: Редактировать TapWeights 3. Убедитесь, что для параметра «Формат» установлено значение Range и установить Typ = 0, Мин = -0.06, и Max = 0.06. Сохраните изменения.
Задайте четвертый вес отводов DFE: Редактировать TapWeights 4. Убедитесь, что для параметра «Формат» установлено значение Range и установить Typ = 0, Мин = -0.045, и Max = 0.045. Сохраните изменения.
Для поддержки работы обратного канала необходимы дополнительные параметры управления. На вкладке AMI-Rx в диалоговом окне SerDes IBIS-AMI Manager выделите Rx_BCI_Write и добавьте следующие новые параметры (примечание: Rx_BCI_Read не требует дополнительных параметров):
sampleVoltage: этот параметр создает хранилище данных, которое будет использоваться для передачи напряжения выборки CDR другим блокам Rx во время обучения. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение sampleVoltage, Текущее значение для 0, Использование для InOut, Введите для Floatи Форматировать в Value. Задайте описание как: Sample Voltage for back-channel training. Сохраните изменение и обратите внимание, что это автоматически создает хранилища данных в блоке Rx_BCI_Write PassThrough.
BCI_Protocol_ST: Этот параметр генерирует только параметр с именем «BCI_Protocol_ST» в файле .ami для частичного соответствия спецификации IBIS-AMI. Этот параметр не используется этой моделью. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение 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. Этот параметр не используется этой моделью. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение 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 reserved parameter BCI_ID as an input to the model. Сохраните изменения.
BCI_State_ST: Этот параметр создает хранилище данных, которое используется для передачи состояния обучения обратного канала: 1 = Off, 2 = Training, 3 = Converged, 4 = Failed, 5 = Error. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение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. Этот параметр не используется этой моделью. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение 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. Этот параметр не используется этой моделью. Щелкните Добавить параметр... кнопка. Задать для имени параметра значение 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 и нажмите кнопку «Обновить Init».
Запустите модель для моделирования системы SerDes и убедитесь, что текущая настройка компилируется и выполняется без ошибок или предупреждений. Создаются два графика. Первая - это диаграмма глаз в реальном времени (GetWave), которая обновляется по мере запуска модели. Второй график содержит четыре представления статистических результатов (Init), как графики, доступные в приложении SerDes Designer, плюс два представления из результатов Time Domain (GetWave).
Примечание.Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически созданных блоков хранения данных, которые будут рассмотрены позже.
Для поддержки обучения по обратному каналу требуется три набора внешних файлов. Создание этих файлов выходит за рамки данного примера, поэтому они включены в этот пример. Перед запуском всей системы SerDes или созданием исполняемых файлов модели AMI загрузите следующие 9 файлов в каталог модели (расположение файла Simulink .slx).
Эти три файла используются для записи текущего состояния обучающих параметров обратного канала и метрики глаза во внешний файл для связи между моделями Tx и Rx AMI.
Файл функции MATLAB: writeBCISfile.m
Файлы C++, необходимые для кодегена: writeamidata.cpp и writeamidata.h
Эти три файла используются для считывания текущего состояния обучающих параметров обратного канала и показателей зрения из внешнего файла для связи между моделями Tx и Rx AMI.
Файл функции MATLAB: readBCISfile.m
Файлы C++, необходимые для кодегена: readamidata.cpp и readamidata.h
Эти три файла используются для записи текущего состояния параметров обучения обратного канала и показателей зрения после каждого шага обучения в файл журнала для отладки.
Файл функции MATLAB: writeBSTARThistory.m
Файлы C++, необходимые для кодегена: writebcihist.cpp и writebcihist.h
Чтобы управлять весами отводов Tx FFE из блока Tx_BCI при включенном обучении обратному каналу, замените блок FFEParameter.TapWeights Constant блоком DataStireRead. Это хранилище данных позволяет изменять значения отводов FFE во время моделирования и передавать их в каждый из блоков пути данных.
В подсистеме Tx щелкните блок FFE и введите Ctrl-U для просмотра под маской блока FFE.
Удалите блок константы FFETapWeights.
Добавление блока DataStureRead с меткой BCIFFETapWeightsIn.
Дважды щелкните блок DataStureRead и задайте для имени хранилища данных значение: Tx_BCISignal.
На вкладке «Выбор элемента» разверните Tx_BCISignal сигнала и выделите FFE_Tapm1, FFE_Tap0 и FFE_Tap1.
Нажмите кнопку Select > >, чтобы выбрать эти 3 элемента.
Сохраните изменения.
Добавьте блок мультиплексора и установите число входов равным 3 для мультиплексирования этих трех параметров в вектор для блока FFE.
Подключите выход блока мультиплексора к входу TapWeights на FFE.
Последний блок FFE должен выглядеть следующим образом:

Введите Ctrl-D, чтобы скомпилировать модель и проверить наличие ошибок. Можно игнорировать любые предупреждения для несвязанных блоков. Они обусловлены автоматически сгенерированными блоками хранения данных, которые будут рассмотрены позже.
Для определения качества заданного набора значений выравнивания во время тренировки обратного канала будет использоваться напряжение, которое дискретизируется CDR в центре глаза для каждого символа. Это значение захватывается блоком DataStureWrite, чтобы его значение было доступно другим блокам управления BCI.
В подсистеме Rx щелкните по блоку DFECDR и введите Ctrl-U для просмотра под маской блока Rx DFECDR.
Открытие объекта BusSelector
Выделите параметр voltageSample в списке элементов шины.
Нажмите кнопку Выбрать > >, чтобы переместить его в список выбранных элементов.
Сохраните изменения.
Добавьте блок DataStireWrite с меткой: CDR sample Voltage
Дважды щелкните блок DataStireWrite и задайте для имени хранилища данных значение: Rx_BCI_WriteSignal на вкладке «Параметры».
На вкладке Назначение элемента разверните Rx_BCI_WriteSignal сигнала и выделите sampleVoltage.
Нажмите кнопку Выбрать > >, чтобы выбрать этот элемент.
Сохраните изменения.
Подключите выходной сигнал voltureSample BusSelector к входу нового блока DataStireWrite.
Эта часть блока DFECDR должна выглядеть следующим образом:

Введите Ctrl-D, чтобы скомпилировать модель и проверить наличие ошибок. Можно игнорировать любые предупреждения для несвязанных блоков. Они обусловлены автоматически сгенерированными блоками хранения данных, которые будут рассмотрены позже.
Во время обучения по обратному каналу для режимов FFE и DFE необходимо установить значение «Fixed». Режим FFE был жестко закодирован в «Фиксированный». Простая функция MATLAB позволяет установить режим DFE, если обучение не включено.
В подсистеме Rx щелкните по блоку DFECDR и введите Ctrl-U для просмотра под маской блока Rx DFECDR.
Удалите соединение между блоком DFECDRMode и DFECDR.
Добавление нового функционального блока MATLAB и установка метки 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
Добавление блока DataStureRead с меткой Rx_BCI_Write_BCI_State_Inтаким образом, значение BCI_State_ST может подаваться в функциональный блок MATLAB.
Дважды щелкните блок DataStireRead и задайте для имени хранилища данных значение: Rx_BCI_WriteSignal.
На вкладке «Выбор элемента» разверните Rx_BCI_WriteSignal сигнала и выделите BCI_State_ST.
Нажмите кнопку Выбрать > >, чтобы выбрать этот элемент.
Сохраните изменения.
Подключите эти новые блоки, как показано на рисунке. Окончательный блок DFECDR должен выглядеть следующим образом:

Введите Ctrl-D, чтобы скомпилировать модель и проверить наличие ошибок. Можно игнорировать любые предупреждения для несвязанных блоков. Они обусловлены автоматически сгенерированными блоками хранения данных, которые будут рассмотрены позже.
Функция Tx Initialize используется для настройки модели Tx AMI для выполнения обучения обратному каналу во время анализа GetWave. Это создает файлы обратной связи и регистрации, устанавливает различные параметры и переопределяет любые определенные пользователем значения отводов FFE.
В подсистеме Tx дважды щелкните по блоку Init, затем нажмите Show Init, чтобы открыть функцию инициализации в MATLAB.
Функция инициализации - это автоматически генерируемая функция, которая обеспечивает обработку импульсной характеристики системного блока SerDes (IBIS AMI-Init). %% BEGIN: и % END: строки обозначают раздел, в котором можно ввести пользовательский код. Данные в этом разделе не перезаписываются при запуске обновления 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) и журнала (BCI_comm_log.csv) и что значения в файлах соответствуют указанным выше значениям.
Функция Rx Initialize используется для настройки модели Rx AMI для выполнения обучения обратному каналу во время анализа GetWave. Он считывается в файле связи обратного канала и затем обновляет файл с помощью конфигурационной информации Rx (количество отводов DFE и значения отводов DFE). Он также обновляет файл журнала.
В подсистеме Rx дважды щелкните по блоку Init, затем нажмите Show Init, чтобы открыть функцию инициализации в MATLAB.
Функция инициализации - это автоматически генерируемая функция, которая обеспечивает обработку импульсной характеристики системного блока SerDes (IBIS AMI-Init). %% BEGIN: и % END: строки обозначают раздел, в котором можно ввести пользовательский код. Данные в этом разделе не перезаписываются при запуске обновления 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_BCI используется для управления всем процессом обучения обратного канала. Первый раз инициализирует все параметры Tx и Rx, которые будут оптимизированы во время обучения. После каждого цикла обучения обратного канала этот блок считывает текущую метрику глаза, предоставляемую приемником, сохранить это значение, затем обновить параметры Tx и Rx для следующего прохода. После завершения обучения этот блок будет сигнализировать о завершении обучения, установите для всех параметров Tx и Rx их оптимальные значения, а затем верните модели к нормальной работе.
Первым шагом является настройка блока Tx_BCI для работы обратного канала. Функциональный блок MATLAB, который управляет работой блока Tx_BCI, записывается далее в этом примере.
Посмотри под маской в Tx_BCI блоке. Необходимо просмотреть 8 автоматически созданных блоков чтения/записи хранилища данных.
Удалите системный объект Pass-Through, так как он не используется. Обязательно подключите входной порт к исходящему порту.
Добавьте блок мультиплексора и установите количество входов равным 3. Это будет использоваться для мультиплексирования трех сигналов tapWeaingIn DataStureRead в один вектор.
Добавьте блок Demux и установите количество выходов равным 3. Это будет использоваться для демультиплексирования вектора tapWeeOut в три отдельных сигнала DataStureWrite.
Добавление нового функционального блока MATLAB и установка метки Counter. Эта функция MATLAB возвращает подсчет общего количества выборок, обработанных моделью, и результирующего количества пользовательских интерфейсов. Откройте новый функциональный блок MATLAB, затем скопируйте/вставьте следующий код, заменив содержимое по умолчанию.
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. Для удаления этих узлов из функционального блока MATLAB:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB выделите параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".
Изменение области данных с Signal кому Parameter.
Повторите этот процесс для SampleInterval.
При сохранении функции MATLAB необходимо увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
В качестве типа данных для выходных данных этой функции, sampCount и uiCount, по умолчанию устанавливается значение Inherit. Поскольку этот функциональный блок создает значения для этих двух параметров, их тип данных должен быть явно определен, а не определен на основе эвристики. Для явного определения типов данных для этих двух параметров:
Откройте обозреватель моделей Simulink и перейдите в раздел Tx- > Tx _ BCI- > Counter.
Выделите параметр sampCount.
Обновить тип из Inherit в int32 и нажмите «Применить».
Повторите этот процесс для uiCount.
Добавьте новый функциональный блок MATLAB и установите метку на txBackChannel. Этот функциональный блок MATLAB используется для управления процессом обучения обратного канала. Содержимое этой функции будет рассмотрено ниже в этом примере. Однако для завершения Tx_BCI блочных соединений необходимо отобразить все правильные узлы. Чтобы включить это, выполните следующие действия.
Дважды щелкните функциональный блок txBackChannel MATLAB, чтобы открыть его в редакторе MATLAB.
Удалите все содержимое по умолчанию.
Вставьте следующую подпись функции:
function [tapWeightsOut, BCIStateOut] = txBCtraining(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)
Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются из рабочего пространства модели и поэтому не должны отображаться как узлы в функциональном блоке MATLAB. Для удаления этих узлов из функционального блока MATLAB:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB выделите параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".
Изменение области данных с Signal кому Parameter.
Повторите этот процесс для SampleInterval.
При сохранении функции MATLAB необходимо увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
Соедините все вместе, как показано ниже:

Блок Rx_BCI_Read используется для считывания значений параметров Rx, запрашиваемых блоком Tx_BCI, и установки этих значений для следующего цикла обучения обратного канала. Если блок Tx_BCI сообщает, что обучение завершено, этот блок устанавливает окончательные значения, которые будут использоваться для оставшейся части моделирования.
Первым шагом является настройка блока Rx_BCI_Read для работы обратного канала. Функциональный блок MATLAB, который управляет работой блока Rx_BCI_Read, записывается далее в примере.
Посмотри под маской в Rx_BCI_Read блоке.
Удалите системный объект Pass-Through, поскольку он не будет использоваться. Обязательно подключите входной порт к исходящему порту.
Добавление блока DataStureRead с меткой DFECDRTapWeightsIn
Дважды щелкните блок DataStireRead и задайте для имени хранилища данных значение: DFECDRSignal.
На вкладке Element Selection разверните сигнал DFECDRSignal и выделите TapWeights [1,4].
Нажмите кнопку Выбрать > >, чтобы выбрать этот элемент.
Сохраните изменения.
Добавление блока DataStureRead с меткой RxBCIStateIn
Дважды щелкните блок DataStireRead и задайте для имени хранилища данных значение: Rx_BCI_WriteSignal.
На вкладке «Выбор элемента» разверните Rx_BCI_WriteSignal сигнала и выделите BCI_State_ST.
Нажмите кнопку Выбрать > >, чтобы выбрать этот элемент.
Сохраните изменения.
Добавление блока DataStureWrite с меткой RxBCIStateOut
Дважды щелкните блок DataStireWrite и задайте для имени хранилища данных значение: Rx_BCI_WriteSignal.
На вкладке «Назначение элемента» разверните Rx_BCI_WriteSignal сигнала и выделите BCI_State_ST.
Нажмите кнопку Выбрать > >, чтобы выбрать этот элемент.
Сохраните изменения.
Добавление блока DataStureWrite с меткой DFECDRTapWeightsOut
Дважды щелкните блок DataStireWrite и задайте для имени хранилища данных значение: DFECDRSignal.
На вкладке Назначение элемента разверните сигнал DFECDRSignal и выделите TapWeights [1,4].
Нажмите кнопку Выбрать > >, чтобы выбрать этот элемент.
Сохраните изменения.
Скопируйте функциональный блок Counter MATLAB из блока Tx Tx_BCI в этот блок.
Добавление нового функционального блока MATLAB и установка метки rxBackChannelRead. Этот функциональный блок MATLAB используется для управления процессом обучения обратного канала. Содержимое этой функции будет рассмотрено ниже в этом примере. Однако для завершения Rx_BCI_Read блочных соединений необходимо отобразить все правильные узлы. Чтобы включить это, выполните следующие действия.
Дважды щелкните функциональный блок rxBackStartRead MATLAB, чтобы открыть его в редакторе MATLAB.
Удалите все содержимое по умолчанию.
Вставьте следующую подпись функции:
function [BCIStateOut, tapWeightsOut] = rxBCtrainingRead(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)
Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются из рабочего пространства модели и поэтому не должны отображаться как узлы в функциональном блоке MATLAB. Для удаления этих узлов из функционального блока MATLAB:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB выделите параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".
Изменение области данных с Signal кому Parameter.
Повторите этот процесс для SampleInterval.
При сохранении функции MATLAB необходимо увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
Соедините все вместе, как показано ниже:

Блок Rx_BCI_Write используется в конце каждого цикла обучения обратного канала, чтобы вычислить текущие метрики глаза и сообщить эти метрики обратно в блок Tx_BCI для анализа.
Первым шагом является настройка блока Rx_BCI_Write для работы обратного канала. Функциональный блок MATLAB, который управляет работой блока Rx_BCI_Write, записывается далее в примере.
Посмотри под маской в Rx_BCI_Write блоке. Необходимо создать 4 автоматически созданных блока чтения/записи хранилища данных.
Удалите системный объект Pass-Through, так как он не используется. Обязательно подключите входной порт к исходящему порту.
Удаление блока DataStureWrite с меткой sampleVoltage писать. Он не будет использоваться.
Добавление блока DataStureRead с меткой DFECDRTapWeightsIn.
Дважды щелкните блок DataStureRead и задайте для имени хранилища данных значение DFECDRSignal.
На вкладке Element Selection разверните сигнал DFECDRSignal и выделите TapWeights [1,4].
Нажмите кнопку Выбрать > >, чтобы выбрать этот элемент.
Сохраните изменения.
Скопируйте функциональный блок Counter MATLAB из блока Tx Tx_BCI в этот блок.
Добавление нового функционального блока MATLAB и установка метки rxBackChannelWrite. Этот функциональный блок MATLAB используется для управления процессом обучения обратного канала. Содержимое этой функции будет рассмотрено ниже в этом примере. Однако для завершения Rx_BCI_Write блочных соединений необходимо отобразить все правильные узлы. Чтобы включить это, выполните следующие действия.
Дважды щелкните функциональный блок rxBackStartWrite MATLAB, чтобы открыть его в редакторе MATLAB.
Удалите все содержимое по умолчанию.
Вставьте следующую подпись функции:
function BCIStateOut = rxBCtrainingWrite(sampleV, tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)
Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются из рабочего пространства модели и поэтому не должны отображаться как узлы в функциональном блоке MATLAB. Для удаления этих узлов из функционального блока MATLAB:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB выделите параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime".
Изменение области данных с Signal кому Parameter.
Повторите этот процесс для SampleInterval.
При сохранении функции MATLAB необходимо увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
Соедините все вместе, как показано ниже:

Блок Tx_BCI используется для управления всем процессом обучения обратного канала. Первый раз инициализирует все параметры Tx и Rx, которые будут оптимизированы во время обучения. После каждого цикла обучения обратного канала этот блок считывает текущую метрику глаза, предоставляемую приемником, сохраняет это значение, затем обновляет параметры Tx и Rx для следующего прохода. Когда обучение завершено, этот блок сигнализирует о завершении обучения, устанавливает все параметры Tx и Rx на их оптимальные значения и затем возвращает модели к регулярной работе.
Блок Tx_BCI был настроен для работы с обратным каналом ранее в этом примере. Теперь необходимо создать функциональный блок MATLAB в самом сердце блока Tx_BCI. Этот функциональный блок MATLAB, который был помечен txBackChannel, управляет всем процессом обучения обратного канала. В этот процесс вовлечены следующие этапы:
Определение подписи функции
Инициализация параметров и установка постоянных переменных
Определение параметров для сдвига и их диапазонов
При первом вызове GetWave установите начальные значения начальных параметров для Tx и Rx.
Каждый тренировочный цикл обратного канала считывает метрики глаз, рассчитанные Rx, и решает, что делать дальше. После завершения обучения выдайте оптимальные значения параметров Tx и Rx, которые будут использоваться при моделировании, и запишите эти окончательные значения в файл журнала.
Установите правильное состояние обучения и выведите используемые параметры FFE
В следующих разделах рассматривается код, используемый в функциональном блоке txBackChannel MATLAB. В блоке Tx нажмите на блок передачи Tx_BCI и напечатайте Ctrl-U, чтобы продвинуться в блок передачи Tx_BCI, настроенный ранее. Дважды щелкните функциональный блок txBackChannel MATLAB, затем скопируйте/вставьте код, описанный в следующих разделах.
Сигнатура функции для обучающего блока txBCtraining имеет 6 входов и 2 выхода. Входными данными являются:
tapWeightsIn: FFE выявляют множество весов, как определено в маске FFE.
BCIStateIn: значение состояния обратного канала из хранилища данных TxBCIStateIn.
sampleCounter: подсчет общего количества проб.
uiCounter: счетчик общего количества пользовательских интерфейсов.
SymbolTime: пользовательский интерфейс (в секундах). Это значение наследуется из рабочей области модели и поэтому не должно отображаться как узел в функциональном блоке MATLAB. Для удаления этого узла из функционального блока MATLAB для области данных ранее было установлено значение «Parameter».
SampleInterval: размер шага моделирования (в секундах). Это значение наследуется из рабочей области модели и поэтому не должно отображаться как узел в функциональном блоке MATLAB. Для удаления этого узла из функционального блока MATLAB для области данных ранее было установлено значение «Parameter».
Существует два выхода:
tapWeauOut: FFE отводит весовые массивы, выводимые в хранилище данных BCIFFETapWeOut.
BCIStateOut: значение состояния обратного канала, выводимое в хранилище данных TxBCIStateOut.
Сигнатура функции была добавлена ранее при первоначальном создании функционального блока MATLAB и уже присутствует.
В этом разделе задаются три константы, необходимые для вычисления размера обучающего цикла обратного канала:
sampBit: количество выборок в каждом пользовательском интерфейсе.
StartInterval: Длина (в UI) каждого обучающего цикла обратного канала. В настоящее время это значение равно ~ 2 PRBS7 итераций.
Время задержки (в UI) перед началом обучения обратного канала. В настоящее время это значение равно ~ 4 PRBS7 итераций.
В дополнение к постоянным значениям в этом разделе задаются 11 постоянных переменных, используемых этой функцией. Постоянные переменные сохраняют свои значения между каждым вызовом этой функции MATLAB. 11 постоянных переменных:
Протокол: протокол, используемый этой моделью обратного канала.
numDFEtaps: Количество отводов DFE, включенных в этот алгоритм обучения обратного канала.
numFFFetaps: Количество отводов FFE, включенных в этот алгоритм обучения обратного канала.
DFEtaps: текущие значения отводов DFE.
FFEtaps: текущие значения крана FFE.
Последовательность: целочисленный счетчик, используемый для регистрации последовательности обучающих событий.
Состояние: текущее состояние обучения обратного канала.
EyeHeight: Текущая высота глаза (в вольтах) сообщается Rx.
шаг: Выполняется текущий шаг последовательности обучения.
indx: переменная индекса для циклов управления.
metric: Массив, используемый для хранения высоты входящих глаз с каждого шага обучения.
Чтобы инициализировать эти параметры и переменные, скопируйте/вставьте следующий код в функциональный блок txBackChannel MATLAB:
%% 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: Диапазон значений min/max, используемых при развертке предварительного крана FFE.
regFFEtap1: Диапазон значений min/max, используемых при развертке FFE после нажатия.
regDFEtap1: Диапазон значений min/max, используемых при зачистке первого крана DFE.
regDFEtap2: Диапазон значений min/max, используемых при развертке второго крана DFE.
regDFEtap3: Диапазон значений min/max, используемых при развертке третьего крана DFE.
regDFEtap4: Диапазон значений min/max, используемых при развертке четвертого крана DFE.
Для определения всех параметров, которые должны быть перемещены во время обучения, скопируйте/вставьте следующий код в функциональный блок txBackChannel MATLAB:
% 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);
Когда обучение включено, самый первый вызов этой функции MATLAB должен считывать файл связи обратного канала, написанный во время Init, чтобы определить все возможности моделей Tx и Rx. В этом разделе также устанавливаются начальные значения, которые будут использоваться для первого цикла обучения обратного канала. Наконец, все эти значения записываются в файл регистрации связи обратного канала.
Для реализации первого вызова GetWave скопируйте/вставьте следующий код в функциональный блок txBackChannel MATLAB:
%% 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, как определено константой BCISwait, алгоритм обучения обратного канала вызывается каждым обучающим блоком, как определено константой startInterval. Сначала считываются текущие метрики, сообщенные приемником, затем эти результаты записываются в файл журнала связи обратного канала. Алгоритм обучения использует следующие шаги:
Протяните все значения предварительного отвода FFE и определите, какое значение приводит к наибольшему открытию глаза.
Протяните все значения FFE после нажатия и определите, какое значение приведет к наибольшему открытию глаза.
Протяните все значения DFE-крана 1 и определите, какое значение приведет к наибольшему открытию глаза.
Протяните все значения DFE-крана 2 и определите, какое значение приведет к наибольшему открытию глаза.
Протяните все значения DFE-крана 3 и определите, какое значение приведет к наибольшему открытию глаза.
Протяните все значения DFE-крана 4 и определите, какое значение приведет к наибольшему открытию глаза.
После завершения обучения измените состояние на «Converged» и запишите окончательные значения в файл журнала связи обратного канала.
Для реализации обучающего алгоритма обратного канала скопируйте/вставьте следующий код в функциональный блок txBackChannel MATLAB:
%% 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 и обновить значения массива отводов FFE.
Чтобы установить состояние обучения и выходные значения, скопируйте/вставьте следующий код в функциональный блок txBackChannel MATLAB:
%% 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.
Блок Rx_BCI_Read используется для считывания значений параметров Rx, запрашиваемых блоком Tx_BCI, и установки их для следующего цикла обучения обратного канала. Если блок Tx_BCI сообщает, что обучение завершено, этот блок устанавливает конечные значения, которые будут использоваться Rx для оставшейся части моделирования.
Блок Rx_BCI_Read был настроен для работы с обратным каналом ранее в этом примере. Теперь создайте функциональный блок MATLAB в центре блока Rx_BCI_Read. Этот функциональный блок MATLAB, который был помечен rxBCtrainingRead, задает используемые значения Rx DFE. В этот процесс вовлечены следующие этапы:
Определите подпись функции.
Инициализация параметров и установка постоянных переменных.
При первом вызове GetWave и в начале каждого цикла обучения обратного канала считывайте значения отводов Rx DFE, которые должны использоваться, как определено алгоритмом обучения обратного канала Tx.
Установите правильное состояние обучения и выведите используемые параметры DFE.
В следующих разделах представлен код, используемый в функциональном блоке rxBCtrainingRead MATLAB. В блоке Rx нажмите на блок передачи Rx_BCI_Read и напечатайте Ctrl-U, чтобы продвинуться в блок передачи Rx_BCI_Read, настроенный ранее. Дважды щелкните функциональный блок rxBCtrainingRead MATLAB, затем скопируйте/вставьте код, описанный в следующих разделах.
Сигнатура функции для блока rxBCtrainingRead имеет 6 входов и 2 выхода. Входными данными являются:
tapWeightsIn: DFE выявляют множество весов, как определено в Хранилище данных DFECDRTapWeightsIn.
BCIStateIn: значение состояния обратного канала из хранилища данных RxBCIStateIn.
sampleCounter: подсчет общего количества проб.
uiCounter: счетчик общего количества пользовательских интерфейсов.
SymbolTime: пользовательский интерфейс (в секундах). Это значение наследуется из рабочей области модели и поэтому не должно отображаться как узел в функциональном блоке MATLAB. Для удаления этого узла из функционального блока MATLAB для области данных установлено значение «Parameter».
SampleInterval: размер шага моделирования (в секундах). Это значение наследуется из рабочей области модели и поэтому не должно отображаться как узел в функциональном блоке MATLAB. Для удаления этого узла из функционального блока MATLAB для области данных установлено значение «Parameter».
Существует два выхода:
tapWeauOut: DFE отводит весовые массивы, выводимые в хранилище данных DFECDRTapWeOut.
BCIStateOut: значение состояния обратного канала, выводимое в хранилище данных RxBCIStateOut.
Сигнатура функции была введена ранее при первоначальном создании функционального блока MATLAB и уже имеется.
В этом разделе задаются три константы, необходимые для вычисления размера обучающего цикла обратного канала:
sampBit: количество выборок в каждом пользовательском интерфейсе.
StartInterval: Длина (в UI) каждого обучающего цикла обратного канала. В настоящее время это значение равно ~ 2 PRBS7 итераций.
Время задержки (в UI) перед началом обучения обратного канала. В настоящее время это значение равно ~ 4 PRBS7 итераций.
В дополнение к постоянным значениям в этом разделе задаются 7 постоянных переменных, используемых этой функцией. Постоянные переменные сохраняют свои значения между каждым вызовом этой функции MATLAB. 7 постоянных переменных:
Протокол: протокол, используемый этой моделью обратного канала.
numDFEtaps: Количество отводов DFE, включенных в этот алгоритм обучения обратного канала.
numFFFetaps: Количество отводов FFE, включенных в этот алгоритм обучения обратного канала.
DFEtaps: текущие значения отводов DFE.
FFEtaps: текущие значения крана FFE.
Последовательность: целочисленный счетчик, используемый для регистрации последовательности обучающих событий.
Состояние: текущее состояние обучения обратного канала.
Чтобы инициализировать параметры и переменные, скопируйте/вставьте следующий код в функциональный блок rxBCtrainingRead MATLAB:
%% 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
Когда обучение активизировано, при самом первом вызове этой функции MATLAB и в начале каждого обучающего блока, как определено константой startInterval, файл связи обратного канала считывается, чтобы определить обновленные значения отводов DFE, которые будут использоваться для следующего учебного цикла.
Чтобы настроить используемые значения отводов DFE, скопируйте/вставьте следующий код в функциональный блок rxBCtrainingRead MATLAB:
%% 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, это обновить состояние для хранилища данных BCI_State_ST и обновить значения массива отводов DFE.
Для установки значений State и output скопируйте/вставьте следующий код в функциональный блок rxBCtrainingRead MATLAB:
%% 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.
Блок Rx_BCI_Write используется в конце каждого цикла обучения обратного канала, чтобы вычислить текущие метрики глаза и сообщить эти метрики обратно в блок Tx_BCI для анализа.
Блок Rx_BCI_Write был настроен для работы с обратным каналом ранее в этом примере. Теперь будет создан функциональный блок MATLAB в центре блока Rx_BCI_Write. Этот функциональный блок MATLAB, который был помечен rxBCtrainingWriteвычисляет минимальную высоту глаза последних 127 бит и записывает эти значения в файл связи обратного канала и файл регистрации. В этот процесс вовлечены следующие этапы:
Определите подпись функции.
Инициализация параметров и установка постоянных переменных.
Сохраните вектор напряжений, который будет использоваться при расчете минимальной высоты глаза.
В конце каждого цикла обучения обратного канала вычислите минимальную высоту глаза и запишите ее в файл связи заднего канала.
Обновите состояние обучения.
В следующих разделах рассматривается код, используемый в функциональном блоке rxBCtrainingWrite MATLAB. В блоке Rx нажмите на блок передачи Rx_BCI_Write и напечатайте Ctrl-U, чтобы продвинуться в блок передачи Rx_BCI_Write, настроенный ранее. Дважды щелкните по функциональному блоку rxBCtrainingWrite MATLAB, затем скопируйте/вставьте код, описанный в следующих разделах.
Сигнатура функции для блока rxBCtrainingWrite имеет 7 входов и 1 выход. Входными данными являются:
sampleV: Напряжение во время выборки CDR.
tapWeightsIn: DFE выявляют множество весов, как определено в Хранилище данных DFECDRTapWeightsIn.
BCIStateIn: значение состояния обратного канала из хранилища данных RxBCIStateIn.
sampleCounter: подсчет общего количества проб.
uiCounter: счетчик общего количества пользовательских интерфейсов.
SymbolTime: пользовательский интерфейс (в секундах). Это значение наследуется из рабочей области модели и поэтому не должно отображаться как узел в функциональном блоке MATLAB. Для удаления этого узла из функционального блока MATLAB для области данных установлено значение «Parameter».
SampleInterval: размер шага моделирования (в секундах). Это значение наследуется из рабочей области модели и поэтому не должно отображаться как узел в функциональном блоке MATLAB. Для удаления этого узла из функционального блока MATLAB для области данных установлено значение «Parameter».
Имеется один выход:
BCIStateOut: значение состояния обратного канала, выводимое в хранилище данных RxBCIStateOut.
Сигнатура функции была введена ранее при первоначальном создании функционального блока MATLAB и уже имеется.
В этом разделе задаются четыре константы, необходимые для вычисления размера обучающего цикла обратного канала:
sampBit: количество выборок в каждом пользовательском интерфейсе.
StartInterval: Длина (в UI) каждого обучающего цикла обратного канала. В настоящее время это значение равно ~ 2 PRBS7 итераций.
Время задержки (в UI) перед началом обучения обратного канала. В настоящее время это значение равно ~ 4 PRBS7 итераций.
windowLength: длина окна (в интерфейсе пользователя), используемая для вычисления минимальной высоты глаза. В настоящее время это значение равно 1 PRBS7 итерации.
В дополнение к постоянным значениям в этом разделе задаются 5 постоянных переменных, используемых этой функцией. Постоянные переменные сохраняют свои значения между каждым вызовом этой функции MATLAB. 5 постоянных переменных:
Протокол: протокол, используемый этой моделью обратного канала.
Последовательность: целочисленный счетчик, используемый для регистрации последовательности обучающих событий.
Состояние: текущее состояние обучения обратного канала.
EyeHeight: вычисленное значение высоты внутреннего глаза (в вольтах).
vSamp: напряжение образца, сообщаемое блоком CDR.
Чтобы инициализировать все параметры и переменные для этого блока, скопируйте/вставьте следующий код в функциональный блок rxBCtrainingWrite MATLAB:
%% 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, поэтому используется абсолютное значение.
Для сохранения значений напряжения глаза отчета скопируйте/вставьте следующий код в функциональный блок rxBCtrainingWrite MATLAB:
% 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, как определено константой BCI wait, метрики обратного канала вычисляются в конце каждой итерации обучения, как определено константой startInterval. Сначала конфигурацию обратного канала считывают из файла связи обратного канала, затем вычисляют значение высоты внутреннего глаза и выводят результаты в файл связи обратного канала и файл регистрации.
Чтобы вычислить метрики глаза и записать в файл связи каждый цикл обратного канала, скопируйте/вставьте следующий код в функциональный блок rxBCtrainingWrite MATLAB:
%% 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, это обновить состояние для хранилища данных BCI_State_ST.
Чтобы установить состояние обучения, скопируйте/вставьте следующий код в функциональный блок rxBCtrainingRead MATLAB:
%% 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.
В Simulink введите Ctrl-D, чтобы скомпилировать модель и проверить наличие ошибок. Перед продолжением устраните все ошибки.
Следующим шагом является запуск модели и проверка правильности работы кода обратного канала.
Перед запуском полной модели откройте блок Стимул (Stimulus), чтобы задать шаблон стимула, используемый для тестирования модели:
Установите PRBS в значение 7, так что во время моделирования будет использоваться PRBS7 шаблон.
Задайте для параметра «Количество символов» значение 50000 для обеспечения возможности выполнения алгоритма обучения обратного канала с выделением времени.
Запустите модель. Во время работы модели наблюдайте изменение формы сигнала во временной области по мере сдвига каждой из настроек отводов. После завершения моделирования файл связи обратного канала, 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. Наблюдайте, как изменяется Высота глаза (Eye Height) при протягивании каждого значения, и значение параметра, которое дает наибольшую Высоту глаза (Eye Height), устанавливается после каждой итерации. Следует отметить, что значение FFE0 всегда вычисляется из значений FFE-1 и FFE1.
В заключительной части этого примера используется настраиваемая модель Simulink и генерируются IBIS-AMI-совместимые исполняемые файлы модели DDR5, IBIS и AMI-файлы.
Откройте диспетчер Serdes IBIS-AMI.
На вкладке Export в диалоговом окне SerDes IBIS-AMI Manager:
Обновить имя модели Tx до ddr5_bc_tx.
Обновить имя модели Rx до ddr5_bc_rx.
Обратите внимание, что процент угла Tx и Rx равен 10. Это позволит масштабировать минимальные/максимальные угловые значения аналоговой модели на +/-10%.
Убедитесь, что для параметров модели Tx и Rx AMI выбрана двойная модель. Это создаст исполняемые файлы модели, которые поддерживают как статистический (Init), так и анализ во временной области (GetWave).
Установите биты модели Tx для игнорирования значения 3 поскольку в Tx FFE имеется три отвода.
Установите биты модели Rx для игнорирования значения 50000 чтобы дать достаточно времени для завершения обучения во время моделирования временной области.
Задайте для параметра Модели экспорт как Tx и Rx, чтобы все файлы были выбраны для создания (IBIS-файл, AMI-файлы и DLL-файлы).
Задайте имя файла IBIS как ddr5_bc_txrx.ibs
Дрожание может быть добавлено при необходимости на вкладках AMI-Tx и AMI-Rx.
Нажмите кнопку Экспорт (Export), чтобы создать модели в целевой папке.
Файлы 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 «Выкл». «Обучение» «Схождение» «Сбой» «Ошибка») на (List_Tip "Off" "Training").
Обратите внимание, что это не повлияет на работу модели, только для значений параметров, видимых пользователю.
Модели DDR5 передатчика и приемника IBIS-AMI теперь полностью укомплектованы и готовы к тестированию в любом модельном симуляторе AMI промышленного стандарта.
При моделировании с использованием этих моделей в симуляторе модели AMI промышленного стандарта следует учитывать следующие ограничения:
Предполагается, что эти модели будут выполняться как «согласованный набор» или с другими моделями AMI, которые были созданы с помощью SerDes Toolbox.
Эти модели не будут работать с AMI-моделями, созданными вне SerDes Toolbox. В частности, любая модель, использующая ключевые слова стандарта IBIS BCI_ *.
BCI_Protocol не поддерживается. Эти модели были жестко закодированы для протокола с именем «» DDRx_Write.
BCI_ID не поддерживается. Эти модели были жестко закодированы в BCI_ID с именем «bci_comm,», что означает, что каждое моделирование должно выполняться в отдельном каталоге, чтобы избежать конфликтов имен файлов во время моделирования.
Обучение по обратному каналу должно быть включено в обеих моделях, чтобы обучение было включено. Для этого установите для параметров BCI_State_ST значение «Training».
Для правильной работы эти модели должны быть запущены с размером блока 1024.
Эти модели будут правильно работать с любыми значениями пользовательского интерфейса или выборок на бит.
[1] Спецификация IBIS 7.0, https://ibis.org/ver7.0/ver7_0.pdf.
[2] Веб-сайт JEDEC, https://www.jedec.org/.
DFECDR | FFE | PassThrough | Конструктор SerDes | VGA