Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Некорректное симулирование Nios II системы на Cyclone III. Нужна момощь
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Shevnnov
Необходимо просимулировать 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 выводил информацию
Shevnnov
Народ, никто не сталкивался что ли с такой проблемой? Просто сейчас встала острая необходимость отсимулировать кокретный дизайн, т.к. при запуске на тестовой плате повоедение нестабильное. И хочется посмотреть вообще как и в какой последовательности там сигналы ходят.
Отладка надизайне от на Cyclone II из примеров к nios II ide не помогает, так как по другому собрана система и другие исп. компоненты (в частности DDR контроллер)
alexPec
Цитата(Shevnnov @ Nov 16 2010, 15:10) *
Народ, никто не сталкивался что ли с такой проблемой? Просто сейчас встала острая необходимость отсимулировать кокретный дизайн, т.к. при запуске на тестовой плате повоедение нестабильное. И хочется посмотреть вообще как и в какой последовательности там сигналы ходят.
Отладка надизайне от на Cyclone II из примеров к nios II ide не помогает, так как по другому собрана система и другие исп. компоненты (в частности DDR контроллер)

Пробовал собирать ниос, но "только для симуляции" не ставил, как обычно собрал, инициализировав внутреннюю память своей программой (мне хватило внутренней памяти), сначала был jtag uart, я не знал как его симулировать, на выходе были иксы, естессно. Убрал jtagdebug вообще, поставил нормальный UART - все симулировалось отлично, что ожидал, то и получил на выходе уарта, в т.ч. на gate-level.
Shevnnov
Хм. Интересное решение. Надо попробовать. Отпишусь о результатах. Только не понятно почему кроме jtag_uart остальное не активное у меня в проекте. Пробовал просто собирать систему на nios II под Cyclone III, используя только CPU, ddr контроллер, jtag_uart, pll и мой компонент
Shevnnov
Попробовал заменить jtag_uart на uart просто - толку нет. Есть подозрение, что почему то в память не инициализируется программа. Хотя команда mem_init_install выполняется в Nio II SBT. Как можно наверняка проинициализировать память?
Stewart Little
Цитата(Shevnnov @ Nov 22 2010, 14:00) *
Попробовал заменить jtag_uart на uart просто - толку нет. Есть подозрение, что почему то в память не инициализируется программа. Хотя команда mem_init_install выполняется в Nio II SBT. Как можно наверняка проинициализировать память?

Так эта... А файл с содержимым памяти, сгенерированный в SBT, у Вас в папку симулятора (<имя_проекта>_sim) переносится???
И еще - 14ms - это, ИМХО, слишком маленький интервал для симуляции. Сколько времени занимает выполнение стартап-кода?
Shevnnov
Ну ddr_sdram.dat файл обновляется при запуске проекта. Как ойенить стартап вермея?
НЕ знаю много или мало это. Но к примеру симуляция на 42ms заняла у меня 12 часов
Stewart Little
Цитата(Shevnnov @ Nov 22 2010, 14:59) *
Ну ddr_sdram.dat файл обновляется при запуске проекта. Как ойенить стартап вермея?
НЕ знаю много или мало это. Но к примеру симуляция на 42ms заняла у меня 12 часов

Пока, для простоты, откажитесь от SDRAM, и сделайте проект только с On-Chip RAM.
alexPec
Цитата(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!), и после этого симулирем в моделсиме. Вроде так делал.
Stewart Little
Цитата(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 или после)?
Shevnnov
Зачем квартус? Я сейчас пытаюсь запустить на ModelSim через NiosII SBT. Пока квартус проект не трогаю, используя только SOPC Builder, Nios II SBT и ModelSim
Stewart Little
Цитата(Shevnnov @ Nov 22 2010, 17:05) *
Зачем квартус? Я сейчас пытаюсь запустить на ModelSim через NiosII SBT. Пока квартус проект не трогаю, используя только SOPC Builder, Nios II SBT и ModelSim

Еще вопрос - на временной диаграмме (в окне wave), на линии av_write_n (jtag_uart'а) какая-нибудь активность наблюдается?
Shevnnov
Никакой - тишина и спокойствие, чтоб его!
Кстати, еще один вопрос. Столкунлся с еще одной проблемой. Как говориться если что-то не получается, а что-то работает, пока будем использовать работающее.
Для 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 (а есть разница до или после?)

Stewart Little
Цитата(Shevnnov @ Nov 22 2010, 18:41) *
Никакой - тишина и спокойствие, чтоб его!

Ну так это означает, что память не проинициализирована dat-файлом.
Проверяйте настройки SOPC Builder'а и настройки BSP в NiosII SBT.
После компиляции и получения dat- и sym-файлов убедитесь, что они переносятся в моделсимовскую папку (сравните их по размеру и времени создания, например).
Далее - как именно Вы запускаете ModelSim? В какой папке работаете? Исполняете ли сетаповский скрипт?

Цитата(Shevnnov @ Nov 22 2010, 18:41) *
...Но есть косяк с адресацией.

Первым делом проверьте Ваш ниосовский алгоритм и архитектуру Вашего периферийного устройства - нет ли косяков там.
Также можете открыть в ModelSim'е Memory List, выбрать там нужную память, и проверить, в те ли адреса и те ли данные Ваша система в эту память пишет.
Shevnnov
Цитата
Ну так это означает, что память не проинициализирована 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
Значит так. Прогресс есть, а именно какой:
Собрал систему под Cyclone III: cpu, onchip_mem(128Kb), jtag_uart. И где то на 3,7ms был получена ответ от jtag_uart (Запускалась тестовая программа Hello World). Это радует, но не синмает общей проблемы - а именно необходимости симуляции более сложной системы для проверки своего компонента.
Для этого я как понимаю нужно разобраться как заставить программу загружаться из памяти DDR. Для того проекта проверял - при выполнении mem_init_install файл ddr_sdram.dat обновляется. Но вот почему не работает при симуляции - остается загадкой.
Stewart Little
Еще раз проверил, уже с 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 никакой отсебятины в проект не вносит - что Вы ему подсовываете, то он и показывает.
Так что косяк я бы искал или в Вашем аппаратном проекте, или в Вашем ниосовском коде.
Kuzmi4
А никто не сталкивался с
Цитата
...
# ** Warning: (vsim-8598) Non-positive replication multiplier inside concat. Replication will be ignored
...

Что собственно с ним делать ?

До этого работал с 8.1сп1 - проблем не было вообсче, сейчас переполз на 10.0сп1 в симуляции сопц выскакивает такой варнинг.. На альтерафоруме нашёл упоминание такого варнинга, привязанное к timescale, но у меня она везьде 1ns/1ps..
Shevnnov
Цитата(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 не было. Сейчас
Stewart Little
Цитата(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.

Это еще плюс десяток миллисекунд.
Shevnnov
Урезал код путем использования укророченной версии драйверов, newC lib, отключение C++ до 54Кб. Так же отключил калибровку DDR. Но всё равно через 55ms ответа от jtag_uart не последовало (часов 10 продолжалась симуляция).
Ответ на 45us мне кажется чем-то нереальным.
Еще вопрос - посмотрел дизайн на Cyclone II на котором симулировалось всё. Там размер файла ddr.dat - 257Кб. Но выполнение тестовой программы начиналось на 410us.
vadimuzzz
Цитата(Shevnnov @ Nov 24 2010, 16:23) *
Но всё равно через 55ms ответа от jtag_uart не последовало (часов 10 продолжалась симуляция).

немного оффтопа, если позволите. а в чем выигрыш от такой симуляции? за 10 часов можно уйму тестов прогнать в сигналтапе на железе. я понимаю симуляцию на rtl-уровне, да и то, по большей части она имеет смысл для отдельных компонентов на предмет соответствия шинным спецификациям, например. а многочасовая симуляция нетлиста, да еще от стороннего производителя? не понимаю, зачем это.
Stewart Little
Цитата(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 !!!
Shevnnov
Переместив в Linker'е код программы в onchip memory и используя скоращенные версии библиотек и драйверов удалось добиться начала работы тестовой программы на 49us. Но если в Linker'е указать всё класть в память ddr (в предыдущем случае в ddr лежал только heap - в драйвере периферийного устройства используется динамическое выделение памяти), то время реакции много увеличивается, и повторяется пролема обсуждаемая выше. Это вероятно связано с большим временем доступа к ddr контроллеру в режиме симуляции.
По поводу выигрыга от такой симуляции - посмотреть как ведет себя компонент во взаимодействии со всей системой, потому что когда я пытаюсь запустить на тестовой плате, на часть тестов я получаю муру, а не результаты.

Цитата
Так весь вопрос в том и есть, а что эта программа делает???

Абсолютно то же самое, что и тестовая программа, которую я запускаю на Cyclone III дизайне
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.