Полная версия этой страницы:
Вопрос по регенерации в SDRAM
Geymur
Jan 13 2014, 12:29
Здравствуйте,
Так ли необходимо проводить циклы автоматической регенерации строк SDRAM каждые 64мс если система гарантирует корректное обращение к каждой строке (по записи или чтению) за меньшее время ? Помнится, для FP DRAM такой вопрос не стоял. Достаточно было простого перебора строк (RoR). В документации на микросхему предписывается обязательное проведение циклов регенерации.
Поясню ситуацию. Делаю кольцевой буфер на SDRAM от Micron. Эти приборы поддерживают независимую работу всех 4 банков (не закрывая банк можно активировать другие).
Частота следования данных - 100 МГц, частота SDRAM - 100 МГц. При условии чередования банков и длине burst 4, можно обеспечить запись информации в каждом такте. Причем, каждый burst будет направлен в следующую строку.
Все замечательно, но циклы REFRESH портят всю картину. Придется увеличивать частоту SDRAM (задействовать еще 1 PLL), городить FIFO, да и управляющий автомат усложнится в разы.
Спасибо заранее.
RobFPGA
Jan 13 2014, 15:25
Приветствую!
Если Вы гарантировано будете рефрешить строки своими обращениями в требуемое время то
специально выполнять цикл REFRESH в этом случае не нужно.
Однако Вы должны выполнить полный цикл обращения ко всем строкам - то есть открыть ничего_не_делать|записать|прочитать и закрыть поскольку рефреш происходить при закрытии строки.
Успехов! Rob.
REFRESH = ACT(ba, rowa) + PRECHARGE(ba). если период обращения к строке меньше 64мс и строки перебираются все, то забить как и советовал
RobFPGA
Цитата(RobFPGA @ Jan 13 2014, 19:25)

поскольку рефреш происходить при закрытии строки.
А это верно для всех типов SDRAM? DDR2 например? Откуда информация (вроде в JESD такого нет)?
Цитата(SM @ Jan 13 2014, 10:46)

А это верно для всех типов SDRAM? DDR2 например? Откуда информация (вроде в JESD такого нет)?
Вопро тоже интересен, всегда считал что чтение из памяти разрушающее (разряжаются емкости затворов транзиторов) и их перезаряжают как раз при акивации банка.
Цитата(des00 @ Jan 14 2014, 06:32)

Вопро тоже интересен, всегда считал что чтение из памяти разрушающее (разряжаются емкости затворов транзиторов) и их перезаряжают как раз при акивации банка.
Если посмотреть на электрическую схему ячейки классической DRAM, их перезаряжают именно при чтении - считывание совмещается с последующей записью того, что считалось. PRECHARGE по электрической схеме классической DRAM - заряжает емкости всех линии выборки строк в состояние "лог.1" - получается состояние "ни одна не выбрана", активация - разряжает в "0" емкость нужной линии выборки строк из предварительно заряженных по precharge, но ни чтение, ни запись (и вообще линии выборки столбцов) не активируются.
так что я еще поверю, что регенерация не нужна, если в пределах этих 64 мс (tREFI) происходит чтение ВСЕХ ЯЧЕЕК, или запись ВСЕХ ЯЧЕЕК, но вот в то, что precharge или активация регенерирует, я не верю.
Geymur
Jan 15 2014, 07:51
Спасибо за обнадеживающие ответы. Буду пробовать в железе. По итогам отпишусь.
Смущают, конечно, слова "must refresh every 64 ms" в даташите.
Golikov A.
Jan 15 2014, 17:28
помню когда-то давно разбирался с ДДР контроллером тексавского ДСПешника, сейчас дословно не помню, но помниться что там было описаны пропуски рефрешей каких то областей (колонок рядов) в случае обращения в них, только вот не помню на чтение или на запись. То есть тот контроллер рефрешил весь ддр только в случае отсутствия обращений заданное время, а так рефрешил только выборочно области.
Надеюсь я не наврал с воспоминаниями
Цитата(SM @ Jan 14 2014, 03:13)

