cpu-architecture - MemReq 和 MemResp 在 RoccIO 中如何工作 - RISCV

标签 cpu-architecture riscv chisel

我试图弄清楚当我使用 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/

相关文章:

qemu - RISC-V : Illegal instruction exception when switching to supervisor mode

pointers - 为什么这个跳转指令在执行指针追逐时如此昂贵?

linux - 将目标文件转换为另一种体系结构

riscv - 在spike中运行使用riscv64-unknown-linux-gnu-gcc编译的二进制文件时出现段错误

riscv - RISC V LD 错误 - (.text+0xc4) : relocation truncated to fit: R_RISCV_JAL against `*UND*'

riscv - 解释 Chisel3 <> vs := ?

scala - 如何使用uint进行位提取

scala - 在for循环chisel3中使用yield时如何访问前一个元素

c - 需要编写一个程序,该程序采用汇编语言程序并生成相应的机器语言

c - dll 的 dumpbin 输出中的 "virtual address"