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

RISC-V ветвление

через стадию Instruction Decode нужно пробрасывать и PC, и NextPC (т.е. два 32-битных значения; обычно NextPC = PC + 4 для 32-битных команд, но для RV32C возможно так же PC + 2), несмотря на то, что они там не нужны. Потому что при ветвлении (вернее, при вызове функции - т.е. прыжок по адресу, затем возврат на следующую за прыжком инструкцию), если условие выполнено, в регистр назначения будет сохранено значение NextPC, а в сам Program Counter будет загружено PC + Offset, вычисленное или АЛУ, или отдельным сумматором.

С одной стороны, параллельный регистр дёшев и прост, так что нет смысла как-то хитрить и передавать по конвейеру только PC или только NextPC (пробрасывая, разумеется, признак длины команды - но для RV32 это всего лишь 1 бит). С другой стороны, это 64 сигнальных линии, проходящие сквозь стадию "просто так". А ещё это восемь 8-битных регистров на входе и ещё 8 на выходе -- шестнадцать регистров только для того, чтобы организовать конвейеризацию значения Program Counter!

С другой стороны, операция PC+4 (или PC+2) схемотехнически не очень сложна, несмотря на то, что это всё-таки сложение (нужен перенос), так как почти все биты второго слагаемого всегда равны нулю. Почти наверняка можно как-то подхитрить, чтобы сделать вместо сумматора "PC+Offset" сделать "PC+Offset+4". Я пока не могу сообразить, как именно это сделать, но интуцация подсказывает, что надо как-то влезть в перенос во втором или третьем разряде.

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

С третьей стороны, можно взять сдвиговые регистры .. проводов будет меньше, а вот гемора с синхронизацией - больше
Tags: 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