解决方案1
reg q;
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 1'b0;
else
if (en_a)
q <= da;
else if (en_b)
q <= db;
else if (en_c)
q <= dc;
溶液2
reg qw, qr;
always @(*)
if (en_a)
qw = da;
else if (en_b)
qw = db;
else if (en_c)
qw = dc;
always @(posedge clk or negedge rst_n)
if (!rst_n)
qr <= 1'b0;
else
qr <= qw;
我经常使用solution 1
,而且我可以在很多其他工程师身上找到很多&#39;码。 Solution 2
分离了组合逻辑部分和序列逻辑部分,即经典的FSM风格。
我的问题是,(对于solution 2
)是否比solution 1
有实际优势?两种解决方案之间有什么区别?
答案 0 :(得分:3)
部分取决于设计和合成器的尺寸。对于大型FSM设计,两个总是块方法使用更少的区域,通常具有更好的时序,更少的代码行,然后其等效的总是阻塞。来自Cliff Cummings的This paper详细介绍了一,二,三种始终阻塞方法之间的差异。他曾在一些较旧的论文here和here中推荐这种风格一段时间。几年后,我的团队将样式与我们自己的代码和工具进行了比较;我们可以得出与克里夫相同的结论。你应该尝试自己比较。
两个总是阻止的优点是:
总是阻止优势的是:
@(*)
。在IEEE1364-1995中,组合中使用的每个信号外部驱动信号总是需要列在敏感列表中。
@(en_a or en_b or en_c or da or db or dc or qr)