如何理解Chisel语言的时序节拍?结合RISC-V BOOM的IssueSlot代码疑问
Chisel信号采样与执行逻辑问题解答
问题1:信号赋值的时序问题
首先明确两个核心前提:
- Chisel中
:=确实是信号连线,但要区分左侧信号的类型:- 若左侧是
Wire类型:属于组合逻辑,输入信号变化时,输出会立刻跟随变化 - 若左侧是
Reg类型:这个连线是连接到寄存器的输入D端,寄存器的输出Q端在整个时钟周期内保持稳定,只有时钟沿到来时,才会将D端的值采样更新到Q端
- 若左侧是
你观察到的现象完全符合硬件逻辑,不存在错误:
你贴的代码中state、slot_uop都是寄存器类型:
- 第113行
state := io.in_uop.bits.iw_state、第155行slot_uop := io.in_uop.bits都是给寄存器的D端赋值,当前周期内state、slot_uop的Q端输出仍然是上一个周期的fmul相关信息 - 第126~129行读取的是
state、slot_uop的Q端值,自然拿到的是fmul的信息
这个逻辑是合理的:next_系列信号是当前周期发射槽的状态输出,当前周期该槽存储的仍然是fmul,输出自然为fmul相关信息。等到当前周期时钟沿触发后,寄存器Q端才会更新为fadd的信息,下一个周期的next_系列信号才会输出fadd的内容。
问题2:for循环的执行逻辑
Chisel是嵌入在Scala中的领域特定语言,你写的for循环属于Scala层面的硬件生成逻辑,不是硬件本身的执行逻辑:
- 该循环会在Chisel编译阶段完全展开,生成对应数量的并行硬件电路
- 所有展开的硬件电路是并行工作的,不存在“循环迭代耗时”的问题,所有逻辑在单个时钟周期内即可完成全部运算
比如你遍历队列的for循环,最终会生成和队列深度一致的并行判断逻辑,整个队列的遍历结果在同一个周期内就能得到。
内容的提问来源于stack exchange,提问作者Gerrie
相关产品推荐
相关产品推荐

