Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема с RAM в ModelSim
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
billidean
Добрый день всем.
Работая с ModelSim заметил странную вещь.
В одном проекте имеются два компонента памяти: 1-портовая и 2-портовая, обе синхронные.
При симуляции проекта, во время чтения каждой из памятей получаю разные задержки данных на выходе относительно сигнала "rden".
Вот две картинки:
для однопортовой:
Нажмите для просмотра прикрепленного файла
для двухпортовой:
Нажмите для просмотра прикрепленного файла

По нулевому адресу в обеих памятях лежит значение "F00..", т.е. не ноль.

Подскажите что делать, если Вы знаете.
DmitryR
Разбираться, что раскосячилось в первом примере. Выведите внутренние сигналы из модели памяти для начала.
des00
Цитата(billidean @ Mar 14 2012, 02:08) *
Подскажите что делать, если Вы знаете.

при генерации памяти поставить одинаковую read latency %)
billidean
Цитата(des00 @ Mar 14 2012, 11:23) *
при генерации памяти поставить одинаковую read latency %)

Какую "read latency"??? 01.gif
В МегаВизарде вообще нет такой опции для памяти %)

З.Ы.: прошу отвечать тех, кто сталкивался с такой проблемой или знает решение.
iosifk
Цитата(billidean @ Mar 15 2012, 09:15) *
З.Ы.: прошу отвечать тех, кто сталкивался с такой проблемой или знает решение.


Смешно, ей богу...
Ну, про МоделСим кое-что мы знаем. Но откуда Визард? Какая память? Откуда взялась однопортовая память и двухпортовая? Этого кроме Вас похоже никто не знает. Но Вы об этом нем не сообщаете.
Так что каков вопрос, таков и ответ...
а телепаты ушли за пивом... sm.gif
billidean
Цитата(iosifk @ Mar 15 2012, 10:42) *
Но откуда Визард? Какая память? Откуда взялась однопортовая память и двухпортовая?


Ладно...

Разрабатываю проект в Квартусе (VHDL), где Визардом создал памяти( RAM:1-Port и RAM:2-Port ). Перед отладкой проекта на железе решил промоделировать систему в МоделСиме и наткнулся на проблему.

iosifk
Цитата(billidean @ Mar 15 2012, 11:45) *
Разрабатываю проект в Квартусе (VHDL), где Визардом создал памяти

Ну, уже легче. Теперь остается взять описание мегафункций Квартуса и прочесть два раздела о памяти. И обратить внимание на латентность.
А если Квартус генерит визардом файлы, которые можно прочитать, то как написал des можно их тогда исследовать на латентность...
Или скажем так. Если бы я делал двухпортовку, то она бы выглядела так: блок памяти и у него на адресной шине - мультиплексор, который коммутирует шину адресов с порта А или с порта Б. Соответственно, после мультиплексора я бы поставил регистр для фиксации адреса. Вот и получился бы лишний такт латентности...
billidean
Вот vhd-файл, сгенеренный Визардом:
Нажмите для просмотра прикрепленного файла
Покажител, плз, где настраивается задержка
iosifk
Цитата(billidean @ Mar 15 2012, 12:28) *
Вот vhd-файл, сгенеренный Визардом:
Нажмите для просмотра прикрепленного файла
Покажител, плз, где настраивается задержка

Задержка и не настраивается. Она задается режимами работы. Если задали синхронный режим, значит адрес будет защелкиваться. Если задали еще и регистр по выходу, значит данные будут защелкиваться еще и на выходе и задержка будет в 2 такта. А ваш файл ссылается на библиотечный altsyncram, вот там и смотрите... Если он доступен для чтения...
Читайте описание мегафункций. Там все должно быть описано. Я давно с Альтерой работал...

billidean
Цитата(iosifk @ Mar 15 2012, 13:54) *
Если задали синхронный режим, значит адрес будет защелкиваться. Если задали еще и регистр по выходу, значит данные будут защелкиваться еще и на выходе и задержка будет в 2 такта.

В том то и дело, что обе памяти у меня сформированы на основе библиотечного компонента altsyncram, обе в синхронном режиме, и обе имеют регистры на выходе, даже тактируются одной частотой, но вот ведут себя по разному, одна имеет на выходе задержку в 1 такт, другая - 2 такта.
iosifk
Цитата(billidean @ Mar 15 2012, 14:46) *
, но вот ведут себя по разному, одна имеет на выходе задержку в 1 такт, другая - 2 такта.

Так у них же разная "начинка". Почему же они должны иметь одинаковую задержку? Я же Вам написал, что скорее всего дело в мультиплексоре входных адресов. Если там есть регистр, то он даст задержку на один такт. Или вы ему "приказываете" как это называется "по щучьему веленью, хочу чтобы задержки не было"....
billidean
Цитата(iosifk @ Mar 15 2012, 14:53) *
Так у них же разная "начинка". Почему же они должны иметь одинаковую задержку?

Вообще-то обе этих памяти в железе (циклон,стратикс...) имеют одинаковую задержку выходных данных относительно сигнала rden, два такта.
Или Вы с ними в железе не сталкивались?
des00
судя по тому что в выложеным вами файле, параметр используется outdata_reg_a => "CLOCK0", при генерации памяти вы поставили ее латентность == 2.

тогда следующий вопрос, как именно сформирован сигнал rden на эту память в тестбенче, правильно ли он ложиться на дельта циклы симулятора ?
novartis
извиняюсь, а что такое дельта циклы симулятора?
billidean
При написании такого кода
Код
...
process clk
begin
if ( rising_edge(clk) ) then
...
ram_wren <= '1'; --сигнал чтения памяти
...
end if;
...
end process;
...

в моделсиме получаю задержку выходных данных из памяти в 1 такт, но уже при коде
Код
...
process clk
begin
if ( rising_edge(clk) ) then
...
ram_wren <= '1' after 1 ns; --сигнал чтения памяти
...
end if;
...
end process;
...

получаю нормальную рабочую задержку, как в железе, в 2 такта.

Т.е. получается, что проекты заточенные конкретно для железа нельзя сразу моделировать, не расставив задержки по всем устанавливаемым сигналам?
_Anatoliy
Практически никогда не пользуюсь задержками,только для формирования клока и ресета, проблем не замечал. Пишите тест-бенч правильно и всё будет нормально.
des00
на дельтацикл разъезжается обработчик. что в VHDL с его честным детерминизмом быть не должно, так что весь код в студию. иначе гадание на кофейной гуще.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.