E203 RISC-V处理器采用流水线停顿(Pipeline Stall) 结合执行单元阻塞的方式来解决乘法和除法这类多周期指令的数据相关性(主要是Read After Write, RAW)问题。
以下是其工作原理的详细说明:
核心机制:流水线停顿
- 问题本质: 当一条后续指令(例如
add t1, t0, t2)的操作数依赖于前面一条尚未执行完的乘法或除法指令(例如 mul t0, a0, a1)的结果时,就发生了RAW数据冒险。如果后续指令在t0准备好之前就试图读取它,就会得到错误的值。
- E203的解决方案: E203检测到这种相关性后,会暂停整个流水线中所有阶段(Fetch, Decode, Execute, Memory, Write-Back)的推进。具体来说:
- 取指阶段(Fetch)停止获取下一条指令(PC不再更新)。
- 译码阶段(Decode)冻结当前处于译码阶段的指令。
- 执行阶段(Execute)维持乘法器/除法器的执行状态,让其继续工作。
- 访存阶段(Memory)和写回阶段(Write-Back)也会冻结,它们的输出(包括旁路)在停顿期间保持不变。
检测点和阻塞信号
- 相关性检测: 相关性检测通常发生在译码(Decode)阶段或执行(Execute)阶段的早期。硬件会比较后续指令的源寄存器编号(
rs1, rs2)与所有当前正在执行中的多周期指令的目标寄存器编号(rd)。
- 乘法器/除法器状态: 乘法器(Multiplier)和除法器(Divider)在执行单元内部。它们有自己的控制逻辑,会向流水线控制单元发送信号,表明自己当前是否“忙碌”(Busy)——即正在执行一条需要多个周期的指令且结果尚未准备好。
- 阻塞信号的产生: 如果检测到:
- 当前处于译码(或执行早期)的指令的源寄存器依赖于任何一个正在执行中且结果未准备好(Busy)的乘法器或除法器的目标寄存器。
- 或者,即使没有显式的寄存器依赖,但乘法器或除法器本身处于忙碌状态(这主要解决结构性冒险,但有助于简化控制),E203也可能会选择保守地阻塞流水线。不过,解决RAW相关性是核心触发条件。
- 流水线控制逻辑(Pipeline Controller): 接收来自相关性检测单元和乘除法单元的信号。一旦确认存在依赖且乘除法单元忙碌,控制器立即发出全局的流水线停顿信号(Pipeline Stall Signal)。
停顿期间的操作
- 乘除法单元: 在流水线停顿期间,乘除法单元不受影响,继续执行它们的多周期计算。它们利用这些额外的周期完成运算。
- 流水线寄存器: 所有流水线寄存器(IF/ID, ID/EX, EX/MEM, MEM/WB)的写使能(Write Enable) 被关闭。这意味着这些寄存器中锁存的指令信息、数据和控制信号在停顿期间保持不变,不会随着时钟推进而更新到下一条指令的状态。
- 其他执行单元: 由于流水线完全停顿,ALU、LSU等其他执行单元也自然停止了工作。
停顿的结束
- 当乘法器或除法器完成计算(结果有效),它向流水线控制单元发送
ready 或 done 信号,并置 busy 为低。
- 流水线控制逻辑解除流水线停顿信号。
- 在下一个时钟周期,冻结的流水线寄存器重新开始采样输入信号(即之前被冻结的指令状态),流水线恢复流动。此时,乘法或除法指令的结果(在EX/MEM或MEM/WB寄存器中)已经准备好,可以被后续指令通过寄存器文件或旁路路径(如果设计包含)正确读取。
总结E203处理多周期指令(乘法/除法)数据相关性的关键点:
- 顺序执行核心: E203是一个顺序单发射流水线处理器,没有复杂的乱序执行(OoO)或寄存器重命名机制。
- 保守停顿: 一旦检测到后续指令的操作数依赖于正在执行的多周期指令结果,并且该结果尚未准备好,整个流水线就会被完全停顿。
- 执行单元控制: 乘法器和除法器独立执行,在停顿期间继续工作直至完成。
- 保持状态: 停顿期间,流水线各阶段的状态被冻结,直到多周期指令完成。
- 恢复执行: 多周期指令完成后,流水线解除停顿,冻结的指令继续执行,此时它们可以访问到正确的操作数。
这种方法的优缺点:
- 优点:
- 硬件实现极其简单,控制逻辑复杂度低。这是面积和功耗敏感型嵌入式处理器(如E203)的首要目标。
- 逻辑清晰可靠,易于验证。
- 缺点:
- 性能损失: 停顿期间处理器完全“卡住”,不能执行任何其他指令,即使是与乘除法无关的指令也无法执行。这显著降低了流水线的吞吐量和效率,尤其是在频繁使用多周期指令时。
- 无法利用指令级并行(ILP): 停顿阻塞了所有指令,无法利用停顿期间可能可以执行的不相关指令。
因此,E203的这种设计体现了其在追求极致小面积和低功耗的目标下,对高性能的妥协。它在低频率、低性能需求的IoT和嵌入式控制场景中是可行的方案。对于需要更高性能的应用,则需要考虑引入旁路(Forwarding/Bypassing)来解决短延迟指令的数据冒险,或者采用更复杂的乱序执行机制来处理长延迟操作。但在E203这个特定的设计中,选择了最简单直接的流水线完全停顿方案。
E203 RISC-V处理器采用流水线停顿(Pipeline Stall) 结合执行单元阻塞的方式来解决乘法和除法这类多周期指令的数据相关性(主要是Read After Write, RAW)问题。
以下是其工作原理的详细说明:
核心机制:流水线停顿
- 问题本质: 当一条后续指令(例如
add t1, t0, t2)的操作数依赖于前面一条尚未执行完的乘法或除法指令(例如 mul t0, a0, a1)的结果时,就发生了RAW数据冒险。如果后续指令在t0准备好之前就试图读取它,就会得到错误的值。
- E203的解决方案: E203检测到这种相关性后,会暂停整个流水线中所有阶段(Fetch, Decode, Execute, Memory, Write-Back)的推进。具体来说:
- 取指阶段(Fetch)停止获取下一条指令(PC不再更新)。
- 译码阶段(Decode)冻结当前处于译码阶段的指令。
- 执行阶段(Execute)维持乘法器/除法器的执行状态,让其继续工作。
- 访存阶段(Memory)和写回阶段(Write-Back)也会冻结,它们的输出(包括旁路)在停顿期间保持不变。
检测点和阻塞信号
- 相关性检测: 相关性检测通常发生在译码(Decode)阶段或执行(Execute)阶段的早期。硬件会比较后续指令的源寄存器编号(
rs1, rs2)与所有当前正在执行中的多周期指令的目标寄存器编号(rd)。
- 乘法器/除法器状态: 乘法器(Multiplier)和除法器(Divider)在执行单元内部。它们有自己的控制逻辑,会向流水线控制单元发送信号,表明自己当前是否“忙碌”(Busy)——即正在执行一条需要多个周期的指令且结果尚未准备好。
- 阻塞信号的产生: 如果检测到:
- 当前处于译码(或执行早期)的指令的源寄存器依赖于任何一个正在执行中且结果未准备好(Busy)的乘法器或除法器的目标寄存器。
- 或者,即使没有显式的寄存器依赖,但乘法器或除法器本身处于忙碌状态(这主要解决结构性冒险,但有助于简化控制),E203也可能会选择保守地阻塞流水线。不过,解决RAW相关性是核心触发条件。
- 流水线控制逻辑(Pipeline Controller): 接收来自相关性检测单元和乘除法单元的信号。一旦确认存在依赖且乘除法单元忙碌,控制器立即发出全局的流水线停顿信号(Pipeline Stall Signal)。
停顿期间的操作
- 乘除法单元: 在流水线停顿期间,乘除法单元不受影响,继续执行它们的多周期计算。它们利用这些额外的周期完成运算。
- 流水线寄存器: 所有流水线寄存器(IF/ID, ID/EX, EX/MEM, MEM/WB)的写使能(Write Enable) 被关闭。这意味着这些寄存器中锁存的指令信息、数据和控制信号在停顿期间保持不变,不会随着时钟推进而更新到下一条指令的状态。
- 其他执行单元: 由于流水线完全停顿,ALU、LSU等其他执行单元也自然停止了工作。
停顿的结束
- 当乘法器或除法器完成计算(结果有效),它向流水线控制单元发送
ready 或 done 信号,并置 busy 为低。
- 流水线控制逻辑解除流水线停顿信号。
- 在下一个时钟周期,冻结的流水线寄存器重新开始采样输入信号(即之前被冻结的指令状态),流水线恢复流动。此时,乘法或除法指令的结果(在EX/MEM或MEM/WB寄存器中)已经准备好,可以被后续指令通过寄存器文件或旁路路径(如果设计包含)正确读取。
总结E203处理多周期指令(乘法/除法)数据相关性的关键点:
- 顺序执行核心: E203是一个顺序单发射流水线处理器,没有复杂的乱序执行(OoO)或寄存器重命名机制。
- 保守停顿: 一旦检测到后续指令的操作数依赖于正在执行的多周期指令结果,并且该结果尚未准备好,整个流水线就会被完全停顿。
- 执行单元控制: 乘法器和除法器独立执行,在停顿期间继续工作直至完成。
- 保持状态: 停顿期间,流水线各阶段的状态被冻结,直到多周期指令完成。
- 恢复执行: 多周期指令完成后,流水线解除停顿,冻结的指令继续执行,此时它们可以访问到正确的操作数。
这种方法的优缺点:
- 优点:
- 硬件实现极其简单,控制逻辑复杂度低。这是面积和功耗敏感型嵌入式处理器(如E203)的首要目标。
- 逻辑清晰可靠,易于验证。
- 缺点:
- 性能损失: 停顿期间处理器完全“卡住”,不能执行任何其他指令,即使是与乘除法无关的指令也无法执行。这显著降低了流水线的吞吐量和效率,尤其是在频繁使用多周期指令时。
- 无法利用指令级并行(ILP): 停顿阻塞了所有指令,无法利用停顿期间可能可以执行的不相关指令。
因此,E203的这种设计体现了其在追求极致小面积和低功耗的目标下,对高性能的妥协。它在低频率、低性能需求的IoT和嵌入式控制场景中是可行的方案。对于需要更高性能的应用,则需要考虑引入旁路(Forwarding/Bypassing)来解决短延迟指令的数据冒险,或者采用更复杂的乱序执行机制来处理长延迟操作。但在E203这个特定的设计中,选择了最简单直接的流水线完全停顿方案。
举报