Как 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, в этом случае я считаю, что он имеет размер строки кэша.