Что-то с памятью моей стало…

Comment are off

Какая досада! Выход новой прошивки неожиданно задерживается. Подвела нас оперативная память — при работе с микросхемой SDRAM Марсохода2 возникли неожиданные проблемы. Но обо всём по порядку. В качестве контроллера SDRAM нами было использовано вот это устройство — http://marsohod.org/index.php/ourblog/11-blog/281-sdramvhdl. Контроллер реализован на языке VHDL, но он очень легко интегрировался в Verilog проект. Результат интеграции контроллера в наш проект дал следующий результат:

flow_summary

Заливаем прошвику в плату Марсоход2 и после окончания заливки на экране терминала видим следуюший результат.

BootUp_20150110

Текст в терминале в рамке это меню, с помощью которого можно выполнить простейшие команды. Это меню является интерфейсом базовой системы ввоода/вывода нашей системы-на-кристалле. Нажате клавиши ‘1’ переводит устройство в режим приёма файла по протоколу X-модем. Вывод строки Start X-Moddem receive сообщает нам о готовности приёма данных.

Используем терминал Tera Term:
Load_IMAGE_sample
Если после появления надписи «Start X-Moddem receive» ничего не делать и смотреть на экран, то, недождавшись данных, приёмник по таймауту перейдёт в отладочный режим. Попытаться исправить ситуацию можно нажатием клавиши ‘g’ в терминале. Таймаут так же может произойти если долго выбирать файл для передачи. Таймаут достаточно мал, поэтому лучше поторопиться при выборе файла. К слову сказать, отладчик вовсе не программный, а аппаратный — отладчик переводит процессор в пошаговый режим и выводит информацию о состоянии шины адреса, шин входящих и исходящий данных, а также об управляющих сигналах процессора. Помимо нажатия клавиши ‘g’ в терминале, для выхода из режима пошаговой отладки можно использовать клавишу сброса, которая инициализирует устройство и выведет главное меню базовой системы ввода/вывода (BIOS меню).

Итак, устройство ожидает приёма файла. С помощью меню в Tera Term выбираем передачу файла про протоколу X-Modem:
Upload_in_TerraTerm

Выбираем файл для загрузки в устройство (не забываем о таймауте — лучше хранить загрузочный файл поблизости):
Select Firmware

Загрузка образа test_ram займёт меньше секунда, при этом BIOS уведомит об успешной или неуспешной загрузке. После удачной загрузки файла, передаём ему управлание c помощью нажатия клавиши ‘2’ в главно меню BIOS. При этом управление передаётся загруженному файлу, а поскольку загружена программа test_ram, то будет произведён начальный тест памяти и появится строка контекстного меню. Нажатие клавиши ‘6’ выводит дамп памяти с адреса 0x20000 и отображает новое контекстное меню как показано на следующем рисунке:
SDRAM_test_fail

 

Вместо программы test_ram можно загрузить другую программу, текст, ansi-картинку или сырые биинарные данные. Из главного меню BIOS с помощью протокола X-modem загружается файл по адресу 0x10000. Размер файла ограничен несколькими килобайтами. Любые операции над любыми файлами производятся без анализа их содержимого. Это значит что можно передать управление тексту или стучайным неструктурированным данным. В этом случае устройство передёт в отладочный режим при первой ошибочной ситуации — неизвестной инструкции или по обращению к несуществующему региону памяти.

Вообще-то этой статьи не должно было быть — вместо неё должна была появиться статья с новой прошивкой, отчётом об успехе и ребрендинге продукта. Но вглянувшись внимательно в последнюю картинку можно догадаться, почему статья попала в блог, а не в раздел новостей и почему её нет на главной странице — всё дело в нестабильной работе памяти SDRAM, расположенной на микросхеме рядом c FPGA.

Первое, что бросается в глаза, это ошибка чтения паттерна:
00020074 FEDCABB5 FEDCABF5 — read pattern Error

Первое число это адрес ошибки, второе число это паттерн, третье число читается из внешней памяти и оно должно совпадать с ранее записанным паттерном. Судя по дампу, прочиталось правильное значение, а вот значение самого паттерна в момент сравнения разрушено, о чём можно судить по дампу этого региона памяти.
При этом из дампа видно что сбой памяти происходит ранее, например, по адресу 0x2001c расположено число 0xFEDCABDF вместо положенного 0xFEDCAB9F. При этом начальный паттерн-тест не распознал эту ошибку.

Во всей этой истории смущает неправильное значение паттерна.

Архив с проблемной прошивкой и программой test_ram — https://everest.l4os.ru/download/soc_for_marsohod_bug_20150109.zip


Оставить комментарий