Если посмотреть на электрическую схему ячейки классической DRAM, их перезаряжают именно при чтении - считывание совмещается с последующей записью того, что считалось. PRECHARGE по электрической схеме классической DRAM - заряжает емкости всех линии выборки строк в состояние "лог.1" - получается состояние "ни одна не выбрана", активация - разряжает в "0" емкость нужной линии выборки строк из предварительно заряженных по precharge, но ни чтение, ни запись (и вообще линии выборки столбцов) не активируются.
так что я еще поверю, что регенерация не нужна, если в пределах этих 64 мс (tREFI) происходит чтение ВСЕХ ЯЧЕЕК, или запись ВСЕХ ЯЧЕЕК, но вот в то, что precharge или активация регенерирует, я не верю.
Может быть у современной памяти другая конструкция. Что касается SDR SDRAM, у меня сложилось мнение что регенерируется сразу вся строка и при активации банка вся эта строка читается в специальный буфер (Read Data Latches) и регенерация происходит именно при активации банка. Что интересно длительность периода refresh подозрительно совпадает с длительностью последовательности команд act + pre.
Bad0512
Jan 16 2014, 07:24
Оффтопик :
А какой вообще может быть глобальный смысл в экономии на циклах рефреша? Если мне не изменяет память, то эти циклы жрут меньше
1% от полной скорострельности памяти. Сама машина по вставке этих циклов - не сильно сложная.
За что в таком случае бьёмся-то?
Geymur
Jan 16 2014, 07:31
Память 100MHz, поток - 100MHz. Нужно писать каждый такт. Рефреш съест 4 такта, поток прервется. За то и бьемся. Чтоб пропуска не было нужно вводить FIFO и поднимать частоту памяти.
Bad0512
Jan 16 2014, 09:45
Цитата(Geymur @ Jan 16 2014, 14:31)

Память 100MHz, поток - 100MHz. Нужно писать каждый такт. Рефреш съест 4 такта, поток прервется. За то и бьемся. Чтоб пропуска не было нужно вводить FIFO и поднимать частоту памяти.
Не получится без фифо. Там ещё других накладных уйма.И рефреш тут - не самое страшное зло.
RobFPGA
Jan 16 2014, 10:19
Приветствую!
Цитата(Bad0512 @ Jan 16 2014, 11:45)

Не получится без фифо. Там ещё других накладных уйма.И рефреш тут - не самое страшное зло.
Получится - я еще в 1999 году что-то похожее делал на max128. Типа цифрового осциллографа - быстрая потоковая запись оцифрованных данных в SDRAM, а затем медленное вычитывание через LPT порт. Открываем строку в банке (с autoprecharge) - пишем burst 4-8 слов - пока пишем открываем следующую строку в другом банке - закончили писать burst (строка закрылась автоматом) начали писать burst в следующий открытый банк ... и так конвейером по всем банкам/строкам. Ну а при медленном чтении естественно делался refresh.
2 SM, des00
Увы может и был неправ, давно это было вот и подзабыл - но то что без закрытия строки не обойтись помню точно.
Успехов! Rob.
Geymur
Jan 16 2014, 11:29
Цитата(RobFPGA @ Jan 16 2014, 14:19)

Приветствую!
Получится - я еще в 1999 году что-то похожее делал на max128. Типа цифрового осциллографа - быстрая потоковая запись оцифрованных данных в SDRAM, а затем медленное вычитывание через LPT порт. Открываем строку в банке (с autoprecharge) - пишем burst 4-8 слов - пока пишем открываем следующую строку в другом банке - закончили писать burst (строка закрылась автоматом) начали писать burst в следующий открытый банк ... и так конвейером по всем банкам/строкам. Ну а при медленном чтении естественно делался refresh.
2 SM, des00
Увы может и был неправ, давно это было вот и подзабыл - но то что без закрытия строки не обойтись помню точно.
Успехов! Rob.
Спасибо, Rob на добром слове!
Думаю - должно получиться. Память поддерживает работу со всеми 4 банками одновременно. Пока пишется burst в первый банк, активируется второй. Первый закрывается и ждет Twr - во втором начинается активация. И т.д. Причем, строка+банк - в младших разрядах. Вначале перебираются банки и строки, потом столбцы. Следовательно, гарантировать перебор строк можно.
Цитата(RobFPGA @ Jan 16 2014, 14:19)

без закрытия строки не обойтись помню точно.
Это само собой, безоговорочно, если открыл строку - закрой за собой. Ее предзарядить надо, чтобы потом открыть заново. Даже время есть - по истечение которого строка обязательно должна быть предзаряжена (tRAS имеет и min, и max)
Цитата(SM @ Jan 16 2014, 15:52)

Это само собой, безоговорочно, если открыл строку - закрой за собой. Ее предзарядить надо, чтобы потом открыть заново. Даже время есть - по истечение которого строка обязательно должна быть предзаряжена (tRAS имеет и min, и max)
Я думаю, ограничение максимального времени до предзарядки связано с тем, что буфер, временно хранящий открытую строку, является динамическим, и через некоторое время разряжается, как и основная матрица.
Кстати, я тоже экспериментировал с последовательным доступом без рефреша на DDR2, и всё нормально работало.
Цитата(Timmy @ Jan 16 2014, 16:59)

