在 VHDL 中编码状态机有两种流行的方法:一个进程或两个进程。有传言(一些大学教授)两个过程可能会产生更好的硬件。有人对此有任何确凿的证据吗?我自己的初步测试表明完全没有区别。
我正在寻找可重复的实验:两种编码风格的 VHDL 代码,以及如何合成它们的细节(哪个工具,哪个参数)。
请帮助我揭穿或确认两个过程导致更好的合成硬件的神话。
很多这种“知识”都是基于大约 20 年前的工具。事情已经发生了。
这并不是说在所有情况下都已解决所有问题,但是通过实际进行试验,您正在做正确的事情。
过去避免的其他事情是:
wait
而不是敏感列表的。这个特别疯狂,因为如果您阅读 VHDL 规范,它会说这两者是等价的并且应该以相同的方式实现。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!
下面的代码应该为具有时钟门的库演示这一点。模拟结果将是相同的,形式验证将证明这两者是相同的。然而,第一个可能会使用更少的功率和更少的面积。
//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 如何处理它们以及状态机优化是一个非常成熟的主题。