‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Categories:

worklog: блок управления форвардингом

Блок работает внутри стадии Decode (Fetch - Decode - Execute - Memory - Writeback).





Нужен для проброса данных "против течения" конвейера - когда блоку вычислений понадобятся результаты работы следующих стадий, ещё не успевшие осесть в регистрах, то их надо выдёргивать прямо с промежуточных участков. Для этого должны выполниться определённые условия:
1) если надо читать из регистра с тем же индексом, в который писала предыдущая или пред-предыдущая операция (находящиеся, соотв., на стадиях Execute или Memory),..
2) и это не регистр ZERO (потому что в него выбрасываются данные, которые надо забыть; читается всегда ноль)

Если предыдущая операция была загрузкой из памяти и при этом ещё выполнились два предыдущих условия, тогда конвейер надо придержать (STALL) на минимум 1 щелчок. Пред-предыдущая загрузка из памяти задержку по-умолчанию не требует (если память успела их предоставить за 1 такт, конечно же).

Соотв., при выполнении этих условий включается мультиплексор на входе стадии E, который либо копирует данные с её же выхода (но с предыдущего такта), либо с выхода стадии M (т.е. с пред-предыдущего такта). При этом у стадии E приоритет над M, потому что если обе этих стадии нацеливают запись в один и тот же регистр, то запись из E всё равно сотрёт данные от M. Запись в регистры общего назначения не имеет побочных эффектов, поэтому перезаписанные данные не важны - важно только текущее значение.

В финальной схеме, управляющей обоими каналами RS1 и RS2, сигнал LOAD_STALL формируется как (DE_RS1 OR DE_RS2) AND E_IS_LOAD: вне зависимости от того, в какой канал надо положить данные, задержка нужна одна и та же.
Tags: risc-v, worklog
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments