Перейти к содержанию
    

Массивы Verilog

Здравствуйте. Сильно не бейте, пожалуйста, только приступил к изучению Verilog'а. (Да, в дальнейшем собираюсь на СВ, пока нет возможности, потому что работаю в ISE).

Собственно, вопросы у меня по памятям:

1. Для того, чтобы инициализировать массив нулями в VHDL достаточно было указать :=(others => (others => '0)); В Verilog я нашел очень удобную инициализацию файлом, умеренно удобную циклом и неудобную ручками. Но файл каждый раз подключать лень, указывать каждый раз размеры массива в цикле - увеличивается вероятность ошибиться. Есть ли какой-то универсальный метод, как вышеуказанный VHDL'ный?

2. Создал массив, инициализировал файлом. Из массива данные только вычитываются, поэтому массив распознается компилятором как ПЗУ и выводит warning, сообщающий об этом. Некритично, но неприятно. В VHDL можно было указать, что массив - не сигнал, а константа. Что можно сделать в Verilog?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Сильно не бейте, пожалуйста, только приступил к изучению Verilog'а. (Да, в дальнейшем собираюсь на СВ, пока нет возможности, потому что работаю в ISE).

Собственно, вопросы у меня по памятям:

1. Для того, чтобы инициализировать массив нулями в VHDL достаточно было указать :=(others => (others => '0)); В Verilog я нашел очень удобную инициализацию файлом, умеренно удобную циклом и неудобную ручками. Но файл каждый раз подключать лень, указывать каждый раз размеры массива в цикле - увеличивается вероятность ошибиться. Есть ли какой-то универсальный метод, как вышеуказанный VHDL'ный?

2. Создал массив, инициализировал файлом. Из массива данные только вычитываются, поэтому массив распознается компилятором как ПЗУ и выводит warning, сообщающий об этом. Некритично, но неприятно. В VHDL можно было указать, что массив - не сигнал, а константа. Что можно сделать в Verilog?

Спасибо.

Ну, во первых есть параметры. И они указываются один раз на весь проект.

Зачем нужно что-то "инициализировать", Если это не пустой массив, то туда будет сначала что-то писаться и только потом читаться... И при загрузке конфигурации в распределенной памяти и так будут нули. А блочную память - да из файла... И это не проблема...

Во-вторых фраза: "как ПЗУ .... Некритично, но неприятно" - ну это просто смешно... А как организовывать массив констант по-вашему? на логике или на триггерах, если есть свободные блоки памяти?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, не хочу показаться неблагодарным, но вопрос был в том, знает ли кто-нибудь еще какие-то методы инициализации. То, почему мне не хватает этих - ну это мои заморочки.

Ну, во первых есть параметры. И они указываются один раз на весь проект.

Параметры удобны, но надо не забывать их менять. А директива others=>others=> '0' вообще ни к чему не привязана, я про это.

 

Зачем нужно что-то "инициализировать", Если это не пустой массив, то туда будет сначала что-то писаться и только потом читаться...

Затем, что неинициализированный массив выдает неопределенность 'U' и отладка в ISim превращается в сущий ад.

 

Во-вторых фраза: "как ПЗУ .... Некритично, но неприятно" - ну это просто смешно... А как организовывать массив констант по-вашему? на логике или на триггерах, если есть свободные блоки памяти?

Ну массив и задумывался, как ПЗУ на блочной памяти. Я хочу сообщить об этом компилятору, но не знаю как. Если вы знаете, подскажите пожалуйста, буду признателен)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Параметры удобны, но надо не забывать их менять. А директива others=>others=> '0' вообще ни к чему не привязана, я про это.

 

Затем, что неинициализированный массив выдает неопределенность 'U' и отладка в ISim превращается в сущий ад.

 

 

Ну массив и задумывался, как ПЗУ на блочной памяти. Я хочу сообщить об этом компилятору, но не знаю как. Если вы знаете, подскажите пожалуйста, буду признателен)

 

С конца. Я не пишу "массив", а беру у Ксайлинкса библиотечный элемент.И там есть пример реализации. Копируется один-в-один и без проблем... Потому как при разной реализации ПЗУ будет разная латентность... Но если хочется "массив", то нужны аттрибуты, в которых говорится о том, как это будет реализовано.... Ищите, тут на форуме это было.. Для симуляции достаточно сделать чтение файла. И поскольку речь идет о блочной памяти, то делаете чтение для всего блока целиком...

Про параметры. Они задаются в самом верхнем файле проекта, оттуда передаются в нижние. Все остальное пересчитывается функциями... Если один раз произвели настройку всего проекта, то больше ничего и нигде руками менять не надо...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Сильно не бейте, пожалуйста, только приступил к изучению 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 если планируете

писать независимый от вендора код (в случае памяти это несложно проделать).

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. Создал массив, инициализировал файлом. Из массива данные только вычитываются, поэтому массив распознается компилятором как ПЗУ и выводит warning, сообщающий об этом. Некритично, но неприятно. В VHDL можно было указать, что массив - не сигнал, а константа. Что можно сделать в Verilog?

 

Мне в ISE приходилось BLOCKROM называть BLOCKRАM т.к. иначе криво собиралось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ISE есть способы работы с СВ, и даже не один.

Какие?

 

И совершенно правильно симулятор поступает! Вы должны благодарить его за такое поведение. Потому что в реальном железе будет то же самое -

если вы не записали в память изначально ничего, то там лежит именно мусор, а не нули.

Согласен насчет того, что надо все инициализировать, а насчет мусора нет - скомпилил проект в ISE на Kintex7, содержащий неинициализированный массив. Просмотрел содержимое ПЗУ с помощью ILA. Только нули.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие?

 

 

Согласен насчет того, что надо все инициализировать, а насчет мусора нет - скомпилил проект в ISE на Kintex7, содержащий неинициализированный массив. Просмотрел содержимое ПЗУ с помощью ILA. Только нули.

1.1. Прицепить сторонний синтезатор(Synplify, Mentor Precision, etc.) штатными средствами ISE. Подробности - в документации на ISE. ИМХО неудобный вариант - в случае ошибок замучаетесь их искать и исправлять, интеграция между тулзами разных вендоров сделана кривенько.

1.2 Синтезировать вплоть до нетлиста в стороннем синтезаторе (те же синплифай или ментор). Нетлист кормить ISE для дальнейшей работы.

 

2. "я посмотрел - у меня там нули" - отличная логика. А если вы запускаете свой дизайн повторно, не перегружая целиком ПЛИС? Там тоже нули будут? А если вы планируете перенести свой код под ASIC? Думайте чуть дальше ваших локальных экспериментов с Кинтексом.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я согласен с тем, что надо инициализировать. Вы сказали, что память инициализируется мусором. Я сказал, что из праздного интереса это проверял и это не так. Я не говорю, что надо этим пользоваться или рассчитывать на это.

2. "я посмотрел - у меня там нули" - отличная логика. А если вы запускаете свой дизайн повторно, не перегружая целиком ПЛИС? Там тоже нули будут?

В обоих случаях (с инициализацией или без) там будут результаты прошлого запуска, блочную память нельзя сбросить за такт.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. "я посмотрел - у меня там нули" - отличная логика. А если вы запускаете свой дизайн повторно, не перегружая целиком ПЛИС? Там тоже нули будут? А если вы планируете перенести свой код под ASIC? Думайте чуть дальше ваших локальных экспериментов с Кинтексом.

В этом плане согласен с ТС. Если алгоритм смотрит на изменение уровня - не важно в какую сторону, а симулятор выдаёт Х-ы, то это полнейшая ерунда. Ну да ладно..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы сказали, что память инициализируется мусором. Я сказал, что из праздного интереса это проверял и это не так.

 

Вы, простите, бредите. Куча нулей - такой же мусор, как и куча единиц. И куда у вас встанет бистабильная ячейка при подаче питания зависит от уймы факторов, начиная технологическим разбросом параметров при изготовлении пластины с кристаллами, и заканчивая включенной LED лампочкой с импульсным БП на вашем рабочем столе. Так что выделенное жирным, как раз таки не так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С конца. Я не пишу "массив", а беру у Ксайлинкса библиотечный элемент.И там есть пример реализации. Копируется один-в-один и без проблем... Потому как при разной реализации ПЗУ будет разная латентность... Но если хочется "массив", то нужны аттрибуты, в которых говорится о том, как это будет реализовано.... Ищите, тут на форуме это было.. Для симуляции достаточно сделать чтение файла. И поскольку речь идет о блочной памяти, то делаете чтение для всего блока целиком...

Про параметры. Они задаются в самом верхнем файле проекта, оттуда передаются в нижние. Все остальное пересчитывается функциями... Если один раз произвели настройку всего проекта, то больше ничего и нигде руками менять не надо...

Для maratz

Моя практика показывает, что если какой-то вопрос не решается "с ходу", то это значит, что неправильно поставлен сам вопрос...

Поэтому я еще добавлю вот про это: "Затем, что неинициализированный массив выдает неопределенность 'U' и отладка в ISim превращается в сущий ад."

Эта фраза говорит о том, что Вы упорно при симуляции разглядываете нули и единицы на времянке. И причем в RTL... А зачем???

Ведь если речь идет о ПЗУ, а там достаточно проверить чтение пары байт, чтобы разобраться с латентностью, и кстати о ней ТС нигде и ничего... И скорее всего в своих "массивах" это у него не заложено... Ну а далее, Вы что, тысячи байт по времянке отслеживать собрались? Вы такой трудолюбивый? Зачем???, если можно чтение памяти распечатать в консоли, сохранить в файл и потом обработать "как данные"...

И работайте в Моделсим, там есть окно для памяти, в котором сразу видно, что и где в памяти есть...

Так что в сущности, все это обсуждение об "инициализации" вообще лишено смысла...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы, простите, бредите. Куча нулей - такой же мусор, как и куча единиц. И куда у вас встанет бистабильная ячейка при подаче питания зависит от уймы факторов, начиная технологическим разбросом параметров при изготовлении пластины с кристаллами, и заканчивая включенной LED лампочкой с импульсным БП на вашем рабочем столе. Так что выделенное жирным, как раз таки не так.

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

Но вообще топик был о методах инициализации. По теме один ответ и тот по СВ.

Изменено пользователем maratz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Но вообще топик был о методах инициализации. По теме один ответ и тот по СВ.

Для XST есть документ что-то типа "XST synthesis guide" (UG687) - там есть и про инициализацию памяти. Если не ошибаюсь, там используется $readmemb или $readmemh для этих целей.

Если при изначально неинициализированной RAM в симуляции у вас проблемы, значит надо что-то в дизайне менять. Алгоритм не должен зависеть от начального состояния памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...