流水线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
相关产品推荐
相关产品推荐

