我从未初始化过信号。这样,任何缺少重置或分配的信号都将是未知的或初始化的。在一些参考代码中,他们有初始化。这打败了我的意愿。此外,由于初始化不可合成,因此可能存在模拟/合成不匹配。
在这种情况下是否有任何理由初始化信号?
EDIT 6/17/11:正如@ Adam12所说,这适用于存储(Verilog reg)和组合(线)元素。
答案 0 :(得分:14)
(以下建议在很大程度上取决于器件架构和综合工具,我讲的是Xilinx FPGA的经验,如Virtex-5器件)。
您认为初始化不可合成的假设是不正确的。 初始化信号绝对可以合成!
例如,这可以合成,因此它使用初始值对设备进行编程:
signal arb_onebit : std_logic := '0';
signal arb_priority : std_logic_vector(3 downto 0) := "1011"
此外,您可以使用信号初始化和放弃传统的异步或同步全局重置方案来获得更好的结果质量(QoR)。这是因为工具不再需要将复位信号路由到您身边的所有FF。虽然一些老一代FPGA可能具有用于复位的专用资源,但在较新的部件中并非如此。这意味着重置的路由与设计中的每个其他信号一样,从而减慢了构建过程并降低了性能。
你可以做什么呢?使用信号初始化。
如果你真的只需要重置设计的一小部分(“本地”重置),那么你应该处理这个,因为你通常会处理重置。
以下是Xilinx工具的一些参考资料:
修改强>
经过一些进一步的研究后,我发现指定初始值,虽然在某些情况下有助于改善QoR,但在其他情况下可能会对其造成伤害。它实际上归结为您的综合工具供应商将如何兑现初始价值。从本质上讲,初始值是对工具的约束。当您的设计被合成然后映射到零件时,会在设计中添加一条注释,“当您实现此存储元素时,请为其提供此初始值”。在许多情况下,添加此约束会阻止元素进行优化(删除,组合等)。
建议:重置和初始化没有硬/快/一刀切的规则。为了获得最佳优化和资源利用率,您必须了解您的综合工具,并且必须了解您的目标技术。
答案 1 :(得分:11)
有一种思想流派认为信号初始化可以替代重置。一般来说,这些人都瞄准基于SRAM的FPGA,这些FPGA将在启动时保证状态。这适用于那些设备,但一般来说这是一个不好的做法。这样做的通常原因是减轻路由资源并消除需要满足时序的一类网络。在某些情况下这是可以的,但是当你想要将它合并到一个真正需要重置的系统时,无需重置的设计很难修复。通常,这种技术被推广用于数据流设计,这些设计将自己清除垃圾数据。再次这是可以的,但仅适用于实际上是自我清理的设计状态部分。
一般来说,你应该使用某种重置。我更喜欢使用同步释放的异步复位。它具有以下优点:
您可以独立于FPGA中的任何启动逻辑控制设备的初始化。
即使时钟已经耗尽,也可以保证初始化。如果设计具有双向I / O并且您不希望冒险出现输出驱动器,这一点非常重要。
如果需要,您可以轻松地将代码迁移到ASIC。实现BIST和JTAG本质上需要适当的可控复位。
如果您仍然坚持无重置设计,您可以轻松地将重置置于非活动状态,让合成器将其剥离。走另一条路很痛苦。
并非所有合成器都注意初始化值。如果你不得不切换到一个没有的工具,你将会经历很多痛苦。
同步版本可确保您在重置后不会出现虚假设置或保持违规。当然,这仍然取决于配置适当的时序约束。
很容易忘记初始化值并最终得到您不想要的默认值。在每个同步进程/块中本地重置部分更易于维护。
同步复位经常被嘲笑为复位控制引入额外的延迟水平。实际上,基于LUT的FPGA尤其是Xilinx基于6-LUT的新型系列产生了较少的问题,因为您经常为LUT提供备用输入,从而为可以用于同步复位的FF提供不会引入另一级延迟的FF。我做了一些基本的测试,发现至少对于简单的情况,与asynchronus相比,没有真正的速度劣势。但是,我避免了同步复位,因为它们在时钟耗尽时无法工作。
现代FPGA具有丰富的路由资源,并且通常具有大量未使用的全局网络。在不可路由的设计中,重置通常不会受到影响。如果您在普通结构上路由的重置有时序问题,请尝试在重置网络上手动实例化时钟缓冲区,以释放剩余逻辑的资源。这种做法还为您的ASIC移植提供了方便的设计。