Кстати, я тоже экспериментировал с последовательным доступом без рефреша на DDR2, и всё нормально работало.
В общем, тут все просто - если от записи в ячейку до считывания из нее всегда проходит времени меньше, чем Trefi * 8 (на сколько я помню, можно запостить подряд до 8 команд рефреша, значит реальное время хранения Trefi*8), то и регенерировать смысла нет никакого вообще.
PS
странно бы иметь динамический буфер, какой смысл там экономить то площадь.... По классической схеме там именно динамическая линия выборки, и динамический усилитель считывания.
Не хотел создавать новую тему, так что кину вопрос здесь...
Насчет 8ми команд рефреша подряд поясните пожалуйста. Память другая (INFINEON HYB25D25616BС]), но в доке есть подобное:
The refresh addressing is generated by the internal refresh controller. This makes the address bits “Don’t
Care” during an Auto Refresh command. The 256Mb DDR SDRAM requires Auto Refresh cycles at an aver-
age periodic interval of 7.8 us (maximum).
To allow for improved efficiency in scheduling and switching between tasks, some flexibility in the absolute
refresh interval is provided. A maximum of eight Auto Refresh commands can be posted in the system,
meaning that the maximum absolute interval between any Auto Refresh command and the next Auto Refresh
command is 9 * 7.8 us (70.2 us). This maximum absolute interval is short enough to allow for DLL updates
internal to the DDR SDRAM to be restricted to Auto Refresh cycles, without allowing too much drift in t AC
between updates.
Первый и второй абзац как-то не стыкуются...
Я слабо понял, как это трактовать и как использовать. То есть даешь команду авторефреш и далее в течении 70.2 мкс творишь с данными что хочешь?
В первый раз с динамической памятью разбираюсь, так что наставьте на верный путь)
Цитата(ig_f @ Feb 14 2014, 17:37)

Насчет 8ми команд рефреша подряд поясните пожалуйста.
Об этом в JESD написано...
When the refresh cycle has completed, all banks of the DDR2 SDRAM will be in the precharged (idle) state. A delay between the Refresh command (REF) and the next Activate command or subsequent refresh command must be greater than or equal to the Refresh cycle time (tRFC).
To allow for improved efficiency in scheduling and switching between tasks, some flexibility in the absolute refresh interval is provided. A maximum of eight Refresh commands can be posted to any given DDR2 SDRAM, meaning that the maximum absolute interval between any Refresh command and the next Refresh command is 9 * tREFI. Можете давать одну команду регенерации один раз в tREFI, а можете подряд напихать ей в конвейер до 8-ми регенераций с интервалом tRFC, а следующую пачку регенераций давать через N*tREFI.
Я правильно понимаю, что эта опция нужна, когда априори известно, что в течении следующих N*tREFI не будут выполняться никакие другие команды? Иначе могут возникнуть коллизии. А если, например, мне необходимо конвеерно считывать или записывать данные то нужно через каждые tREFI выполнять регенерацию.
Цитата(ig_f @ Feb 17 2014, 16:24)

Я правильно понимаю, что эта опция нужна, когда априори известно, что в течении следующих N*tREFI не будут выполняться никакие другие команды?
Наоборот, если напихать в SDRAM 8 штук рефрешей подряд, то у Вас потом будет N*tREFI времени, чтобы делать что угодно, и не делать рефрешей. А если дать один рефреш, то и времени у Вас будет 1 tREFI.
Я смутно догадываюсь, что один RFSH регенирирует одну строку одного банка, определяемый каким-то счетчиком внутренним, а банков - 8, поэтому их и можно подряд делать... Но это догадки, ничем не подтвержденные.
У моей микросхемы всего 2 банка. Адреса банков двухбитные. Что-то ни в даташите, ни в JESD не нашел информации о том, какой адрес для первого банка, а какой для второго. Проверять методом тыка?
Infineon HYB25D256160BT-7F
вообще то первые слова в даташите:
The 256Mb DDR SDRAM is a high-speed CMOS, dynamic random-access memory containing 268,435,456 bits. It is internally configured as a quad-bank DRAM
quad это не два, а четыре!
Цитата(SM @ Mar 3 2014, 14:18)

вообще то первые слова в даташите:
The 256Mb DDR SDRAM is a high-speed CMOS, dynamic random-access memory containing 268,435,456 bits. It is internally configured as a quad-bank DRAM
quad это не два, а четыре!
Точно

а я почему-то был в полной уверенности, что два, и еще удивлялся почему в JESD такое число банков отсутствует. Прошу прощенья за затуп.
Спасибо
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.