|
Некорректное симулирование Nios II системы на Cyclone III. Нужна момощь |
|
|
|
Apr 8 2010, 08:48
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498

|
Необходимо просимулировать Sopc систему в ModelSim. Документацию по этому на сайте Альтеры прочитал, AN351 выполнил - всё вроде хорошо было. Сейчас надо необходимо сделать тоже самое на cycloneIII embedded evaluation kit, который шел вместе с с платой. НА основе sopcinfo файла создаю BSP библиотеку (с пометкой "только дял симуляции", stdin stdout - через jtag_uart) и стандартое hello world приложение. ЗАпускаю проект на"ios II Modelsim", открывается окно - стандартно компилируется дизайн, запускаю. Процессор, память симмулируются, другие модули вроде тоже. ТОлько jtag_uart модуль БЕЗДЕЙСТВУЕТ, хотя должен по идеи выводить "Hello world". Использую в работе Quartus 9.1 и Nios II SBT, ModelSim 6.5b. Такое проведение связки printf и jtag_uart замечено только на kit'овой библиотеке от платы CycloneIII. Тоже самое делал на стандартнйо kit'овой библиотеке niosII_cycloneII_2c35, которую можно найти в папке nios2eds\examples - проблем никаких не наблюдал. jtag_uart выводил информацию
|
|
|
|
|
Nov 19 2010, 20:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Shevnnov @ Nov 16 2010, 15:10)  Народ, никто не сталкивался что ли с такой проблемой? Просто сейчас встала острая необходимость отсимулировать кокретный дизайн, т.к. при запуске на тестовой плате повоедение нестабильное. И хочется посмотреть вообще как и в какой последовательности там сигналы ходят. Отладка надизайне от на Cyclone II из примеров к nios II ide не помогает, так как по другому собрана система и другие исп. компоненты (в частности DDR контроллер) Пробовал собирать ниос, но "только для симуляции" не ставил, как обычно собрал, инициализировав внутреннюю память своей программой (мне хватило внутренней памяти), сначала был jtag uart, я не знал как его симулировать, на выходе были иксы, естессно. Убрал jtagdebug вообще, поставил нормальный UART - все симулировалось отлично, что ожидал, то и получил на выходе уарта, в т.ч. на gate-level.
|
|
|
|
|
Nov 22 2010, 13:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Stewart Little @ Nov 22 2010, 15:10)  Пока, для простоты, откажитесь от SDRAM, и сделайте проект только с On-Chip RAM. Да можно и с ддр, наверно, но чтоб программа в ончип памяти располагалась, ну по крайней мере тест какой-нибудь, который в короткое время сделает то что вы хотите посмотреть. Посмотрел в квартусе проект свой, в сопц билдере когда тыкаешь на on chip memory в вылетающем окошке написано Memory will be initialized from onchip_memory2_0.hex. Когда соберете сопц, там этот файл будет(он его сам создает), только пустой. А после делаем elf файл, конвертируем утилитой elf2hex (так вроде называется), этим хексом инициализируем память. Устанавливаем вектор сброса на ончип рам, собираем проект в квартусе (без jtag_debug и jtag_uart!), и после этого симулирем в моделсиме. Вроде так делал.
|
|
|
|
|
Nov 22 2010, 14:04
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(alexPec @ Nov 22 2010, 16:10)  Да можно и с ддр, наверно, но чтоб программа в ончип памяти располагалась, ну по крайней мере тест какой-нибудь, который в короткое время сделает то что вы хотите посмотреть. Посмотрел в квартусе проект свой, в сопц билдере когда тыкаешь на on chip memory в вылетающем окошке написано Memory will be initialized from onchip_memory2_0.hex. Когда соберете сопц, там этот файл будет(он его сам создает), только пустой. А после делаем elf файл, конвертируем утилитой elf2hex (так вроде называется), этим хексом инициализируем память. Устанавливаем вектор сброса на ончип рам, собираем проект в квартусе (без jtag_debug и jtag_uart!), и после этого симулирем в моделсиме. Вроде так делал. Это все делается автоматически, если в SOPC'е указана необходимость симуляции, и в NiosII SBT получен таргет для mem_init_install. Только что вот проверил (проект: niosII economy + onchip_ram + jtag_uart) - все симулируется как положено, в лог "Hello from Nios II!" выводится...  Еще вопросы - в SOPC Builder'е, в свойствах JTAG-UART какие сделаны установки симуляции? Макрос jtag_uart_log в какой момент запускается (до открытия окна wave или после)?
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Nov 22 2010, 15:41
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498

