Использование синхронной памяти

Архитектура СнК, разработка RISC-ядра, функциональная верификация, разработка инструментальных средств, прототипирование и отладка на FPGA

Модератор: Интегральный вычислитель

Использование синхронной памяти

Сообщение Интегральный вычислитель » 14 мар 2010, 00:04

Хочу напомнить разработчикам ядра, что вся современная память является синхронной (и on-chip и off-chip). Поэтому нужно делать конвейер с учетом того, что чтение из памяти происходит за такт, а не по принципу комбинационной схемы.

Однако не нужно расстраиваться, на число ступеней конвейера это не должно повлиять.


Можно сделать следующим образом:
Вместо схемы выборки из асинхронной кодовой памяти:
Изображение

Получаем схему выборки из синхронной памяти:
Изображение



И коронный номер: ступень доступа к памяти данных:
Асинхронный вариант:
Изображение
Синхронный:
Изображение
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Использование синхронной памяти

Сообщение Интегральный вычислитель » 14 мар 2010, 13:44

Что-то перемудрил с сумматорами на ступени выборки:
1) При сбросе счётчика в 0 - чтение начнётся с PC + 4, что неверно (нужно перенести сумматор после PC в петлю обратной связи, чтобы он был до него)

Да, не додумал. Получается надо усложнить схему сброса. Чтобы на первом такте работы процессора на выходе из памяти команд уже было значение команды по нулевому адресу.
2) Зачем temp_reg перед конвейерным регистром? будет лишняя задержка в такт

См. пункт 1. На первом такте на выходе из temp_reg должно быть значение PC+4.

3) Палташев настаивал на двухфазной логике - память на деле такой является?
4) Если 3-ий пункт не верен, то придётся ступень MEM разбивать на две - запись в память и чтение из памяти.

На самом деле у нас нет кэша, поэтому используется два типа памяти.
1) Память подключенная напрямую к ядру. Которая все время дает 'кэш попадание'.
2) Память подключенная через шину, которая все время дает 'кэш промах'.

Если я правильно тебя понимаю, тебя волнует вопрос: "А что произойдет если на одном такте мы одновременно записываем значение в память (MEM stage) и читаем его как команду (IF)". Т.к. на деле используется block ram в fpga, то её поведение можно настроить: будет прочитано либо новое значение, либо старое. См WRITE_MODE в приложенном документе.


По поводу референс модели кешей - i_ack и d_ack сбрасываются только если блок памяти по выставленному адресу отсутствует в кешах?

Да, а должно быть что-то еще?

Я только проснулся, сейчас выпью чаю и сделаю тебе модельку кэша, чтобы было на что ориентироваться. Часика через 2-3 выложу здесь.
Вложения
xapp463.pdf
(415.17 Кб) Скачиваний: 760
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Использование синхронной памяти

Сообщение Интегральный вычислитель » 14 мар 2010, 14:03

Поправка: скорей всего память будет работать в режиме READ_FIRST
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Использование синхронной памяти

Сообщение MIX@ » 14 мар 2010, 14:15

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

Не обязательно усложнять схему сброса. Достаточно сделать так, чтобы на память через мультиплексор подавалось оригинальное значение из PC. Т.е. переместить сумматор между PC и мультиплексором в петлю обратной связи (чтобы он стоял до PC). Т.е. с PC будет сниматься адрес текущей команды, которую нужно прочесть, а на него подаваться адрес следующей команды (PC + 4). Тогда ещё и отпадает нужда во втором сумматоре, который идёт на temp_reg.

Интегральный вычислитель писал(а):См. пункт 1. На первом такте на выходе из temp_reg должно быть значение PC+4.

Насколько я понял - temp_reg нужен для создания искусственной задержки на такт из-за синхронной природы памяти (именно чтобы передать по конвейеру PC+4, вместе со значением команды, выбранной по PC).


Интегральный вычислитель писал(а):Если я правильно тебя понимаю, тебя волнует вопрос: "А что произойдет если на одном такте мы одновременно записываем значение в память (MEM stage) и читаем его как команду (IF)". Т.к. на деле используется block ram в fpga, то её поведение можно настроить: будет прочитано либо новое значение, либо старое. См WRITE_MODE в приложенном документе.


С моей точки зрения - это две разные памяти. Эмуляцию этого я получаю через интерфейс.
Я говорил про структурные конфликты - если в один такт происходит и чтение и запись в память данных, то для однофазной логики это проблема. Изначально не продумал вопрос, так как на деле - такого не получается (у нас не может произойти чтение и запись в память данных одновременно, по крайней мере в случае in-order исполнения), поэтому вопрос снимается.
Аватара пользователя
MIX@
 
Сообщения: 115
Зарегистрирован: 08 апр 2008, 11:57

Re: Использование синхронной памяти

Сообщение Интегральный вычислитель » 14 мар 2010, 14:20

Но вопрос насчёт двухфазной логики остаётся открытым (например для регистрового файла) - будет она в блочной памяти или целиком на триггерах.

Детали реализации конвейера не моя головная боль =) Но мне кажется что block ram будет работать быстрее. Нужно экспериментировать.
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Использование синхронной памяти

Сообщение MIX@ » 14 мар 2010, 14:38

Интегральный вычислитель писал(а):
Но вопрос насчёт двухфазной логики остаётся открытым (например для регистрового файла) - будет она в блочной памяти или целиком на триггерах.

Детали реализации конвейера не моя головная боль =) Но мне кажется что block ram будет работать быстрее. Нужно экспериментировать.


Я к тому, что на block ram MS-триггер не реализовать. Даже с учётом режима WRITE_FIRST.
Аватара пользователя
MIX@
 
Сообщения: 115
Зарегистрирован: 08 апр 2008, 11:57

Re: Использование синхронной памяти

Сообщение Интегральный вычислитель » 14 мар 2010, 15:39

Выкладываю черновую модель памяти.
run.do - скрипт для квестасима.
образ памяти получен из си-программы: http://embedded.ifmo.ru/repos/mips_cpu/mips_c_demo/ (см. makefile)

адреса 0:1023 отображены на blockram, все остальное считается висящем на шине.
Задержка шины - 1 такт, что весьма условно. В конечной реализации выкачивание данных из шины может занимать несколько тактов.
Вложения
memmodel.zip
(28.2 Кб) Скачиваний: 384
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Использование синхронной памяти

Сообщение MIX@ » 14 мар 2010, 19:55

Продумал много схем выборки и пришёл к выводу, что для памяти с чтением и записью по одному фронту (однофазная логика) при любом изменении адреса (например, при переходе) дополнительно придётся останавливать конвейер на один такт.
Аватара пользователя
MIX@
 
Сообщения: 115
Зарегистрирован: 08 апр 2008, 11:57

Re: Использование синхронной памяти

Сообщение Интегральный вычислитель » 14 мар 2010, 21:09

Можешь привести подробный пример проблемной ситуации?
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Использование синхронной памяти

Сообщение MIX@ » 14 мар 2010, 22:06

Интегральный вычислитель писал(а):Можешь привести подробный пример проблемной ситуации?


Дело в том, что принятие решения о переходе формируется в течение соответствующего такта. Соответственно, и адрес перехода появится на входе памяти не сразу (не по фронту). Т.е. на выходе памяти к моменту определения адреса перехода будут значение ещё со старого адреса и по очередному фронту мы запишем старое значение в первый конвейерный регистр и только потом память защёлкнет значение нового адреса перехода и начнёт выборку.

Пример для твоей схемы (допустим, проблему с резетом решили):

Значение счётчика команд: 4
Значение на адресной шине памяти: 8
Значение на выходной шине данных памяти: Mem[4]
Фронт.
Значение с выхода памяти Mem[4] записалось в первый конвейерный регистр.
Значение счётчика команд: 8
Значение на адресной шине памяти: 12
Значение на выходной шине данных памяти: Mem[8]

Допустим, при декодировании выяснилось, что команда по адресу 4 - команда перехода и он должен состояться.
На адресной шине памяти вместо 12 устанавливается адрес перехода (допустим, 28), но на выходной шине данных держится значение Mem[8]

Фронт.
Значение с выхода памяти Mem[8] записалось в первый конвейерный регистр, хотя должна была быть выбрана команда по адресу 28.
И только в течение данного такта произойдёт выборка команды по адресу 28 из памяти.

Вроде бы и ничего - вполне себе задержанный переход, но есть ещё команды branch likely, где команда в задержанном переходе исполняется не всегда.
Update: + к тому, ещё и вектора исключений.
Аватара пользователя
MIX@
 
Сообщения: 115
Зарегистрирован: 08 апр 2008, 11:57

Re: Использование синхронной памяти

Сообщение Интегральный вычислитель » 15 мар 2010, 10:40

Все, теперь понял.

Вроде бы и ничего - вполне себе задержанный переход, но есть ещё команды branch likely, где команда в задержанном переходе исполняется не всегда.
Update: + к тому, ещё и вектора исключений.


Если мы всегда можем вычислить адрес бранча на ступени ID, то принципиальных проблем быть не должно.

1) В спеке явно прописано, что после Branch и Jump есть delay слот.
2) Про Branch Likely:
Software is strongly encouraged to avoid the use of the Branch Likely instructions, as they will be removed from a
future revision of the MIPS Architecture.
In the MIPS I architecture, this instruction signaled a Reserved Instruction Exception.
Насколько я знаю, компилятор их вообще не использует. Поэтому можно не реализовывать.
Однако не вижу проблем реализовать логику убивания команд в delay слоте на этапе ID.

3) Проблему с прерываниями ты не пояснил.
Насколько мне видится, основная проблема - риск залить адрес команды из delay слота в EPC. Тогда переход после выхода из прерывания не выполниться.
Топорное решение: отключать запись EPC в delay слоте. Тогда в EPC останется адрес команды перехода, которая заново выполниться после выхода из прерывания.
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса


Вернуться в ANCILE: создание системы на кристалле

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1