В этом примере показано, как создать модели 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 контроллера 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 настраивается следующим образом:
Для параметра Symbol Time задано значение 208.3
ps, так как целевой уровень работы 4.8
Gbps для DDR5-4800.
Целевое BER установлено в 100e-18
.
Для сигнализации задано значение Single-ended
.
Выборки по символу и модуляции сохраняются на значениях по умолчанию, которые 16
и NRZ
(без возврата к нулю), соответственно.
Блок Tx_BCI Pass-Through является блоком, используемым для поддержки этой реализации обратного канала. Операция этого блока будет описываема ниже в этом примере.
Блок Tx FFE настраивается на одно предварительное касание, одно главное касание и одно последующее касание путем включения трех весов касания. Это делается с массивом [0 1 0], где основное касание задается самым большим значением в массиве. Области значений касаний будут добавлены позже в примере, когда модель экспортируется в Simulink.
Модель Tx AnalogOut настраивается так, чтобы Напряжение 1.1
V, Время нарастания 100
ps, R (выходное сопротивление) 50 o
hms, и C (емкость) 0.65
pF. Фактические аналоговые модели, используемые в конечной модели, будут сгенерированы позже в этом примере.
Потеря канала установлена на 5
dB, что типично для каналов DDR.
Импеданс с одним концом установлен в 40
ом.
Целевая частота устанавливается в 2.4
ГГц, который является частотой Nyquist для 4,8 ГГц
Модель 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 является блоком, используемым для поддержки этой реализации обратного канала. Операция этого блока будет описываема ниже в этом примере.
Нажмите кнопку Экспорт, чтобы экспортировать строение в Simulink для дальнейшей индивидуальной настройки и генерации исполняемых файлов модели AMI.
Эта часть примера берет систему SerDes, экспортированную приложением SerDes Designer, и настраивает ее по мере необходимости для DDR5 обратного канала операции в 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 в диалоговом окне 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 в диалоговом окне 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 в диалоговом окне 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 в диалоговом окне 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_BCI, когда включено обучение по заднему каналу, замените блок FFEParameter.TapWeights Constant на блок DataStoreRead. Этот datastore позволяет изменять значения отвода FFE во время симуляции и передавать их из каждого из блоков datapath.
Внутри подсистемы Tx щелкните на блоке FFE и введите Ctrl-U, чтобы заглянуть под маску блока FFE.
Удалите блок FFETapWeights Constant.
Добавьте блок DataStoreRead, помеченный BCIFFETapWeightsIn
.
Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: Tx_BCISignal
.
На вкладке Element Selection разверните Tx_BCISignal сигнала и подсветите FFE_Tapm1, FFE_Tap0
и FFE_Tap1
.
Нажмите кнопку Select > >, чтобы выбрать эти 3 элемента.
Сохраните изменения.
Добавьте блок Mux и установите количество входов 3, чтобы мультиплексировать эти три параметра в вектор для блока FFE.
Соедините выход блока Mux с входом TapWeights на FFE.
Окончательный блок FFE должен выглядеть следующим образом:
Введите Ctrl-D, чтобы скомпилировать модель и проверить на ошибки. Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически сгенерированных блоков хранилища данных, которые будут рассмотрены позже
Для определения качества заданного набора значений эквализации во время обучения в обратном канале будет использоваться напряжение, которое дискретизируется CDR в центре глаза для каждого символа. Это значение захватывается блоком DataStoreWrite так, чтобы его значение было доступно другим блокам управления BCI.
Внутри подсистемы Rx щелкните на блоке DFECDR и введите Ctrl-U, чтобы просмотреть под маской блока Rx DFECDR.
Откройте объект BusSelector
Выделите voltageSample из списка элементов в шине.
Щелкните Выбрать > >, чтобы переместить его в список Выбранных элементов.
Сохраните изменения.
Добавьте блок DataStoreWrite с меткой: CDR sample Voltage
Дважды кликните блок DataStoreWrite и установите имя хранилища данных равным: Rx_BCI_WriteSignal
на вкладке Parameters.
На вкладке Element Assignment разверните Rx_BCI_WriteSignal сигнала и подсветите sampleVoltage.
Нажмите кнопку Select > >, чтобы выбрать этот элемент.
Сохраните изменения.
Подключите выход voltageSample BusSelector к входу нового блока DataStoreWrite.
Этот фрагмент блока DFECDR должна выглядеть следующим образом:
Введите Ctrl-D, чтобы скомпилировать модель и проверить на ошибки. Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически сгенерированных блоков хранилища данных, которые будут рассмотрены позже
Во время обучения в обратном канале режимы 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.
Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: Rx_BCI_WriteSignal
.
На вкладке Element Selection разверните Rx_BCI_WriteSignal сигнала и подсветите BCI_State_ST.
Нажмите кнопку Select > >, чтобы выбрать этот элемент.
Сохраните изменения.
Подключите эти новые блоки, как показано на рисунке. Окончательный блок DFECDR должен выглядеть следующим образом:
Введите Ctrl-D, чтобы скомпилировать модель и проверить на ошибки. Можно игнорировать любые предупреждения для несвязанных блоков. Это происходит из-за автоматически сгенерированных блоков хранилища данных, которые будут рассмотрены позже
Функция 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 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_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:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime"
.
Измените возможности данных из Signal
на Parameter
.
Повторите этот процесс для SampleInterval.
Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
Тип данных для выходов этой функции, samsungCount и uiCount, по умолчанию имеют значение Inherit. Поскольку этот функциональный блок создает значения для этих двух параметров, их тип данных должен быть явно определен вместо того, чтобы определяться на основе эвристики. Чтобы явным образом определить типы данных для этих двух параметров:
Откройте Simulink Model Explorer и перейдите к разделу Tx- > Tx _ BCI- > Counter.
Подсветите параметр samsungCount.
Обновите тип из Inherit в int32
и нажмите Применить.
Повторите этот процесс для uiCount.
Добавьте другой новый блок MATLAB function и установите метку на txBackChannel
. Этот блок MATLAB function используется для управления обратным процессом обучения. Содержимое этой функции будет рассмотрено позже в этом примере. Однако для завершения подключения Tx_BCI блоков необходимо отобразить все правильные узлы. Чтобы включить это:
Дважды кликните Блок MATLAB function txBackChannel, чтобы открыть его в редакторе MATLAB.
Удалите все содержимое по умолчанию.
Вставьте следующую сигнатуру функции:
function [tapWeightsOut, BCIStateOut] = txBCtraining(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)
Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются от Рабочего пространства Модели и, следовательно, не должны отображаться как узлы на блоке MATLAB function. Чтобы удалить эти узлы из блока MATLAB function:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime"
.
Измените возможности данных из Signal
на Parameter
.
Повторите этот процесс для SampleInterval.
Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
Соедините все вместе, как показано ниже:
Блок Rx_BCI_Read используется, чтобы считать значения параметров Rx, запрошенные блоком Tx_BCI, и задать эти значения для следующего обратного цикла обучения канала. Если Tx_BCI блок сигнализирует, что обучение завершено, этот блок устанавливает окончательные значения, которые будут использоваться для оставшейся части симуляции.
Первым шагом является настройка блока Rx_BCI_Read для операции в обратном канале. Блок MATLAB function, который управляет операцией блока Rx_BCI_Read, записан позже в примере.
Посмотрите под маску в блоке Rx_BCI_Read.
Удалите системный объект Pass-Through, так как он не будет использоваться. Обязательно подключите входной порт к выходному порту.
Добавьте блок DataStoreRead, помеченный DFECDRTapWeightsIn
Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: DFECDRSignal
.
На вкладке Element Selection разверните сигнал DFECDRSignal и подсветите TapWeights [1,4]
.
Нажмите кнопку Select > >, чтобы выбрать этот элемент.
Сохраните изменения.
Добавьте блок DataStoreRead, помеченный RxBCIStateIn
Дважды кликните блок DataStoreRead и установите имя хранилища данных равным: Rx_BCI_WriteSignal
.
На вкладке Element Selection разверните Rx_BCI_WriteSignal сигнала и подсветите BCI_State_ST
.
Нажмите кнопку Select > >, чтобы выбрать этот элемент.
Сохраните изменения.
Добавьте блок DataStoreWrite, помеченный RxBCIStateOut
Дважды кликните блок DataStoreWrite и установите имя хранилища данных равным: Rx_BCI_WriteSignal
.
На вкладке Element Assignment разверните Rx_BCI_WriteSignal сигнала и подсветите BCI_State_ST
.
Нажмите кнопку Select > >, чтобы выбрать этот элемент.
Сохраните изменения.
Добавьте блок DataStoreWrite, помеченный DFECDRTapWeightsOut
Дважды кликните блок DataStoreWrite и установите имя хранилища данных равным: DFECDRSignal
.
На вкладке Element Assignment разверните сигнал DFECDRSignal и подсветите TapWeights [1,4]
.
Нажмите кнопку Select > >, чтобы выбрать этот элемент.
Сохраните изменения.
Скопируйте функциональный блок Counter MATLAB из блока Tx Tx_BCI в этот блок.
Добавьте новый блок MATLAB function и установите метку равной rxBackChannelRead
. Этот блок MATLAB function используется для управления обратным процессом обучения. Содержимое этой функции будет рассмотрено позже в этом примере. Однако для завершения подключения Rx_BCI_Read блоков необходимо отобразить все правильные узлы. Чтобы включить это:
Дважды кликните Блок MATLAB function rxBackChannelRead, чтобы открыть его в редакторе MATLAB.
Удалите все содержимое по умолчанию.
Вставьте следующую сигнатуру функции:
function [BCIStateOut, tapWeightsOut] = rxBCtrainingRead(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)
Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются от Рабочего пространства Модели и, следовательно, не должны отображаться как узлы на блоке MATLAB function. Чтобы удалить эти узлы из блока MATLAB function:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime"
.
Измените возможности данных из Signal
на Parameter
.
Повторите этот процесс для SampleInterval.
Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
Соедините все вместе, как показано ниже:
Блок Rx_BCI_Write используется в конце каждого цикла обучения обратного канала, чтобы вычислить текущие метрики глаза и сообщить эти метрики обратно в блок Tx_BCI для анализа.
Первым шагом является настройка блока Rx_BCI_Write для операции в обратном канале. Блок MATLAB function, который управляет операцией блока Rx_BCI_Write, записан позже в примере.
Посмотрите под маску в блоке Rx_BCI_Write. Вы должны 4 автоматически сгенерировать блоки чтения/записи Datastore.
Удалите системный объект Pass-Through, так как он не используется. Обязательно подключите входной порт к выходному порту.
Удалите маркированный блок DataStoreWrite sampleVoltage
напишите. Он не будет использоваться.
Добавьте блок DataStoreRead, помеченный DFECDRTapWeightsIn
.
Дважды кликните блок DataStoreRead и установите имя хранилища данных равным DFECDRSignal
.
На вкладке Element Selection разверните сигнал DFECDRSignal и подсветите TapWeights
[1,4]
.
Нажмите кнопку Select > >, чтобы выбрать этот элемент.
Сохраните изменения.
Скопируйте функциональный блок Counter MATLAB из блока Tx Tx_BCI в этот блок.
Добавьте новый блок MATLAB function и установите метку равной rxBackChannelWrite
. Этот блок MATLAB function используется для управления обратным процессом обучения. Содержимое этой функции будет рассмотрено позже в этом примере. Однако для завершения подключения Rx_BCI_Write блоков необходимо отобразить все правильные узлы. Чтобы включить это:
Дважды кликните Блок MATLAB function rxBackChannelWrite, чтобы открыть его в редакторе MATLAB.
Удалите все содержимое по умолчанию.
Вставьте следующую сигнатуру функции:
function BCIStateOut = rxBCtrainingWrite(sampleV, tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)
Значения для двух входов этой функции, SymbolTime и SampleInterval, наследуются от Рабочего пространства Модели и, следовательно, не должны отображаться как узлы на блоке MATLAB function. Чтобы удалить эти узлы из блока MATLAB function:
Сохраните функцию MATLAB.
В сигнатуре функции MATLAB подсвечивайте параметр SymbolTime.
Щелкните правой кнопкой мыши по параметру и выберите Data Scope for "SymbolTime"
.
Измените возможности данных из Signal
на Parameter
.
Повторите этот процесс для SampleInterval.
Когда вы сохраняете функцию MATLAB, вы должны увидеть, что эти два входных параметра были удалены из функционального блока на холсте Simulink.
Соедините все вместе, как показано ниже:
Блок Tx_BCI используется для управления всем процессом обучения в обратном канале. Первый раз через него инициализируются все параметры Tx и Rx, которые будут оптимизированы во время обучения. После каждого цикла обучения в обратном канале этот блок читает текущую метрику глаза, поставляемую Rx, хранит это значение, затем обновляет параметры Tx и Rx для следующего прохода. Когда обучение завершает это блочное завершение обучения, устанавливает все параметры Tx и Rx на их оптимальные значения и затем возвращает модели к регулярной операции.
Блок Tx_BCI был настроен для операции в обратном канале ранее в этом примере. Теперь вы создадите блок MATLAB function в основе блока Tx_BCI. Этот блок MATLAB function, который был помечен txBackChannel
, управляет всем процессом обучения в обратном канале. В этом процессе участвуют следующие шаги:
Определите сигнатуру функции
Инициализируйте параметры и установите постоянные переменные
Определите параметры, которые будут протянуты, и их области значений
При первом вызове GetWave настройте начальные значения параметров для Tx и Rx
Каждый цикл обучения в обратном канале считывает метрики глаза, вычисленные Rx, и решает, что делать дальше. Когда обучение завершает сигнал завершения обучения, выводите оптимальные значения параметров Tx и Rx, которые будут использоваться во время симуляции, и записывайте эти окончательные значения в файл журнала.
Установите соответствующее состояние обучения и выведите параметры 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);
Когда обучение включено, самый первый вызов этой функции 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, затем эти результаты записываются в файл журнала связи с обратным каналом. В алгоритм настройки используются следующие шаги:
Протяните все значения предтекста FFE и определите, какое значение приводит к наибольшему открытию глаза.
Протяните все значения FFE после тапа и определите, какое значение приводит к наибольшему открытию глаза.
Протяните все значения отвода 1 DFE и определите, какое значение приводит к наибольшему открытию глаза.
Протяните все значения DFE tap 2 и определите, какое значение приводит к наибольшему открытию глаза.
Протяните все значения отвода DFE 3 и определите, какое значение приводит к наибольшему открытию глаза.
Протяните все значения DFE tap 4 и определите, какое значение приводит к наибольшему открытию глаза.
Когда обучение будет завершено, смените состояние на «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.
Блок Rx_BCI_Read используется, чтобы считать значения параметров Rx, запрошенные блоком Tx_BCI, и задать их для следующего обратного цикла обучения. Если Tx_BCI блок сигнализирует, что обучение завершено, этот блок устанавливает окончательные значения, которые будут использоваться Rx для оставшейся части симуляции.
Блок Rx_BCI_Read был настроен для операции в обратном канале ранее в этом примере. Теперь создайте блок MATLAB function в центре блока Rx_BCI_Read. Этот блок MATLAB function, который был помечен rxBCtrainingRead
, устанавливает значения Rx DFE, которые будут использоваться. В этом процессе участвуют следующие шаги:
Определите сигнатуру функции.
Инициализируйте параметры и установите постоянные переменные.
При первом вызове GetWave и в начале каждого обратного цикла обучения считывайте значения отвода Rx DFE, которые используются, как задано алгоритмом настройки обратного канала Tx.
Установите соответствующее состояние обучения и выведите параметры 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
Когда обучение включено, при самом первом вызове этой функции 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.
Блок Rx_BCI_Write используется в конце каждого цикла обучения обратного канала, чтобы вычислить текущие метрики глаза и сообщить эти метрики обратно в блок Tx_BCI для анализа.
Блок Rx_BCI_Write был настроен для операции в обратном канале ранее в этом примере. Теперь будет создан блок MATLAB function в центре блока Rx_BCI_Write. Этот блок MATLAB function, который мы пометили rxBCtrainingWrite
, вычисляет минимальную высоту глаз последних 127 бит и запишет эти значения в файл связи обратного канала и файл журнала. В этом процессе участвуют следующие шаги:
Определите сигнатуру функции.
Инициализируйте параметры и установите постоянные переменные.
Сохраните вектор напряжений, которые будут использоваться при вычислении минимальной высоты глаза.
В конце каждого цикла обучения обратного канала вычислите минимальную высоту глаза и запишите ее в файл связи обратного канала.
Обновите состояние обучения.
В следующих разделах рассматривается код, используемый в Блок 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
чтобы позволить обратному алгоритму настройки завершить время.
Запустите модель. Во время работы модели наблюдайте изменение формы волны во временном интервале, когда каждая из настроек касания протянута. Когда симуляция завершена, файл связи с обратным каналом, 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.
Заключительная часть этого примера берет настроенную модель 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.
Файлы 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")
.
Обратите внимание, что это не повлияет на операцию модели, только на значения параметров, видимые пользователю.
Модели 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/.
DFECDR | FFE | PassThrough | SerDes Designer | VGA