5

在 VHDL 中编码状态机有两种流行的方法:一个进程或两个进程。有传言(一些大学教授)两个过程可能会产生更好的硬件。有人对此有任何确凿的证据吗?我自己的初步测试表明完全没有区别。

我正在寻找可重复的实验:两种编码风格的 VHDL 代码,以及如何合成它们的细节(哪个工具,哪个参数)。

请帮助我揭穿或确认两个过程导致更好的合成硬件的神话。

4

3 回答 3

3

很多这种“知识”都是基于大约 20 年前的工具。事情已经发生了。

这并不是说在所有情况下都已解决所有问题,但是通过实际进行试验,您正在做正确的事情。

过去避免的其他事情是:

  • 泛型,因为显然它们是不可合成的。不正确,并且比
    预处理代码要好得多,这通常是要辩护的。
  • 港口记录。这确实导致了很长一段时间的 DC-shell 问题。它会错误地连接事物。我不知道这是否解决了。
  • 各种风格的同步过程,尤其是那些使用wait而不是敏感列表的。这个特别疯狂,因为如果您阅读 VHDL 规范,它会说这两者是等价的并且应该以相同的方式实现。
于 2011-10-25T14:55:30.267 回答
2

Sorry, no reproducible experiment, but I'd be staggered if a synthesizer cared (at least these days - I have no hard evidence though)! Surely it just parses the VHDL down to a bunch of logic feeding a bunch of flipflops.

I don't even know if it used to be a problem with old-fashioned synthesizers or whether people just assumed it to be so!

于 2011-10-25T12:06:38.090 回答
0

下面的代码应该为具有时钟门的库演示这一点。模拟结果将是相同的,形式验证将证明这两者是相同的。然而,第一个可能会使用更少的功率和更少的面积。

//Instances 1 clock gate
reg [7:0] value;
always @(posedge i_clk)
  if(enable)
    value <= new_value; 

//Instances 8 muxes
always @(posedge i_clk)
  if(enable)
    value <= new_value;
  else //Exhaustive so assignment always occurs
    value <= value;

第一个示例将使用单个时钟门作为所有八个 DFF 的时钟。第二个示例将使用 8 个多路复用器将每个 DFF 的输出循环回其输入。根据时钟门与多路复用器的面积和功率比,差异可能很大。这在 Talus 上进行了测试。

当然,第二个示例中的 else 子句是无用的,但实验的重点是查看该工具如何处理复杂的 casez/x 语句并在 always 块之间共享启用。对于 FSM,只要检测到 FSM,我就会倾向于语法无关紧要。我基于 XST 如何处理它们以及状态机优化是一个非常成熟的主题。

于 2011-10-29T18:53:04.697 回答