我们正在研究用VHDL编写的流水线处理器,我们在模拟器上有一些时序,同步和寄存器问题(代码不需要是可综合的,因为我们只在模拟器上运行它)。
想象一下,我们有两个处理器阶段,A和B,中间有一个流水线寄存器:
配置如下
_______ ___ _______
| | | | | |
---| A |---|R|---| B |---
|_____| |_| |_____|
使用此配置时,存在计时问题:
我们希望B改变其状态并在t = 1时生成输出,但我们还需要中间的寄存器来使管道工作。
解决方案是在下降沿更新R寄存器。但是,我们假设所有处理器阶段都在半个时钟周期内运行,另一半则有点无用。
管道中通常如何解决这个问题?
答案 0 :(得分:1)
首先,只是从这个领域的个人经验说:永远不要开发自己的cpu,除非你是一个疯狂的天才,并有另外几个你的类型来验证你的工作和移植编译器。
对你的问题:
a)切割技术通常用于在设计中插入管道阶段。如果实施得当,您只需要解决控制危险
b)模拟您的阶段,而不是使用中间的寄存器,但使用1深度透明的FIFO - 您将免费获得自动失速管理,更容易推理管道
c)旁路寄存器R.使用A中的数据将其注册到R和B中。
如果以上都没有帮助,请重新设计B和/或聘请用于推断并发硬件的硬件开发人员。
答案 1 :(得分:0)
在与很多人交谈之后,我认为我们找到了解决问题的正确方法。
具有自己的状态机的阶段B不应该在上升沿激活VHDL过程。它应该将状态机的状态作为存储在寄存器R中的信号。
更详细地说,应该添加这些新信号:
state
:状态机的当前状态,从R输出,输入到B state_next
:状态机的下一个状态,输入到R,从B输出这意味着state
每个上升沿都会更改state_next
,而B现在可以在没有进程的情况下工作。