Verilog最佳实践-递增变量

Verilog最佳实践-递增变量,verilog,Verilog,我绝对不是一个Verilog专家,我想知道是否有人知道这些增值方法中哪一种更好。如果这是一个太简单的问题,很抱歉 方式A: 在组合逻辑块中,可能在状态机中: //some condition count_next = count + 1; 然后在顺序块的某个地方: count <= count_next; if (count_en == 1) count <= count + 1; 顺序块: count <= count_next; if (count_en ==

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

方式A:

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

//some condition
count_next = count + 1;
然后在顺序块的某个地方:

count <= count_next;
if (count_en == 1)
  count <= count + 1;
顺序块:

count <= count_next;
if (count_en == 1)
  count <= count + 1;
if(计数=1)

count我在Verilog代码中使用了一种方法。我的顺序块中几乎没有逻辑;它们只是根据组合always块中计算的“wire regs”值分配寄存器。这样就不会出什么差错了。有了Verilog,我们需要所有能得到的帮助。

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

让我们考虑Xilinx和Altera FPGA的小面积情况。这些FPGA系列中的寄存器具有启用输入。在您的“方式B”中,*count_en*将直接映射到启用寄存器输入,这将导致更少的逻辑门。从本质上说,“方式B”为合成工具提供了更多的“提示”,使其能够更好地合成该电路。此外,大多数FPGA合成工具(我说的是Xilinx XST、Altera MAP、Mentor Precision和Synopsys Synplify)可能会从“方式A”正确推断寄存器启用输入

如果将*count_en*合成为启用寄存器输入,则电路的性能会更好,因为计数器增量逻辑的逻辑电平会更少

谢谢

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

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

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


视情况而定。Verilog(用于合成)是实现某些逻辑电路的一种方法,但规范没有具体说明如何实现。方式A可能与FPGA上的方式B相同,但由于无条件顺序分配,方式A与ASIC上的低功耗设计不一致。使用重置网络几乎是ASIC的一项要求,但由于许多FPGA都是在已知状态下启动的,因此不使用重置网络可以节省大量资源。

我不确定我是否理解您的意思。在我看来,计数信号将启用加法器,而不是寄存器本身。你能进一步解释一下吗?谢谢。您应该使用您的合成工具文档推荐的方法。