Где в цикле Fetch-Execute значение через адресный режим декодируется - PullRequest
0 голосов
/ 22 апреля 2010

В настоящее время я создаю небольшой процессорный интерпретатор, который поддерживает несколько режимов адресации, в том числе регистровую и смещенную Он использует классический RISC-конвейер IF-ID-EX-MEM-WB. На какой стадии конвейера декодируется значение для адресного операнда. Например:

addw r9, (r2), 8 (r3)

На каком этапе (r2) и 8 (r3) будут декодированы в их фактические значения?

Ответы [ 3 ]

1 голос
/ 09 сентября 2013

Как отметил Ян Грей, указанная вами инструкция CISC addw r9, (r2), 8(r3) не отображается непосредственно на RISC-конвейер IF-ID-EX-MEM-WB.

Но вместо того, чтобы создавать конвейер IF-ID-EA-RD1-RD2-EX-WR (который, как мне кажется, не подходит для этого случая, по крайней мере, не в моей нотации), вы также можете рассмотреть вопрос о разрыве CISC инструкция по RISC-подобным микроинструкциям

tmp1 := load Memory[ r2 ]
tmp2 := load Memory[ 8+r3 ]
r9 := addw tmp1 + tmp2

С этим разложением (микрооперацией), адресные вычисления (r2) и 8 (r3) будут выполняться в их соответствующих трубопроводах EX, и фактический доступ к памяти внутри и вокруг конвейера MEM.

Как упоминает Ян, у i486 был другой конвейер, так называемый load-op pipe: IF-ID-AGU-MEM-EX-WB, где AGU - блок генерации адреса / конвейер.

Это разрешает другое разложение мопов

tmp1 := load Memory[ r2 ]
r9 := addw tmp1 + load Memory[ 8+r3 ]

с адресными вычислениями (r2) и 8 (r3), выполненными в конвейере AGU.

1 голос
/ 15 ноября 2010

Забавный вопрос.

Одним из свойств архитектур RISC является операция регистр-регистр. То есть все операнды для команд вычислений, таких как ADD, уже должны быть в регистрах. Это позволяет реализациям RISC использовать обычный конвейер, такой как конвейер IF-ID-EX-MEM-WB, который вы упомянули в своем вопросе. Это ограничение также упрощает доступ к памяти и исключения. Например, если единственными инструкциями для чтения данных из памяти являются инструкции загрузки, и если эти инструкции имеют только простой режим адресации, такой как регистр + смещение, то данная инструкция может вызывать не более одного исключения защиты памяти.

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

Тем не менее, микроархитектуры успешно конвейеризировали архитектуры CISC. Например, у Intel 486 был конвейер, который позволял операндам и результатам считываться / записываться в память. Таким образом, при реализации ADD [eax], 42, был этап конвейера для чтения [eax] из d-кэша 8 КБ, этап конвейера для выполнения добавления и еще один этап конвейера для записи суммы в [eax] .

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

Таким образом, чтобы приспособиться к этим режимам адресации CISCy, вам может потребоваться конвейер IF-ID-EA-RD1-RD2-EX-WR (EA = eff addr, RD1 = read op 1, RD2 = read op 2, WR = write результат в RAM или reg файл).

Счастливого взлома.

0 голосов
/ 25 мая 2012

Как упоминал Ян Грей, инструкция, которую вы пытаетесь выполнить, на самом деле не работает для этого конвейера. Вам необходимо загрузить данные на этапе MEM и выполнить некоторые математические операции с ними на этапе EX (который находится перед mem).

Чтобы ответить на другой связанный вопрос, хотя, если вы хотите сделать:

Load R9, 8(R3)

Значение для «значения для операнда с измененным значением» вычисляется на стадии EX.

...