Maratz 0 10 ноября, 2016 Опубликовано 10 ноября, 2016 · Жалоба Здравствуйте. Сильно не бейте, пожалуйста, только приступил к изучению Verilog'а. (Да, в дальнейшем собираюсь на СВ, пока нет возможности, потому что работаю в ISE). Собственно, вопросы у меня по памятям: 1. Для того, чтобы инициализировать массив нулями в VHDL достаточно было указать :=(others => (others => '0)); В Verilog я нашел очень удобную инициализацию файлом, умеренно удобную циклом и неудобную ручками. Но файл каждый раз подключать лень, указывать каждый раз размеры массива в цикле - увеличивается вероятность ошибиться. Есть ли какой-то универсальный метод, как вышеуказанный VHDL'ный? 2. Создал массив, инициализировал файлом. Из массива данные только вычитываются, поэтому массив распознается компилятором как ПЗУ и выводит warning, сообщающий об этом. Некритично, но неприятно. В VHDL можно было указать, что массив - не сигнал, а константа. Что можно сделать в Verilog? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 10 ноября, 2016 Опубликовано 10 ноября, 2016 · Жалоба Здравствуйте. Сильно не бейте, пожалуйста, только приступил к изучению Verilog'а. (Да, в дальнейшем собираюсь на СВ, пока нет возможности, потому что работаю в ISE). Собственно, вопросы у меня по памятям: 1. Для того, чтобы инициализировать массив нулями в VHDL достаточно было указать :=(others => (others => '0)); В Verilog я нашел очень удобную инициализацию файлом, умеренно удобную циклом и неудобную ручками. Но файл каждый раз подключать лень, указывать каждый раз размеры массива в цикле - увеличивается вероятность ошибиться. Есть ли какой-то универсальный метод, как вышеуказанный VHDL'ный? 2. Создал массив, инициализировал файлом. Из массива данные только вычитываются, поэтому массив распознается компилятором как ПЗУ и выводит warning, сообщающий об этом. Некритично, но неприятно. В VHDL можно было указать, что массив - не сигнал, а константа. Что можно сделать в Verilog? Спасибо. Ну, во первых есть параметры. И они указываются один раз на весь проект. Зачем нужно что-то "инициализировать", Если это не пустой массив, то туда будет сначала что-то писаться и только потом читаться... И при загрузке конфигурации в распределенной памяти и так будут нули. А блочную память - да из файла... И это не проблема... Во-вторых фраза: "как ПЗУ .... Некритично, но неприятно" - ну это просто смешно... А как организовывать массив констант по-вашему? на логике или на триггерах, если есть свободные блоки памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maratz 0 10 ноября, 2016 Опубликовано 10 ноября, 2016 · Жалоба Извините, не хочу показаться неблагодарным, но вопрос был в том, знает ли кто-нибудь еще какие-то методы инициализации. То, почему мне не хватает этих - ну это мои заморочки. Ну, во первых есть параметры. И они указываются один раз на весь проект. Параметры удобны, но надо не забывать их менять. А директива others=>others=> '0' вообще ни к чему не привязана, я про это. Зачем нужно что-то "инициализировать", Если это не пустой массив, то туда будет сначала что-то писаться и только потом читаться... Затем, что неинициализированный массив выдает неопределенность 'U' и отладка в ISim превращается в сущий ад. Во-вторых фраза: "как ПЗУ .... Некритично, но неприятно" - ну это просто смешно... А как организовывать массив констант по-вашему? на логике или на триггерах, если есть свободные блоки памяти? Ну массив и задумывался, как ПЗУ на блочной памяти. Я хочу сообщить об этом компилятору, но не знаю как. Если вы знаете, подскажите пожалуйста, буду признателен) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 10 ноября, 2016 Опубликовано 10 ноября, 2016 · Жалоба Параметры удобны, но надо не забывать их менять. А директива others=>others=> '0' вообще ни к чему не привязана, я про это. Затем, что неинициализированный массив выдает неопределенность 'U' и отладка в ISim превращается в сущий ад. Ну массив и задумывался, как ПЗУ на блочной памяти. Я хочу сообщить об этом компилятору, но не знаю как. Если вы знаете, подскажите пожалуйста, буду признателен) С конца. Я не пишу "массив", а беру у Ксайлинкса библиотечный элемент.И там есть пример реализации. Копируется один-в-один и без проблем... Потому как при разной реализации ПЗУ будет разная латентность... Но если хочется "массив", то нужны аттрибуты, в которых говорится о том, как это будет реализовано.... Ищите, тут на форуме это было.. Для симуляции достаточно сделать чтение файла. И поскольку речь идет о блочной памяти, то делаете чтение для всего блока целиком... Про параметры. Они задаются в самом верхнем файле проекта, оттуда передаются в нижние. Все остальное пересчитывается функциями... Если один раз произвели настройку всего проекта, то больше ничего и нигде руками менять не надо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба Здравствуйте. Сильно не бейте, пожалуйста, только приступил к изучению Verilog'а. (Да, в дальнейшем собираюсь на СВ, пока нет возможности, потому что работаю в ISE). Собственно, вопросы у меня по памятям: 1. Для того, чтобы инициализировать массив нулями в VHDL достаточно было указать :=(others => (others => '0)); В Verilog я нашел очень удобную инициализацию файлом, умеренно удобную циклом и неудобную ручками. Но файл каждый раз подключать лень, указывать каждый раз размеры массива в цикле - увеличивается вероятность ошибиться. Есть ли какой-то универсальный метод, как вышеуказанный VHDL'ный? 2. Создал массив, инициализировал файлом. Из массива данные только вычитываются, поэтому массив распознается компилятором как ПЗУ и выводит warning, сообщающий об этом. Некритично, но неприятно. В VHDL можно было указать, что массив - не сигнал, а константа. Что можно сделать в Verilog? Спасибо. В ISE есть способы работы с СВ, и даже не один. В СВ есть такая вот конструкция для подобного рода задач : var int A[N] = '{default:0}; Затем, что неинициализированный массив выдает неопределенность 'U' и отладка в ISim превращается в сущий ад. И совершенно правильно симулятор поступает! Вы должны благодарить его за такое поведение. Потому что в реальном железе будет то же самое - если вы не записали в память изначально ничего, то там лежит именно мусор, а не нули. Ну и есть стандартные способы инициализации массивов - почитайте либо в synthesis guide для XST, либо в стандарте SV пункт 10.9 если планируете писать независимый от вендора код (в случае памяти это несложно проделать). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба 2. Создал массив, инициализировал файлом. Из массива данные только вычитываются, поэтому массив распознается компилятором как ПЗУ и выводит warning, сообщающий об этом. Некритично, но неприятно. В VHDL можно было указать, что массив - не сигнал, а константа. Что можно сделать в Verilog? Мне в ISE приходилось BLOCKROM называть BLOCKRАM т.к. иначе криво собиралось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maratz 0 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба В ISE есть способы работы с СВ, и даже не один. Какие? И совершенно правильно симулятор поступает! Вы должны благодарить его за такое поведение. Потому что в реальном железе будет то же самое - если вы не записали в память изначально ничего, то там лежит именно мусор, а не нули. Согласен насчет того, что надо все инициализировать, а насчет мусора нет - скомпилил проект в ISE на Kintex7, содержащий неинициализированный массив. Просмотрел содержимое ПЗУ с помощью ILA. Только нули. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба Какие? Согласен насчет того, что надо все инициализировать, а насчет мусора нет - скомпилил проект в ISE на Kintex7, содержащий неинициализированный массив. Просмотрел содержимое ПЗУ с помощью ILA. Только нули. 1.1. Прицепить сторонний синтезатор(Synplify, Mentor Precision, etc.) штатными средствами ISE. Подробности - в документации на ISE. ИМХО неудобный вариант - в случае ошибок замучаетесь их искать и исправлять, интеграция между тулзами разных вендоров сделана кривенько. 1.2 Синтезировать вплоть до нетлиста в стороннем синтезаторе (те же синплифай или ментор). Нетлист кормить ISE для дальнейшей работы. 2. "я посмотрел - у меня там нули" - отличная логика. А если вы запускаете свой дизайн повторно, не перегружая целиком ПЛИС? Там тоже нули будут? А если вы планируете перенести свой код под ASIC? Думайте чуть дальше ваших локальных экспериментов с Кинтексом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maratz 0 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба Я согласен с тем, что надо инициализировать. Вы сказали, что память инициализируется мусором. Я сказал, что из праздного интереса это проверял и это не так. Я не говорю, что надо этим пользоваться или рассчитывать на это. 2. "я посмотрел - у меня там нули" - отличная логика. А если вы запускаете свой дизайн повторно, не перегружая целиком ПЛИС? Там тоже нули будут? В обоих случаях (с инициализацией или без) там будут результаты прошлого запуска, блочную память нельзя сбросить за такт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба 2. "я посмотрел - у меня там нули" - отличная логика. А если вы запускаете свой дизайн повторно, не перегружая целиком ПЛИС? Там тоже нули будут? А если вы планируете перенести свой код под ASIC? Думайте чуть дальше ваших локальных экспериментов с Кинтексом. В этом плане согласен с ТС. Если алгоритм смотрит на изменение уровня - не важно в какую сторону, а симулятор выдаёт Х-ы, то это полнейшая ерунда. Ну да ладно.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lerk 0 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба Вы сказали, что память инициализируется мусором. Я сказал, что из праздного интереса это проверял и это не так. Вы, простите, бредите. Куча нулей - такой же мусор, как и куча единиц. И куда у вас встанет бистабильная ячейка при подаче питания зависит от уймы факторов, начиная технологическим разбросом параметров при изготовлении пластины с кристаллами, и заканчивая включенной LED лампочкой с импульсным БП на вашем рабочем столе. Так что выделенное жирным, как раз таки не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба С конца. Я не пишу "массив", а беру у Ксайлинкса библиотечный элемент.И там есть пример реализации. Копируется один-в-один и без проблем... Потому как при разной реализации ПЗУ будет разная латентность... Но если хочется "массив", то нужны аттрибуты, в которых говорится о том, как это будет реализовано.... Ищите, тут на форуме это было.. Для симуляции достаточно сделать чтение файла. И поскольку речь идет о блочной памяти, то делаете чтение для всего блока целиком... Про параметры. Они задаются в самом верхнем файле проекта, оттуда передаются в нижние. Все остальное пересчитывается функциями... Если один раз произвели настройку всего проекта, то больше ничего и нигде руками менять не надо... Для maratz Моя практика показывает, что если какой-то вопрос не решается "с ходу", то это значит, что неправильно поставлен сам вопрос... Поэтому я еще добавлю вот про это: "Затем, что неинициализированный массив выдает неопределенность 'U' и отладка в ISim превращается в сущий ад." Эта фраза говорит о том, что Вы упорно при симуляции разглядываете нули и единицы на времянке. И причем в RTL... А зачем??? Ведь если речь идет о ПЗУ, а там достаточно проверить чтение пары байт, чтобы разобраться с латентностью, и кстати о ней ТС нигде и ничего... И скорее всего в своих "массивах" это у него не заложено... Ну а далее, Вы что, тысячи байт по времянке отслеживать собрались? Вы такой трудолюбивый? Зачем???, если можно чтение памяти распечатать в консоли, сохранить в файл и потом обработать "как данные"... И работайте в Моделсим, там есть окно для памяти, в котором сразу видно, что и где в памяти есть... Так что в сущности, все это обсуждение об "инициализации" вообще лишено смысла... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maratz 0 11 ноября, 2016 Опубликовано 11 ноября, 2016 (изменено) · Жалоба Вы, простите, бредите. Куча нулей - такой же мусор, как и куча единиц. И куда у вас встанет бистабильная ячейка при подаче питания зависит от уймы факторов, начиная технологическим разбросом параметров при изготовлении пластины с кристаллами, и заканчивая включенной LED лампочкой с импульсным БП на вашем рабочем столе. Так что выделенное жирным, как раз таки не так. В настройках синтезатора можно указать, что делать с неприкаянными сигналами. Но чтоб от этого не зависеть, лучше указывать в явном виде, вот моя позиция. Но вообще топик был о методах инициализации. По теме один ответ и тот по СВ. Изменено 11 ноября, 2016 пользователем maratz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 11 ноября, 2016 Опубликовано 11 ноября, 2016 · Жалоба В настройках синтезатора можно указать, что делать с неприкаянными сигналами. Но чтоб от этого не зависить, лучше указывать в явном виде, вот моя позиция. Но вообще топик был о методах инициализации. По теме один ответ и тот по СВ. Для XST есть документ что-то типа "XST synthesis guide" (UG687) - там есть и про инициализацию памяти. Если не ошибаюсь, там используется $readmemb или $readmemh для этих целей. Если при изначально неинициализированной RAM в симуляции у вас проблемы, значит надо что-то в дизайне менять. Алгоритм не должен зависеть от начального состояния памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться