在VHDL和Verilog中,初始化(而不是重置)信号是否有必要?

7
我从未初始化过信号。这样,任何缺少重置或赋值的信号都将是未知或未初始化的。在一些参考代码中,它们进行了初始化。这违背了我的愿望。而且,由于初始化无法合成,可能会出现仿真/综合不匹配的情况。
在这种情况下初始化信号是否有任何理由?
编辑6/17/11:正如@Adam12所问,这适用于存储(Verilog reg)和组合(wire)元素。

我相信在定位到 FPGA 时,初始化会发挥一定作用。不过我没有具体细节... - Marty
@Marty:这通常是通过重置完成的。我说的是在声明信号时进行的初始化。 - Brian Carlton
1
“signal”这个词,您是指仅限于存储元件吗? - user597225
2个回答

23

以下建议在设备架构和综合工具方面有很大的依赖性。我从与Xilinx FPGA(例如Virtex-5部件)的经验中说起。

您认为初始化无法合成是错误的。 初始化信号绝对是可合成的

例如,可以合成以下内容,以使其使用初始值编程设备:

signal arb_onebit : std_logic := '0';
signal arb_priority : std_logic_vector(3 downto 0) := "1011"

此外,您可以使用信号初始化并放弃传统的异步或同步全局复位方案来实现更好的结果质量(QoR)。这是因为工具不再需要将复位信号路由到部件周围的所有触发器。虽然一些旧一代的FPGA可能有专用的复位资源,但在新型号中并非如此。这意味着复位与设计中的其他信号一样路由,会减慢构建过程并降低性能。

那么您应该怎么做呢?使用信号初始化。

  1. 使用专用的“GSR”(我相信是全局设置/复位)。这可通过专用的Xilinx原语访问。请注意,使用GSR时,并非设备的所有存储单元都会被复位。例如,我相信BRAM保留值,但FF被重置为初始化值。
  2. 对设备进行PROGL。这将导致整个设备从原始比特流(位于PROM中)重新编程。每次从PROM加载设备时,所有存储单元(FF、BRAM等)都会进入由您的初始化指定的已知状态。如果您不进行初始化,则我相信它默认为“0”状态。您可以通过使用诸如FPGA Editor(作为Xilinx工具集的一部分提供)之类的工具查看初始化的存储单元的状态。

如果您确实需要重置设计的一小部分(“本地”复位),那么应按照通常处理复位的方式处理此问题。

以下是Xilinx工具的一些参考资料:

编辑

经过进一步研究,我发现在某些情况下,指定初始值虽然有助于提高QoR,但也可能会损害它。这实际上取决于您的综合工具供应商如何遵守初始值。在其核心,初始值是对工具的约束。当您的设计被综合并映射到该部件时,会向您的设计添加一个注释,即“在实现此存储元素时,请给它此初始值。”在许多情况下,添加此约束可以防止元素被优化(删除,组合等)。

建议:重置和初始化没有硬性/快速/一刀切的规则。为了获得最佳的优化和资源利用率,您必须了解您的综合工具,以及您的目标技术。


3
+1 证明神话是错误的:信号初始值确实可以合成! (注释:原文已经很清楚地表达了这个观点,所以我只需要将其翻译成中文并保持其原意即可。) - Philippe
1
请注意,此方法仅适用于动态加载的部件,例如Xilinx和Altera。如果您使用此重置方式,可能需要将其添加到ASIC或CPLD中以进行移植,这将会很有趣。建议使用这些技术只是为了确保供应商能够继续销售他们的产品 - 看起来市场营销已经取代了工程设计。 - Jim Lewis

16

有一派人认为,信号初始化可以代替复位。通常这些人针对的是基于SRAM的FPGA,因为这些设备在启动时会保证状态。虽然这对于这些设备有效,但总体来说这是一种不好的做法。使用该方法的通常原因是为了减轻路由资源,并消除需要满足时序的一类网络。在某些情况下这是可以的,但如果想将其纳入真正需要重置的系统中,则无复位设计会很难处理。通常,这种技术是用于数据流设计,以清除自身的垃圾数据。同样是可以的,但仅适用于那些确实能够自我清除的设计状态。

总体而言,你应该使用某种形式的复位。我更喜欢使用异步复位,以同步方式释放。它具有以下优点:

  • 您可以独立于FPGA中的任何启动逻辑控制设备的初始化。

  • 即使时钟停止,您也可以获得保证的初始化。如果设计具有双向I/O且不希望出现输出驱动器卡住的风险,则这一点非常重要。

  • 如果需要,您可以轻松地将代码迁移到ASIC。对于实现BIST和JTAG,一个合适的可控复位是必需的。

  • 如果您仍然坚持无复位设计,则可以轻松地将复位连接到不活动状态,并让综合器去除它。反之则很难。

  • 并非所有的综合器都会注意初始化值。如果必须切换到不支持初始化值的工具,你将会遭受很多痛苦。

  • 同步释放确保在复位后不会出现虚假的设置或保持违规情况。当然这仍取决于配置适当的时序约束。

  • 很容易忘记初始化值,并最终得到一个不想要的默认值。在每个同步过程/块中有本地复位部分更易于维护。

同步复位经常因为引入了额外的控制延迟而受到嘲笑。但在实践中,这对于基于LUT的FPGA尤其是来自赛灵思的新型6 LUT系列来说不是太大的问题,因为你通常有一个多余的输入连接到触发器,可以用于同步复位而不会引入另一级延迟。我进行了一些初步测试,并发现至少在简单情况下,与异步相比并没有真正的速度劣势。不过,我还是避免使用同步复位,因为当时钟无信号时,它们不能正常工作。

现代FPGA在路由资源方面非常丰富,通常具有大量未使用的全局网。在设计中,通常不会因为复位而导致无法布线。如果您在普通网络上布置复位时出现定时问题,请尝试手动实例化时钟缓冲器以使重要部分的逻辑获得更多资源。这个做法也能够方便地设置ASIC迁移。


4
我同意。如果FPGA在某些情况下具有优越的首选重置功能,为什么不提供从异步或同步重置到其首选重置的转换呢?这将允许我们使用便携式编码样式,同时利用它们所能提供的最佳性能。 - Jim Lewis
1
+1 很好的回答,您能否详细说明如何同步复位去除?您是使用同步器电路还是某种类型的计数器?谢谢! - VHDL Addict

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接