You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

流水线ID阶段如何读取刚写入的寄存器数据?时序逻辑疑问

寄存器堆读写时序与流水线冒险问题

指令与流水线场景

给定指令序列:

add $t2, $t2, $t2
nop
nop
add $t2, $t2, $t2

对应的流水线周期图:

add| IF| ID|EXE|MEM| WB|
nop|   |   |   |   |   |
nop|   |   |   |   |   |
add|   |   |   | IF| ID|EXE|MEM| WB|

此时第一条add指令处于WB阶段,第二条add指令处于ID阶段。

教材观点与矛盾点

教材指出此场景不存在数据冒险,理由是可在前半个时钟周期写入寄存器堆,后半个周期读取。但假设流水线寄存器和寄存器堆均为上升沿触发时,这一说法存在矛盾,对应的寄存器堆Verilog行为描述如下:

always @(posedge clk)begin
    if(RegWrite) regfile[waddr] <= wdata;
end

核心疑问

  • 至少存在clk到Q的延迟,不可能在时钟上升沿完成寄存器写入。当第二条add指令读取寄存器堆时,新数据刚被写入,但RegWrite为低电平时,怎么能在前半个周期完成写入?
  • 若流水线寄存器和寄存器堆的时钟相位不同,该问题可解决,但目前没有资料提及这一设计。或者请直接说明,如何能够读取刚写入寄存器堆的数据?

补充时序波形描述:

clk      __/‾‾‾\___/‾‾‾\___
RegWrite ____/‾‾‾‾‾‾‾‾\____

进一步疑问:RegWrite必然存在clk到Q的延迟,当RegWrite为低电平时,寄存器堆如何在时钟边沿完成写入?


内容的提问来源于stack exchange,提问作者Mr.Knife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:42:51