Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Контроллер sdram: скажется ли на пропускной способности
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
gosha
Cкажется ли куда (row/col/bank) отправлять разряды адреса wb_шины?

Например, старшие разряды шины адреса -> col, младшие -> row при использовании контроллера типа des_00?
Михаил_K
Цитата(gosha @ Dec 16 2008, 13:14) *
Cкажется ли куда (row/col/bank) отправлять разряды адреса wb_шины?

Например, старшие разряды шины адреса -> col, младшие -> row при использовании контроллера типа des_00?


Соблюдать правильное подключение адресной шины (Старшие адреса -> row, младшие -> col) очень важно. Для обеспечения максимальной пропускной способности в SDARM используется режим конвеерного чтения строк. При этом сначала строку требуется открыть, а потом после чтения закрыть. Подключив адресную шину так как вы написали, при последовательной записи (т.е. с увеличением адреса на 1) вы будете вынуждены для записи каждой ячейки выполнять процедуру открытия/закрытия строки. На чем потеряете 80 - 90 % времени smile.gif . Никогда не работал с контроллером типа des_00, но смею предположить, что при неправильном подключении он вообще не будет правильно работать.
Postoroniy_V
Цитата(gosha @ Dec 16 2008, 19:14) *
Cкажется ли куда (row/col/bank) отправлять разряды адреса wb_шины?

Например, старшие разряды шины адреса -> col, младшие -> row при использовании контроллера типа des_00?

в доке ведь написано всё smile.gif

Цитата(Михаил_K @ Dec 17 2008, 14:11) *
Соблюдать правильное подключение адресной шины (Старшие адреса -> row, младшие -> col) очень важно. Для обеспечения максимальной пропускной способности в SDARM используется режим конвеерного чтения строк. При этом сначала строку требуется открыть, а потом после чтения закрыть. Подключив адресную шину так как вы написали, при последовательной записи (т.е. с увеличением адреса на 1) вы будете вынуждены для записи каждой ячейки выполнять процедуру открытия/закрытия строки. На чем потеряете 80 - 90 % времени smile.gif . Никогда не работал с контроллером типа des_00, но смею предположить, что при неправильном подключении он вообще не будет правильно работать.

читаем в доке от создателя HSSDRC IP Core, уважаемого des00
http://www.opencores.com/projects.cgi/web/hssdrc/overview
дока тута Нажмите для просмотра прикрепленного файла
Table 4.5.4 Variants of the controller system address mapping on SDRAM bank, row and
column addresses
The address mapping function (bank, row
and column addresses concatenation)
Comment
sys_addr = {sys_ba, sys_rowa, sys_cola} it is recommended to use in case when application
have linear sequential access and data size
is less than capacities of one memory row.
sys_addr = {sys_rowa, sys_ba, sys_cola} It is recommended to use in all other cases.
des00
Цитата(gosha @ Dec 16 2008, 05:14) *
Cкажется ли куда (row/col/bank) отправлять разряды адреса wb_шины?


Интересно как вы сами думаете ? smile.gif

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

Обычно отображение адресов выбирают исходя из :

1. размер бурста
2. выравнивание бурста
3. частота обращений по адресам

Нужно смотреть ваш конкретный случай.
Оптимальное, рекомендуемое отображение приведено в документации.

Удачи !!!
gosha
Еще дилетантские вопросы:

Virtex2p, sodimm, в данной итерации пока нужен контроллер sdram (не ddr) т.к. плата уже изготовлена.


На rank (s0,s1) какой лучше отправить разряд wb_addr?
Какую opencore Вы порекомендуете (с учетом возможного downgrade ddr opencore)?
Контроллер des_00 при переделке его в контролллер sdram - возможны ли грабли?
Лучше ли core от altera || xilinx чем представленные на opencores?
Maverick
Цитата(gosha @ Dec 17 2008, 11:30) *
Еще дилетантские вопросы:

Virtex2p, sodimm, в данной итерации пока нужен контроллер sdram (не ddr) т.к. плата уже изготовлена.
На rank (s0,s1) какой лучше отправить разряд wb_addr?
Какую opencore Вы порекомендуете (с учетом возможного downgrade ddr opencore)?
Контроллер des_00 при переделке его в контролллер sdram - возможны ли грабли?
Лучше ли core от altera || xilinx чем представленные на opencores?


