【问题标题】:How do MemReq and MemResp exactly work in RoccIO - RISCVMemReq 和 MemResp 如何在 RoccIO 中准确工作 - RISCV
【发布时间】:2015-06-09 23:05:04
【问题描述】:

我试图弄清楚在使用 RoCCIO 时如何在 RISCV 中读取和写入内存。但我无法清楚地了解发生了什么。尤其是我该如何处理内存或者我应该如何使用内存tag。 是否有任何资源可以帮助我在 Rocket 核心和我的加速器之间传输数据?

uncore/src/main/scala/consts.scala 路径中,他们提到了不同类型的内存cmd。但是还有什么?

例如,我想将数组的起始地址和计划提取的元素数量传递到加速器中,然后开始提取它们。我应该使用什么信号?

谢谢

【问题讨论】:

  • 您应该查看提供的有关 Rocket-Chip 的文档和位于 (riscv.org/workshop-jan2015/…) 和 (riscv.org/workshop-jan2015.html) 的 RoCC 接口。他们可以为您指出代码示例。
  • 谢谢 Chris,但我已经看过他们所有的文档和幻灯片,即使是伯克利 CS 250 课程的讲座幻灯片,但我找不到关于传输数据的问题的答案
  • 您查看提供的 SHA3 示例加速器了吗? github.com/ucb-bar/rocc-template/tree/sha3
  • 是的,我见过。我试图找出ctrl 模块中发生的事情,但我无法清楚地找出这就是我提出这个问题的原因

标签: cpu-architecture riscv chisel


【解决方案1】:

在 RoCC 接口中,mem 字段是到 L1 缓存的连接。 dmem 字段是到 L2 缓存的连接。您要使用哪一个取决于您的加速器的内存带宽要求。

Rocket 和 RoCC 加速器既可以通过缓存共享数据(记得在 Rocket 内核上使用fence 指令,这样内存排序是正确的),也可以通过resp 中的字段直接向 Rocket 提供数据RoCCIO。

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 缓存接口,在这种情况下,我相信它来自缓存行大小。

【讨论】:

  • 谢谢克里斯!,你的帖子对我很有帮助。我应该阅读更多,可能会再次提问!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 2018-09-10
  • 2013-07-21
相关资源
最近更新 更多