|
Никакой - тишина и спокойствие, чтоб его! Кстати, еще один вопрос. Столкунлся с еще одной проблемой. Как говориться если что-то не получается, а что-то работает, пока будем использовать работающее. Для Cyclone II создал систему структуры, схожей с той, что не запускалсь для Cyclone III. Jtag работает, программа тоже выполняется. Но есть косяк с адресацией. Расшифрую: драйвер моего компонента в этой системе работает следующим образом - тестова программа командой malloc выделяет область памяти, помещает туда данные и передает компоненту этот адрес. Компонент же с помощью интерфейса Avalon MM Master считывает по полученному адресу данные. Но при обращении компоненту по данному адресу readdata оказываетя равным 32'bx. Схема моей системы - в приложении. Цитата(Stewart Little @ Nov 22 2010, 17:04)  Это все делается автоматически, если в SOPC'е указана необходимость симуляции, и в NiosII SBT получен таргет для mem_init_install. Только что вот проверил (проект: niosII economy + onchip_ram + jtag_uart) - все симулируется как положено, в лог "Hello from Nios II!" выводится...
Еще вопросы - в SOPC Builder'е, в свойствах JTAG-UART какие сделаны установки симуляции? Макрос jtag_uart_log в какой момент запускается (до открытия окна wave или после)? Система создавалась для CycloneIII device family, jtag_uart запускаю после открытия окна wave (а есть разница до или после?)
Сообщение отредактировал Shevnnov - Nov 22 2010, 15:37
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 22 2010, 15:56
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(Shevnnov @ Nov 22 2010, 18:41)  Никакой - тишина и спокойствие, чтоб его! Ну так это означает, что память не проинициализирована dat-файлом. Проверяйте настройки SOPC Builder'а и настройки BSP в NiosII SBT. После компиляции и получения dat- и sym-файлов убедитесь, что они переносятся в моделсимовскую папку (сравните их по размеру и времени создания, например). Далее - как именно Вы запускаете ModelSim? В какой папке работаете? Исполняете ли сетаповский скрипт? Цитата(Shevnnov @ Nov 22 2010, 18:41)  ...Но есть косяк с адресацией. Первым делом проверьте Ваш ниосовский алгоритм и архитектуру Вашего периферийного устройства - нет ли косяков там. Также можете открыть в ModelSim'е Memory List, выбрать там нужную память, и проверить, в те ли адреса и те ли данные Ваша система в эту память пишет.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Nov 22 2010, 17:42
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498

|
Цитата Ну так это означает, что память не проинициализирована dat-файлом. Проверяйте настройки SOPC Builder'а и настройки BSP в NiosII SBT. После компиляции и получения dat- и sym-файлов убедитесь, что они переносятся в моделсимовскую папку (сравните их по размеру и времени создания, например). Далее - как именно Вы запускаете ModelSim? В какой папке работаете? Исполняете ли сетаповский скрипт? Какие настройки нужно проверить? В BSP ставлю галку напротив enable_sim_optimize, stdin,stdout и stderr направлены на jtag_uart. ModelSim запускаю из Nios II SBT нажимая на Run "ModelSim Configuration" (файл указан RUN_ON_HDL_SIMULATOR_ONLY_hello_test.elf). Соответственно рабочая папка у ModelSim'a <project_folder>/niosII_cycloneII_mac_sopc_sim . Симуляцию выполняю через скрипт соответсвующими ключами "s", "w", "jtag_uart_log" и run 1ms Цитата(Stewart Little @ Nov 22 2010, 18:56)  Первым делом проверьте Ваш ниосовский алгоритм и архитектуру Вашего периферийного устройства - нет ли косяков там. Также можете открыть в ModelSim'е Memory List, выбрать там нужную память, и проверить, в те ли адреса и те ли данные Ваша система в эту память пишет. С компонентом и архитектуры перефирийного устройства косяков не должно бы быть, так как работая в аналогичной системе, но без использвоания Clock-Crossing Bridge (такая система приведена в папке примеров для NiosII_cycloneII_2c35) работало всё корректно. В Memory List смотрел - адреса вроде те (ну во всяком случае из пула отведенного под ddr)
Сообщение отредактировал Shevnnov - Nov 22 2010, 17:58
|
|
|
|
|
Nov 23 2010, 12:07
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Еще раз проверил, уже с DDR-контроллером. Все работает (см. аттач)! Скорее всего, Вы просто не дожидаетесь начала вывода в JTAG UART. Цитата(Shevnnov @ Nov 22 2010, 20:42)  Какие настройки нужно проверить? В BSP ставлю галку ... Вопрос - какой размер кода у вас получается? Попробуйте его сократить до минимума. Вы какую версию драйверов используете - полную или сокращенную? Использование сокращенной версии позволяет сжать код раз в несколько. Если Вы используете полную версию драйверов, то для себя еще раз попробуйте оценить, сколько времени будет выполняться startup-код - у Вас весьма изрядный объем памяти, в ней есть сегмент BSS, в стартапе он заполняется нулями - сколько это потребует времени??) Также проверьте "железную" сторону : - какая опция симуляции установлена для JTAG_UART? - у меня выдача ASCII - какая опция калибровки для режима симуляции установлена для контроллера DDR? - у меня Skip Calibration - на какой тактовой частоте работает ниос? - у меня 100 МГц, ядро Standard. В моем примере выдача в JTAG_UART начинается примерно на сорок шестой микросекунде от начала моделирования. Цитата(Shevnnov @ Nov 22 2010, 20:42)  С компонентом и архитектуры перефирийного устройства косяков не должно бы быть, так как работая в аналогичной системе, но без использвоания Clock-Crossing Bridge ... ModelSim никакой отсебятины в проект не вносит - что Вы ему подсовываете, то он и показывает. Так что косяк я бы искал или в Вашем аппаратном проекте, или в Вашем ниосовском коде.
Эскизы прикрепленных изображений
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Nov 23 2010, 13:37
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498

