我试图弄清楚当我使用 RoCCIO 时如何在 RISCV 中读取和写入内存。但我无法清楚地了解发生了什么。尤其是我如何处理内存或者我应该如何使用内存tag
。是否有任何资源可以找到如何在 Rocket 核心和我的加速器之间传输数据?
他们在uncore/src/main/scala/consts.scala
路径中提到了不同类型的内存cmd
。但还有什么?
例如,我想将数组的起始地址和计划提取的元素数量传递到加速器中,然后开始提取它们。我应该使用什么信号?
谢谢
我试图弄清楚当我使用 RoCCIO 时如何在 RISCV 中读取和写入内存。但我无法清楚地了解发生了什么。尤其是我如何处理内存或者我应该如何使用内存tag
。是否有任何资源可以找到如何在 Rocket 核心和我的加速器之间传输数据?
他们在uncore/src/main/scala/consts.scala
路径中提到了不同类型的内存cmd
。但还有什么?
例如,我想将数组的起始地址和计划提取的元素数量传递到加速器中,然后开始提取它们。我应该使用什么信号?
谢谢
在 RoCC 接口中,该mem
字段是到 L1 缓存的连接。该dmem
字段是到 L2 缓存的连接。您要使用哪一个取决于您的加速器的内存带宽要求。
Rocket 和 RoCC 加速器可以通过缓存共享数据(记得在 Rocket 内核上使用指令,这样内存排序是正确的),也可以通过RoCCIO 中fence
的字段直接给 Rocket 数据。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)。
虽然我不知道tag
您指的是哪个内存,但通常情况下tag
它会通过内存系统并返回给您,并且响应不会受到影响(如果您有多个请求正在进行,这个返回标签可以帮助您识别哪个是哪个)。
我怀疑如果您想获取一组数据,您将需要一个状态机来请求加速器中的每个单独的地址。除非您通过 L2 缓存接口,在这种情况下,我相信它来自缓存行大小。