Реализация кэша в конвейерном процессоре - PullRequest
3 голосов
/ 10 мая 2019

Я недавно начал кодировать в Verilog. Я завершил свой первый проект по созданию прототипа процессора MIPS 32 с использованием 5-этапной конвейерной обработки. Теперь моя следующая задача - внедрить одноуровневую кэшированную иерархию в памяти набора команд.

Я успешно реализовал двухсторонний набор ассоциативного кэша. Ранее я объявлял память набора команд как массив регистров, поэтому всякий раз, когда мне нужно получить доступ к следующей инструкции на этапе IF, данные (инструкция) мгновенно распределяются в регистр для дальнейшего декодирования (поскольку назначение блокирования / неблокирования происходит мгновенно из любая ячейка памяти).

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

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

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

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

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

P.S. Я новичок в компьютерной архитектуре и verilog. Я не знаю много о СБИС. Это мой первый вопрос, потому что какие бы вопросы ни возникали, я легко могу найти их на веб-страницах, но не могу найти много подробностей об этой проблеме, поэтому я здесь.

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

1 Ответ

6 голосов
/ 10 мая 2019

Но законен ли этот обходной путь ??

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

A классический 5-ступенчатый RISC конвейер предполагает и рассчитан на задержку одного цикла для кеша попадания (и одновременный доступ к данным и кешу инструкций), но останавливается при пропуске кеша .(Расчет загрузки / хранения адреса происходит в EX, а доступ к кешу в MEM, поэтому эта стадия существует)

Задержка логически эквивалентна вставке NOP, так что вы можете сделать это в кешеМисс.Счетчик программы не должен увеличиваться, но в остальном это должно быть довольно локальное изменение.

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


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

MIPS У меня были слоты задержки загрузки (вы не можете использовать результат загрузки в следующей инструкции, потому что этап MEM находится после EX).Таким образом, это правило ISA скрывает задержку в 1 цикл при обращении к кешу, не требуя, чтобы HW обнаружил зависимость и остановил ее.

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

Более поздние версии MIPS удалили слот задержки загрузки, чтобы избежать вздутия кода с NOP, когда компиляторы не могли заполнить слот.Затем Simple HW пришлось обнаруживать зависимость и останавливаться, если это необходимо, но более умное оборудование, вероятно, отслеживало нагрузки в любом случае, чтобы они могли попадать под промах и так далее.Не останавливать конвейер до тех пор, пока инструкция фактически не попытается прочитать результат загрузки, который не был готов.

MIPS = "Микропроцессор без блокированных этапов конвейера" (то есть без обнаружения опасности для данных).Но он все равно должен был остановиться из-за пропусков в кеше.
Альтернативное расширение для аббревиатуры (которое все еще соответствует MIPS II, где слот задержки загрузки, как удалено, требующий блокировок HW для обнаружения этой опасности данных) будет «Минимально заблокированными этапами конвейера»но, по всей видимости, я обдумал это, спасибо @PaulClayton за то, что поймал это.

...