Как MemReq и MemResp точно работают в RoccIO - RISCV

Я пытаюсь понять, как я могу читать и записывать в память в RISCV, когда я использую RoCCIO. Но я не мог четко понять, что происходит. Особенно как мне обращаться к памяти или как работать с памятью tag, Есть ли какие-нибудь ресурсы, которые я могу найти, как я могу передавать данные между ядром Rocket и моим ускорителем?

в uncore/src/main/scala/consts.scala Путь они упомянули другой тип памяти cmd, А что еще?

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

Спасибо

1 ответ

В интерфейсе RoCC mem Поле является подключением к кэш-памяти L1. dmem Поле является подключением к кэшу L2. Какой из них вы хотите использовать, зависит от требований к пропускной способности памяти вашего ускорителя.

Rocket и RoCC Accelerator могут обмениваться данными через кэши (не забудьте использовать fence инструкции на ядре Rocket, чтобы упорядочить память правильно), или вы можете напрямую передавать данные в Rocket через resp поле в RoCCIO.

IO кэша L1 можно найти в Rocket ( https://github.com/ucb-bar/rocket/blob/master/src/main/scala/nbdcache.scala), а IO L2 можно найти в uncore ( https://github.com/ucb-bar/uncore/blob/master/src/main/scala/tilelink.scala).

Хотя я не знаю какая память tag Вы имеете в виду, как правило, tag передается через систему памяти и возвращается к вам с нетронутым ответом (если у вас есть несколько запросов в полете, этот возвращаемый тег помогает вам определить, какой есть какой).

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

Другие вопросы по тегам