哪种方式更好地在Verilog中编写寄存器路径

时间:2014-08-18 09:59:34

标签: verilog

解决方案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有实际优势?两种解决方案之间有什么区别?

1 个答案:

答案 0 :(得分:3)

部分取决于设计和合成器的尺寸。对于大型FSM设计,两个总是块方法使用更少的区域,通常具有更好的时序,更少的代码行,然后其等效的总是阻塞。来自Cliff Cummings的This paper详细介绍了一,二,三种始终阻塞方法之间的差异。他曾在一些较旧的论文herehere中推荐这种风格一段时间。几年后,我的团队将样式与我们自己的代码和工具进行了比较;我们可以得出与克里夫相同的结论。你应该尝试自己比较。

两个总是阻止的优点是:

  • 在波形或显示语句中查看时钟前的翻牌的下一个值。如果总是阻塞,则需要计算值。
  • 不会意外地造成意外的触发器
    • 注意:存在推断意外锁存的风险,但由于设计中几乎没有预期的锁存器,因此很容易在linting和综合工具的报告中找到它们。意想不到的触发器更难发现。
  • 所有组合逻辑都组合在一起。
  • 更轻松的手动ECO。通常需要更少的代码行。
  • 无需担心意外混合阻塞和非阻塞
  • 对于大型设计:
    • 几行代码
    • 较小的区域
    • 更好的时机

总是阻止优势的是:

  • 一般来说,一个总是阻止稍微比两个总是阻止模拟效率更高 - (Cliff SNUG1998SJ FSM,第10页)
  • 不会意外地推断出意想不到的闩锁
  • 严格遵守IEEE1364-1995:
      在IEEE1364-2001中添加了
    • @(*)。在IEEE1364-1995中,组合中使用的每个信号外部驱动信号总是需要列在敏感列表中。
      • 示例:@(en_a or en_b or en_c or da or db or dc or qr)
  • 对于小型设计:
    • 只有一个区块可供查看