Lec 23旁路技术和 EHR
Lec 23 旁路技术和 EHR
TL;DR
- 旁路消除停顿:通过在生产者与消费者之间建立组合旁路通路,使最新计算结果直接进入后续阶段,削减 RAW 数据冒险气泡。
- 普通寄存器瓶颈:标准时钟边沿触发寄存器输出滞后一个周期,无法支持同周期内规则/方法间“先写后读”的原子通信。
- EHR 虚时序原语:瞬时历史寄存器(EHR)通过内部多路选择器链,在一个物理时钟周期内构建虚拟子周期时序,支持并发规则调度。
旁路技术与同周期通信困境
旁路技术(bypassing, 又叫 forwarding)是一种为了减少 stall,在数据的生产-消费者之间的提供额外的数据通路的技术。常规途经而言,一个值会被写回寄存器文件(register file),然后由 decode 阶段读取。而 Bypassing 允许值被计算出来的同时,就直接被 decode 阶段使用,而不等写回。旁路技术的副作用:Bypassing 会引入新的组合逻辑路径,可能导致组合延迟增加,从而延长时钟周期,也会增加芯片面积。bypass 的效率取决于它被使用的频率。

EHR(Ephemeral History Registers)是 Bluespec 中一种机制,用于精确控制寄存器的写入和读取,搭配 bypassing 使用时,可以实现更灵活的控制路径数据传递和调度。
Bluespec 中旁路技术
在 Bluespec 看来,Bypassing 是一种作为减少的周期数,即减少两个有冲突的规则或方法之间执行所需的时钟周期数。举个例子:
假设你设计了一个 FIFO,如果已经满了,通常不能
enq(入队)
如果在 同一个周期,另一条规则要执行 deq(出队),那 FIFO 实际上会腾出一个位置。如果你能在逻辑上“看到未来”这次 deq 会发生,就可以允许同时执行 enq,即使此时 FIFO 是满的。
另外一个例子——规则重写(rule transformation)。
目标: 让 ra 和 rb 在同一个周期并发执行,并且让 rb 用到的是 ra 刚刚计算出的新值 x,外加一个约束ra < rb(表示:ra 的优先级比 rb 高,ra 在 rb 之前执行)
rule ra;
x <= y + 1; // 读取 y,写入 x
endrule
rule rb;
y <= x + 2; // 读取 x,写入 y
endrule
寄存器的限制
使用寄存器这种基本的硬件原语时,无法在同一个原子动作(也就是一个时钟周期内)完成以下通信:
- 两个方法之间(method 是模块对外提供的接口)
- 两个规则之间(rule 是 模块内部的原子动作,通常带有条件和动作);
- 一个规则和一个方法之间
为什么不行?
Solution:register 是时钟边沿触发的,它的输入值在当前周期写入,但直到下一个时钟周期才会出现在输出端。因此,它不能用于“同周期通信”。□
EHR(Ephemeral History Register) 是为了解决普通寄存器无法在同一周期内完成通信的问题而设计的。一个“会记住这个周期你已经写过什么”的寄存器 —— 所以即使是在同一个周期中先写再读,读操作也能看到写操作的值。
EHR
我们可以看到有一个触发器

r[1]返回:
- 如果
w[0]没有使能,返回当前状态 - 如果
w[0]使能,返回写入到w[0].data值
w[i+1]领先于w[i],即 w[i] w[i+1]
且 r[0] w[0]; r[1] w[1]
| w[0].enable | w[1].enable | r[1] | r[0] |
|---|---|---|---|
| 0 | 0 | cur state | |
| 0 | 1 | cur state | |
| 1 | 0 | w[0].data | |
| 1 | 1 | w[0].data |
寄存器 和 EHRs 的冲突矩阵
CF: f 和 g 不冲突且不影响
C:冲突,不能同时调用
寄存器
| reg.r | reg.w | |
|---|---|---|
| reg.r | CF | |
| reg.w | C |
EHR
| EHR.r0 | EHR.w0 | EHR.r1 | EHR.w1 | |
|---|---|---|---|---|
| EHR.r0 | CF | CF | ||
| EHR.w0 | C | |||
| EHR.r1 | CF | CF | ||
| EHR.w1 | C |
用 EHR 设计 FIFO
- 无冲突 FIFO。 当 FIFO 不满也不空的时候,enq 和 deq 可以同时进行,但是当前周期入队的值不会被同一个周期的出队看到。入队和出队是解耦的,互相看不到对方的“当前操作”。
- 流水线型 FIFO。正常来说:向满的 FIFO 入队是不允许的。但如果在同一个周期中同时执行一个
deq,那就允许enq,因为deq腾出空间,enq正好填补进去。 - 旁路 FIFO。正常来说:从空的 FIFO 出队是不允许的;但如果你在同一个周期中同时执行 enq,则允许出队;这个新入队的数据会直接送给出队口,好像绕过 FIFO 存储一样
我的理解
EHR(Ephemeral History Register)的精妙之处在于用组合逻辑在单个时钟周期内构造出多个“逻辑子周期(Micro-steps)”。通过严格定义端口间的序关系(),编译器能够在维持 ORAAT(One-Rule-At-A-Time)串行化语义的同时,将具有生产-消费依赖的规则调度到同一个物理周期并行触发。这种能力正是用高级综合设计单周期旁路 FIFO 与无停顿流水线的核心基石。