我绝不是Verilog的专家,我想知道是否有人知道这些增加价值的方法更好。对不起,如果这个问题太简单了。
方式A:
在组合逻辑块中,可能在状态机中:
//some condition
count_next = count + 1;
然后在顺序块的某个地方:
count <= count_next;
或方式B:
组合块:
//some condition
count_en = 1;
顺序阻止:
if (count_en == 1)
count <= count + 1;
我更常见过Way A.方式B的一个潜在好处是,如果要在状态机的许多位置递增相同的变量,也许它只使用一个加法器而不是多个加法器;或者那是假的?
首选哪种方法,为什么?要么有明显的缺点呢?
谢谢。
答案 0 :(得分:1)
我在Verilog代码中使用Way A.我的顺序块几乎没有逻辑;它们只是根据组合总是块中计算的“线路寄存器”的值来分配寄存器。这种方式出错的可能性更小。有了Verilog,我们需要得到所有帮助。
答案 1 :(得分:1)
您对“更好”的定义是什么? 它可以是更好的性能(更快的合成电路的最大频率),更小的面积(更少的逻辑门)或更快的模拟执行。
让我们考虑Xilinx和Altera FPGA的小面积外壳。这些FPGA系列中的寄存器具有使能输入。在“方式B”中,* count_en *将直接映射到 enable 寄存器输入,这将导致逻辑门减少。本质上,“Way B”为综合工具提供了更多“提示”,以便更好地合成该电路。此外,大多数FPGA综合工具(我说的是Xilinx XST,Altera MAP,Mentor Precision和Synopsys Synplify)都可以正确推断出来自“Way A”的寄存器 enable 输入。
如果* count_en *被合成为 enable 寄存器输入,那么这将导致更好的电路性能,因为您的计数器递增逻辑将具有更少的逻辑电平。
谢谢
答案 2 :(得分:1)
方式B的一个潜在好处是,如果要在状态机的许多位置递增相同的变量,也许它只使用一个加法器而不是多个加法器;或者那是假的?
任何综合工具都会尝试自动资源共享。他们这样做的程度取决于编写的工具和代码。这是一篇描述Design Compiler的一些功能的文档。请注意,在某些情况下,较少的区域意味着更糟糕的时间。
首选哪种方法,为什么?要么有明显的缺点呢?
这取决于。 Verilog(用于合成)是一种实现某些逻辑电路的方法,但规范没有详细说明如何完成。方式A可能与FPGA上的方式B相同,但由于无条件顺序分配,方式A与ASIC上的低功耗设计不一致。使用复位网几乎是ASIC的要求,但由于许多FPGA都处于已知状态,因此可以通过不使用它来节省相当多的资源。