|
Цитата(Stewart Little @ Nov 23 2010, 15:07)  Вопрос - какой размер кода у вас получается? Попробуйте его сократить до минимума. Вы какую версию драйверов используете - полную или сокращенную? Использование сокращенной версии позволяет сжать код раз в несколько. Если Вы используете полную версию драйверов, то для себя еще раз попробуйте оценить, сколько времени будет выполняться startup-код - у Вас весьма изрядный объем памяти, в ней есть сегмент BSS, в стартапе он заполняется нулями - сколько это потребует времени??) Размер кода, если оценивать по размеру файла памяти - 234 Kбайта (это е код hello_world, а тестовая программа для перефирийного компонента). Версия драйверов - полная. Поддержка C++ отключена. По поводу аремени оценки - не знаю как оценить, был бы признателен на ссылку на соответствующую литературу. Цитата Также проверьте "железную" сторону : - какая опция симуляции установлена для JTAG_UART? - у меня выдача ASCII - какая опция калибровки для режима симуляции установлена для контроллера DDR? - у меня Skip Calibration - на какой тактовой частоте работает ниос? - у меня 100 МГц, ядро Standard. В моем примере выдача в JTAG_UART начинается примерно на сорок шестой микросекунде от начала моделирования. JTAG_UARY - так же выдача в ASCII. Частота процессора - 100Мгц. У DDR стояла калиброка - Quick Calibration. По поводу времени выдачи - вечра ставил сумуляцию на 30 милесекунд - вывода через jtag не было. Сейчас
|
|
|
|
|
Nov 23 2010, 13:48
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(Shevnnov @ Nov 23 2010, 16:37)  Размер кода, если оценивать по размеру файла памяти - 234 Kбайта Это же можно опупеть от ожидания, пока 234 килобайта кода отсимулируются! Причем львиная доля этого кода, я подозреваю, это стартап. Цитата(Shevnnov @ Nov 23 2010, 16:37)  По поводу аремени оценки - не знаю как оценить, был бы признателен на ссылку на соответствующую литературу. Какую, нахрен, литературу! Смотрите размер области BSS, смотрите, сколько времени нужно за запись одного слова в DDR SDRAM, умножайте первое на второе, и получите время заливки BSS нулями. Цитата(Shevnnov @ Nov 23 2010, 16:37)  DDR стояла калиброка - Quick Calibration. Это еще плюс десяток миллисекунд.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Nov 24 2010, 11:58
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(Shevnnov @ Nov 24 2010, 13:23)  Урезал код путем использования укророченной версии драйверов, newC lib, отключение C++ до 54Кб. Так же отключил калибровку DDR. Но всё равно через 55ms ответа от jtag_uart не последовало (часов 10 продолжалась симуляция). Ответ на 45us мне кажется чем-то нереальным. 54 кб - это тоже не мало. У меня объем кода 528 байт. А весь код состоит из Код #include "sys/alt_stdio.h"
int main() { alt_putstr("Hello from Nios II!\n"); while (1);
return 0; } Цитата(Shevnnov @ Nov 24 2010, 13:23)  Еще вопрос - посмотрел дизайн на Cyclone II на котором симулировалось всё. Там размер файла ddr.dat - 257Кб. Но выполнение тестовой программы начиналось на 410us. Так весь вопрос в том и есть, а что эта программа делает??? Цитата(vadimuzzz @ Nov 24 2010, 13:33)  а в чем выигрыш от такой симуляции? а многочасовая симуляция нетлиста, да еще от стороннего производителя? не понимаю, зачем это. +100 !!!
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
Nov 29 2010, 11:10
|

Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498

|
Переместив в Linker'е код программы в onchip memory и используя скоращенные версии библиотек и драйверов удалось добиться начала работы тестовой программы на 49us. Но если в Linker'е указать всё класть в память ddr (в предыдущем случае в ddr лежал только heap - в драйвере периферийного устройства используется динамическое выделение памяти), то время реакции много увеличивается, и повторяется пролема обсуждаемая выше. Это вероятно связано с большим временем доступа к ddr контроллеру в режиме симуляции. По поводу выигрыга от такой симуляции - посмотреть как ведет себя компонент во взаимодействии со всей системой, потому что когда я пытаюсь запустить на тестовой плате, на часть тестов я получаю муру, а не результаты. Цитата Так весь вопрос в том и есть, а что эта программа делает??? Абсолютно то же самое, что и тестовая программа, которую я запускаю на Cyclone III дизайне
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|