管道设计和时序问题

时间:2016-12-13 15:38:04

标签: vhdl

我们正在研究用VHDL编写的流水线处理器,我们在模拟器上有一些时序,同步和寄存器问题(代码不需要是可综合的,因为我们只在模拟器上运行它)。

想象一下,我们有两个处理器阶段,A和B,中间有一个流水线寄存器:

  • 处理器阶段A是组合的,不依赖于时钟
  • 流水线寄存器R是一个寄存器,因此,它在时钟上升沿改变其状态。
  • 处理器阶段B是一个复杂的阶段,并且有自己的状态机,因此,它会改变其状态并在VHDL过程中进行操作,由时钟上升沿控制。

配置如下

   _______   ___   _______
   |     |   | |   |     |
---|  A  |---|R|---|  B  |---
   |_____|   |_|   |_____|

使用此配置时,存在计时问题:

  • t = 0:A获取数据并执行其操作
  • t = 1:在上升沿,R使用A的输出更新其数据。
  • t = 2:在上升沿,B获取R的值,并更新其状态并给出输出。

我们希望B改变其状态并在t = 1时生成输出,但我们还需要中间的寄存器来使管道工作。

解决方案是在下降沿更新R寄存器。但是,我们假设所有处理器阶段都在半个时钟周期内运行,另一半则有点无用。

管道中通常如何解决这个问题?

2 个答案:

答案 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现在可以在没有进程的情况下工作。