我试图弄清楚当我使用 RoCCIO 时如何在 RISCV 中读取和写入内存。但我无法清楚地了解发生了什么。特别是如何对内存进行寻址或者如何使用内存标签
。
我可以找到如何在 Rocket 核心和加速器之间传输数据的资源吗?
在uncore/src/main/scala/consts.scala
路径中,他们提到了不同类型的内存cmd
。但还有什么?
例如,我想传递数组的起始地址和我计划提取到加速器中的元素数量,然后开始提取它们。我应该使用什么信号?
谢谢
最佳答案
在 RoCC 接口(interface)中,mem
字段是与 L1 缓存的连接。 dmem
字段是到 L2 缓存的连接。您要使用哪一种取决于加速器的内存带宽要求。
Rocket 和 RoCC 加速器可以通过缓存共享数据(请记住在 Rocket 核心上使用 fence
指令,以便内存排序正确),或者您可以通过缓存直接向 Rocket 提供数据RoCCIO 中的 resp
字段。
L1 缓存的 IO 可以在 Rocket 的 ( https://github.com/ucb-bar/rocket/blob/master/src/main/scala/nbdcache.scala ) 中找到,而 L2 IO 可以在 uncore 的 ( https://github.com/ucb-bar/uncore/blob/master/src/main/scala/tilelink.scala ) 中找到。
虽然我不知道您指的是哪个内存标签
,但通常标签
会通过内存系统传递并返回给您,并且响应不变(如果您有多个正在进行中的请求,此返回标签可帮助您识别哪个是哪个)。
我怀疑如果您想获取一组数据,您将需要一个状态机来请求加速器中的每个单独地址。除非您通过 L2 缓存接口(interface),在这种情况下我相信它以缓存行大小为单位。
关于cpu-architecture - MemReq 和 MemResp 在 RoccIO 中如何工作 - RISCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30744328/