【问题标题】:Verilog Best Practice - Incrementing a variableVerilog 最佳实践 - 增加变量
【发布时间】:2011-11-06 02:05:31
【问题描述】:

我绝不是 Verilog 专家,我想知道是否有人知道这些增加值的方法中哪一种更好。抱歉,这个问题太简单了。

方式A:

在组合逻辑块中,可能在状态机中:

//some condition
count_next = count + 1;

然后在顺序块中的某处:

count <= count_next;

或方式 B:
组合块:

//some condition
count_en = 1;

顺序块:

if (count_en == 1)
  count <= count + 1;

我经常看到方式 A。方式 B 的一个潜在好处是,如果您在状态机的许多地方增加相同的变量,那么它可能只使用一个加法器而不是多个;还是那是假的?

首选哪种方法,为什么?两者都有明显的缺点吗?

谢谢。

【问题讨论】:

    标签: verilog


    【解决方案1】:

    方式 B 的一个潜在好处是,如果您在状态机的许多地方增加相同的变量,那么它可能只使用一个加法器而不是多个;还是那是假的?

    任何综合工具都会尝试自动资源共享。他们做得如何取决于编写的工具和代码。这是描述Design Compiler的一些功能的文档。请注意,在某些情况下,面积越小意味着时机越差。

    首选哪种方法,为什么?两者都有明显的缺点吗?

    这取决于。 Verilog(用于综合)是一种实现某些逻辑电路的方法,但规范没有具体说明如何完成。方式 A 可能与 FPGA 上的方式 B 相同,但由于无条件顺序分配,方式 A 与 ASIC 上的低功耗设计不一致。使用复位网络几乎是 ASIC 的一项要求,但由于许多 FPGA 以已知状态开始,因此不使用它们可以节省相当多的资源。

    【讨论】:

    • 您应该使用综合工具文档推荐的内容。
    【解决方案2】:

    我在我的 Verilog 代码中使用方式 A。我的顺序块几乎没有逻辑。他们只是根据组合 always 块中计算的“wire regs”的值分配寄存器。这种方式出错的可能性较小。而对于 Verilog,我们需要我们能得到的所有帮助。

    【讨论】:

      【解决方案3】:

      您对“更好”的定义是什么? 它可以是更好的性能(更快的合成电路的最大频率)、更小的面积(更少的逻辑门)或更快的仿真执行。

      让我们考虑一下 Xilinx 和 Altera FPGA 的小面积案例。这些 FPGA 系列中的寄存器具有 enable 输入。在您的“方式 B”中,*count_en* 将直接映射到该 enable 寄存器输入,这将减少逻辑门。本质上,“方式 B”为合成工具如何更好地合成该电路提供了更多“提示”。此外,大多数 FPGA 综合工具(我指的是 Xilinx XST、Altera MAP、Mentor Precision 和 Synopsys Synplify)也有可能从“Way A”正确推断寄存器 enable 输入。

      如果*count_en* 被合成为enable 寄存器输入,这将导致电路的性能更好,因为您的计数器增量逻辑将具有更少的逻辑电平。

      谢谢

      【讨论】:

      • 我不确定我理解你的意思。在我看来,count_en 信号将启用加法器,而不是寄存器本身。你能进一步解释一下吗?谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 2021-11-26
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      相关资源
      最近更新 更多