尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

流水线级数

流水线级数 流水线级数不是一个“模块”里写死的而是前端后端缓存子系统共同摊出来的最终在“顶层连线”时被确定下来。在香山以及 XS-GEM5里它既不是纯前端概念也不是纯后端概念而是系统级结构参数由各阶段模块各自声明自己的拍数、再在 Top 层拼起来。一、先纠正一个直觉没有“流水线级数寄存器”不像robDepth256那样有个变量叫pipelineStages15。真实做法是每个子模块IFU、BPU、Decode、Rename、Dispatch、IQ、ALU、LSU、WB、Commit内部用RegInit/PipelineRegister链自己延几拍总级数 各模块延迟之和 级间握手寄存。所以“几级”是算出来的不是“设出来的”改某个模块的延迟总级数就变。二、前端和后端的分工以昆明湖 V2/V3 为例前端Frontend取指→译码完ICache 访问 命中判断1–2 拍FTB/BTB 查询 TAGE 预测1–2 拍指令对齐/解包decode width 6→多条1 拍分支预测重定向BPU 超前 IFUBPU 本身 2–3 拍IFU 取指 1 拍前端到后端边界Fetch Buffer → DecodeDecode 1 拍合计前端约5–7 拍从 PC 出去到译码完进重命名后端Backend重命名→提交Rename1 拍Dispatch 到 IQ/ROB/LSQ1 拍Issue调度等待0 拍异步不计入固定级数但发射选择 1 拍执行ALU 1 拍 / FMA(浮点/乘/加) 3–4 拍 / Load AGU 1 拍 D-Cache 2–3 拍 / Store 类似Writeback 到 PRF1 拍Commit1 拍每周期退若干条后端“固定延迟链”约6–10 拍但执行单元延迟因指令而异所以后端不是定长。整体昆明湖 V2 口径常说“约 14–16 级”那是把前端 6 重命名/派发 2 执行 1–4 写回 1 提交 1 加起来且 Load 命中 L1 的典型路径Miss 到内存就几十上百拍但那不算“流水线级数”算“阻塞”。三、在哪个模块“实现”各子模块自己实现自己的流水级IFU.scala里有RegInit做取指级间寄存BPU.scala里 TAGE 表查询延 2 拍Decode.scala1 拍Rename.scala1 拍IssueQueue.scala选择逻辑组合1 拍锁ALU.scala组合输出或 1 拍寄存WB.scala写回寄存 1 拍。Top 层XSTop.scala/XSCore.scala只做连线把 IFU.out 接 Decode.in中间不插额外级数除非跨时钟域才加流水寄存。参数文件XSCoreParams.scala声明各模块深度icacheParams.latency2、ftbParams.bankedOntrue、aluLatency1这些参数间接决定总级数但不存在一个中央“流水线控制器”统一发拍。唯一接近“全局流水线控制”的是RobCommit/Redirect逻辑和frontend.stall/backend.stall握手——它们决定“哪拍停”但不决定“有几级”。四、XS-GEM5 里怎么对应XS-GEM5 的O3CPU把同样结构用 C 建模fetch()函数里循环展开前端拍数decode()1 拍rename()1 拍iewissueexecutewriteback里Scheduler和ExecUnit各自tick()推进自己的延迟计数总 CPI 曲线里“流水线深度”体现在从 fetch 一条指令到 commit 它的最少周期数​ 各阶段 delay 求和改O3CPU::params里的decodeToExecuteDelay之类字段就等价于改 Chisel 里某段RegInit链长度五、一句话收口流水线级数是“系统级 emergent 属性”前端模块各自延几拍、后端执行单元各自延几拍、级间握手各加 1 拍寄存Top 层把它们串起来后数总拍数就是几级。没有一个叫 Pipeline 的模块负责“实现级数”级数散落在 IFU/BPU/Decode/Rename/IQ/Exec/WB/Commit 每一处的RegInit和params.latency里。
返回列表