“单周期数据通路和五级流水线可实现同一份转移契约。比较二者的正确性应比较正常执行的指令效果,而不是要求每个内部时钟边沿都对应一次 ISA 转移。”
形式陈述
对五指令 ISA 子集,单周期实现让每条正常指令在一个时钟区间内完成取指、读寄存器、运算、必要的访存和下一状态选择。区间末的状态边界提交寄存器、PC及存储更新;本页假设存储接口能在给定周期内完成,不涉及真实缓存和异常。
数据通路包含PC、指令存储、两个读端口一个写端口的寄存器文件、立即数解码器、ALU、比较器、数据存储和选择器。数据存储与指令存储分离,分支目标有单独加法器;这是本页选择的资源配置。
| 指令 | ALU 输入B | 寄存器写入源 | RegWrite | MemWrite | NextPC |
|---|---|---|---|---|---|
| add | rs2 | ALU和 | 1 | 0 | PC+4 |
| addi | I立即数 | ALU和 | 1 | 0 | PC+4 |
| lw | I立即数 | 内存读值 | 1 | 0 | PC+4 |
| sw | S立即数 | 无 | 0 | 1 | PC+4 |
| beq | 本设计不使用ALU结果 | 无 | 0 | 0 | 比较成立选PC+B立即数 |
add/addi/lw/sw的ALU输入A为rs1。store的数据输入直接来自rs2,而不是来自ALU输入B;后者已经被立即数占用。RegWrite为一且rd为零时,寄存器文件仍丢弃写入。
直觉
数据通路提供“可以把值送到哪里”的道路,控制信号选择本条指令真正走哪条路。add与lw都需要加法,但前者把和写回寄存器,后者把和当地址,再把内存的值写回。只看ALU输出正确,不能证明指令正确。
所有组合部件可以并行产生候选值;没有被选择的值不应引发状态变化。选择器只决定数据来源,写使能才决定是否产生副作用,这两类控制不能混为一谈。
例子与边界
加法结果还是地址
初始 addi x2,x1,8 应写回 lw x2,8(x1) 应写回
store有两种不同的源
执行 sw x3,8(x1),设 [17,0,0,0]。误把ALU输入B也接到写数据,会把偏移8写入内存。这个错误来自两种角色被合并,与寄存器编号无关。
单周期不等于快速
若取指、寄存器读取、ALU、数据读和写回选择的教学延迟依次为
若把两块存储替换为只能每周期服务一次的统一端口,lw在一个区间内既需取指又需取数,原先的资源假设不再成立;必须改变时序或资源,而不能只改图上的方框名字。
推论与应用
逐指令验证可以先从控制表中读出有效路径,再把它代回ISA转移式。对store与branch,还要检查所有无关写使能为零。数据值相同但多写了一次内存,同样是错误实现。
五级流水线保留这些功能,但把中间结果和对应控制位一同寄存。不能只把数据延后一周期、仍让当前解码的RegWrite控制上一条指令的数据。
参考资料
- UC Berkeley CS61C,Single-Cycle CPU Datapath: Introduction,课程笔记,访问于 2026-10-08。
- David A. Patterson and John L. Hennessy, Computer Organization and Design RISC-V Edition, 2nd ed., 2021,Ch. 4。本文资源、分支加法器和延迟数字是明示的教学选择。