我可以流水线化多周期 risc v 核心吗?如何?

问题描述 投票:0回答:1

我有一个 risc v 多周期核心 picorv32,每条指令都经过 3 个阶段获取、加载寄存器并执行,这是三个主要的其他操作也在执行,所以我想将其流水线化,使 1 条指令的阶段与下一条指令的阶段重叠。谁能指导我该怎么做

我已经成功地使用 gcc 和 verilator 运行核心,并使用 gtkwavethis image is not mine just using as reference 查看了它的波形,一开始我不知道如何以及从哪里开始对其进行管道化,即使它只是一个管道化寄存器,因为整个核心代码都是用单个管道编写的模块与所有内容混合在一起,我只是迷失了,无论我尝试什么,它都一直失败......任何想法

architecture pipeline cpu-architecture riscv multicore
1个回答
1
投票

在您所描述的多周期设计中,大部分硬件都用于 3 个管道阶段(获取、解码、执行),尽管控制器会在指令从一个阶段移动到另一个阶段时选择性地停用单元。

硬件设计是完成指令集中任何和所有指令所需的所有子设计的联合。硬件很难关闭(模数高级低功耗设计),因此当硬件设计的某些方面不适用时,常见的方法是简单地忽略其结果。

例如,ALU 可以进行加法、减法、比较、与、或等运算。但我们一次只需要它执行其中一项操作,那么其他电路会发生什么情况,即如果我们想要加法,那么怎么办和,或电路等?答案是它们并没有被关闭,而是它们执行各自的操作,只是稍后被忽略。因此,在 ALU 内部,所有这些操作都是并行执行的,即使最终只使用其中一个操作 — 只有一个被接受作为 ALU 输出(而其他操作被丢弃,即简单地丢失)。

因此,停用通常是忽略结果并且不改变状态的问题,即使内部电路实际上正在做事情。对于取指单元,停用可能意味着不向指令高速缓存发出取指指令,也不接受 PC+4 作为下一个 PC 值。对于解码单元,停用可能意味着忽略寄存器和控制值 - 最有可能的是这些在被馈送到执行的寄存器值中被忽略。对于执行单元来说,去激活意味着不读取或写入数据缓存,也不进行寄存器写入。

(如果您的多周期设计具有共享指令和数据缓存,这可能会使取指令与数据存储器读/写重叠变得困难,因此您可能会将取指令与解码重叠,或者可能将解码与执行重叠。)

因此,我们的想法是,多周期控制器激活一个又一个单元,同时停用其他单元 - 但执行每个阶段的硬件仍然存在并且可能会被使用,只要相同的电路没有被使用/共享对于另一个阶段中的其他东西(特别是在这里,考虑内部寄存器,或者在两个不同阶段中使用相同的加法器 - 解决方案是复制这些以梳理共享。)

© www.soinside.com 2019 - 2024. All rights reserved.