Если работает с core от altera || xilinx и с opencore
Разница может быть только в том, что нужен ли в конечном итоге исходный код.
gosha
Все исходные тексты проекта нужно предоставить для проверки на отсутвие закладок.

Но, как я понял, у xilinx в appnotes есть free контроллеры sdram в исходных текстах:

ftp://ftp.xilinx.com/pub/applications/xap...134_verilog.zip
ftp://ftp.xilinx.com/pub/applications/xapp/xapp200.zip

Или эти примеры имеют худшие характеристики?
des00
Цитата(gosha @ Dec 17 2008, 02:30) *
Какую opencore Вы порекомендуете (с учетом возможного downgrade ddr opencore)?


странно, вообще то переход с sdr sdram на ddr sdram это upgrate, а у вас наоборот. Я бы с ддр не рекомендовал вам связываться, сразу ставить ддр2.

Цитата
Лучше ли core от altera || xilinx чем представленные на opencores? Или эти примеры имеют худшие характеристики?


Лучше/хуже без конкретизации параметров разговор на пустом месте, побольше конкретики.

Цитата
Контроллер des_00 при переделке его в контролллер sdram - возможны ли грабли?


вы вообще проект смотрели ? это и так sdr sdram. В названии же написано HSSDRC == HighSpeedSDRamController.

С ддр будут проекты HSDSDRC/HSD2SRD== HighSpeedDdrSDRController/ HighSpeedDdr2SDRController. Но это когда время будет, уже год зашиваюсь sad.gif.
gosha
Цитата(des00 @ Dec 17 2008, 17:57) *
странно, вообще то переход с sdr sdram на ddr sdram это upgrate, а у вас наоборот. Я бы с ддр не рекомендовал вам связываться, сразу ставить ддр2.
Лучше/хуже без конкретизации параметров разговор на пустом месте, побольше конкретики.
вы вообще проект смотрели ? это и так sdr sdram. В названии же написано HSSDRC == HighSpeedSDRamController.

С ддр будут проекты HSDSDRC/HSD2SRD== HighSpeedDdrSDRController/ HighSpeedDdr2SDRController. Но это когда время будет, уже год зашиваюсь sad.gif.


Увы, пока требуется не ddr, ddr2, ddr3 sdram котнроллер, а single data rate sdram контроллер для одного модулька sodimm.
- wb_bus 133 MHz.
- Две шины к контроллеру sdram (радиально) (1ая шина- от cpu (mips_rm7000), 2ая шина- dma от ide, pci платы). 2 шины - для исключения тактов ожидания от wb_arbiter (wb_req, wb_gnt).
- Шина от cpu к контроллеру sdram пока совсем не wishbone.

Какие характеристики cpu, dma_мастеров необходимы для сравнения характеристик sdram core?

Или Вы порекомендуете интегрировать в проект все core по очереди с запуском тестов пропускной способности на реальном железе?

Также вопрос: С Вашей точки зрения система с раздельными шинами [cpu- sdram], [pci, ide- sdram]
будет предположительно иметь лучшие характеристики, чем с единой шиной? Или это тоже стоит тестировать?
SFx
могу пару слов сказать про DDR Xilinx.
Очень хороший контролллер, если работать на уровне рефернес дизайна из AN.
из проблем только то что придется подбирать констрейны редактировать на предмет использования нестандартных ног.

2 gosha: вы случайно не спецвычислитель делает на rm7000 ?
gosha
Цитата(SFx @ Dec 18 2008, 10:42) *
могу пару слов сказать про DDR Xilinx.
Очень хороший контролллер, если работать на уровне рефернес дизайна из AN.
из проблем только то что придется подбирать констрейны редактировать на предмет использования нестандартных ног.

2 gosha: вы случайно не спецвычислитель делает на rm7000 ?


Вы говорите о xapp_200?

Для SFx: Олег, мы знакомы или нет?

Для des_00 дилетантские вопросы: в случае wishbone_bus, будет необходим буфер по записи, принимающий пакет c wb_bus и подсчитывающий длину буста. После этого производится запись в sdram. Дополнительно за счет буферизации вро-де бы должна увеличиваться пропускная способность?
des00
Цитата(gosha @ Dec 18 2008, 01:32) *
Увы, пока требуется ...
Какие характеристики cpu, dma_мастеров необходимы для сравнения характеристик sdram core?

не те характеристики вы пишете,
полоса в память сколько требуется ? (100/200/300 МБ/с)
размеры и выравнивание бурстов ? их характер ? требуемая латентность доступа к памяти ?

Цитата
2 шины - для исключения тактов ожидания от wb_arbiter (wb_req, wb_gnt).

всего 2 шины ? кого ждем ? однотактный арбитр вишбона(Wishbone classic only)

Код
module rrarb_1(request, grant, reset, clk);

input [1:0] request;
output [1:0] grant;
input reset;
input clk;
reg [1:0] grant;
reg last_winner;

always_ff @ (posedge clk) begin
    if (reset)             last_winner <= 0;
    else if (request)     last_winner <= get_winner(request);
end

always_comb begin
    grant <= 2'b00;
    grant[get_winner(request)] <= 1'b1;
end

function automatic bit get_winner(input reg [1:0] request);
case (request)
    2'b01: get_winner = 1'b0;
    2'b10: get_winner = 1'b1;
    2'b11: get_winner = last_winner+1'b1;
    default : get_winner = last_winner;
endcase      
endfunction

endmodule
...
rrarb_1 rra ({wbm_cyc_0, wbm_cyc_1}, {wbm_grant_0, wbm_grant_1}, reset, clk);

assign wbs_cyc = (wbm_cyc_0 & wbm_grant_0) | (wbm_cyc_1 & wbm_grant_1);
...


Цитата
Какие характеристики cpu, dma_мастеров необходимы для сравнения характеристик sdram core?


пока еще маловато данных

Цитата
Или Вы порекомендуете интегрировать в проект все core по очереди с запуском тестов пропускной способности на реальном железе?


это вам решать

Цитата
Также вопрос: С Вашей точки зрения система с раздельными шинами [cpu- sdram], [pci, ide- sdram]будет предположительно иметь лучшие характеристики, чем с единой шиной?

в случае wishbone_bus, будет необходим буфер по записи, принимающий пакет c wb_bus и подсчитывающий длину буста. После этого производится запись в sdram. Дополнительно за счет буферизации вро-де бы должна увеличиваться пропускная способность?


Вопрос о лучшести пока подвешен, но мне кажется что вы не представляете потенциальных проблем шины wishbone по работе с бурст транзакциями. Рекомендую вам почитать внимательно главу Wisnbone Register Feedback ее стандарта и попробывать на коленке сделать для этой реализации арбитр и слейв со случайным временем доступа smile.gif Оччень увлекательное занятие.

Как уже говорил, у вишбона есть потенциальные проблемы :
1. нет стандартной возможности сообщить слейву размер буртса (обходится тегами, но нужен специальный арбитр и специальный мастер)
2. отсутствие разнесенных транзакций, т.е. мастер выставил первый запрос и держит его до посинения, пока не получит ответ, только потом идет смена адресса/данных/транзакйии(это обходится сложнее, тут нужен специфический арбитр).
3. отсутствие требований на выравнивание бурст транзакции, т.е. в транзакции Linear Burst вы можете легко перейти в другой ряд памяти и это вызовет "дырку" в тех же командах к сдрам (в общем виде не обходится, только соглашениями как в AMBA на размеры сегментов).

Вот это вы должны учитывать в своей системе.

Реализация с буфером требует наложения ограничений на размеры бурста и как вы будете решать проблему латентности записи/чтения если бурст относительно большой?

В моем мосту Wishbone/HSSDRC (выложить пока не могу, ибо не тестирован хорошенько) запись идет "транзитом", практически без кеширования. А вот чтение сделано с кешированием по запросу. Это позволяет работать как с WbClassic так и с WbRegisterFeedback шинами, с поддержками WS в обоих направлениях, при разумной тактовой частоте %)
Но в любом случае, без специального арбитра очень сильно падает полоса памяти, из-за латентности чтения и отсутствия разнесенных транзакций в шине.

PS. посмотрите AMBA AXI, у нее таких проблем нет, правда ее реализация сложнее.

ЗЗЫ. арбитра не того скопировал, поправил, теперь точно однотактный %)
gosha
Цитата(des00 @ Dec 19 2008, 07:23) *
не те характеристики вы пишете,
полоса в память сколько требуется ? (100/200/300 МБ/с)
размеры и выравнивание бурстов ? их характер ? требуемая латентность доступа к памяти ?


Основной обмен данными cpu - sdram.
Загрузка кода- данных в кэш процессора/ сохранение кэша.
Происходит это пачками по 4x 32бит слова. Cpu cache line size=32 байта.- Как я понял, cpu периодически линейно заглатывает/выталкивает 2 burst по 4 32бит слова для заполнения/синхронизации кэша. Остальное, вероятнее всего, зависит от выполняемого кода.

ide-sdram dma: - по 2 32бит слова. Передается как правило, cтраница памяти (4096 байт), выравнена на границу 4096 байт.

Контроллер sdram должен работать с любыми модульками sodimm любого производителя.

Что такое характер бурстов?
Что такое требуемая латентность?

Требуется, чтобы контроллер sdram и sdram работала на чатоте 133 MHz, все остальное- сколько удастся добиться.

Также туплю- дилетанский вопрос: для работы контроллера hssdrc с модульком sdram (nranks > 1) требуется модификация кода hssdrc?
des00
Цитата(gosha @ Dec 23 2008, 02:28) *
Происходит это пачками по 4x 32бит слова. Cpu cache line size=32 байта.- Как я понял, cpu периодически линейно заглатывает/выталкивает 2 burst по 4 32бит слова для заполнения/синхронизации кэша.
ide-sdram dma: - по 2 32бит слова. Передается как правило, cтраница памяти (4096 байт), выравнена на границу 4096 байт.

Что такое характер бурстов?
Что такое требуемая латентность?


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

1. бурст 4 по 32 = 16 байт, странно ведь кеш 32 байта, это не сильно хорошо.
2. бурст 2 по 32 это очень плохо.
На запись еще куда не шло, на чтение (особенно режим по 2 слова), при использовании шины класса Wishbone это смерть всему. На каждой транзакции чтения вы потеряете ~5 тактов (CL + латентность контроллера). урезка полосы до 4/9 и 2/7 45% - 30 % соответственно.

Варианта 2 :
1. вместо 2х32 реализовать режим 16х32, все равно пишете/читаете линейный пакет.
2. сгоротить мини-кеш для линейных транзакций прямо на входе контроллера(я делал подобное, получается достаточно просто).

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

Вот и верхняя оценка полосы пропускания вашей системы. берем 64 бита на 133МГц, т.е. около 1 ГБ/с, в ваших режимах потери составят порядка 50-60 %, т.е. ваша система, при лобовой реализации, сможет прокачать не более 400-500 МБ/с.

Оптимизация в вашем случае возможна только за счет разумного управления банками, в виду отсутствия разнесенных транзакций на Wishbone разумное управление конвейером SDRAM команд результата почти не даст (правда выигрыш можно получить если сделать хороший wishbone арбитр, который будет разносить 2 мастера) .

Цитата
Также туплю- дилетанский вопрос: для работы контроллера hssdrc с модульком sdram (nranks > 1) требуется модификация кода hssdrc?


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

ЗЫ. Извините что долго не отвечал, работы много и как то вылетело из головы %)
gosha
Цитата(des00 @ Dec 30 2008, 07:27) *
ну вот хоть что то стало известно про характер бурстов, осталось узнать про латентность. Ну или по другому время доступа к данным (интересно в основном на чтение). По прежнему ничего не известно про полосу, но уже можно кое что оценить.
....

Варианта 2 :
1. вместо 2х32 реализовать режим 16х32, все равно пишете/читаете линейный пакет.
2. сгоротить мини-кеш для линейных транзакций прямо на входе контроллера(я делал подобное, получается достаточно просто).


Спасибо.

Рекомендации ре-дизайна сопряжения с cpu и ide_core принимаются. Т. к. основной обмен данными cpu-sdram, ide-sdram.

Но, кроме всего прочего, процессорка должна работать с любыми pci платами в режиме dma. Поэтому размер burst, кроме cpu и ide, должен поддерживаться любой.

Не срочно, но пожелания по контроллеру HSSDRC: хотелось бы, чтобы была возможность работать с модульками dimm, sodimm. (напр nranks=2; 4 bank в каждом rank), интересовал бы Ваш вариант сопряжения с HSSDRC wishbone bus.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.