【问题标题】:Is there a reason to initialize (not reset) signals in VHDL and Verilog?是否有理由在 VHDL 和 Verilog 中初始化(而不是重置)信号?
【发布时间】:2011-09-15 19:52:51
【问题描述】:

我从未初始化过信号。这样,任何缺少重置或分配的信号都将是未知的或初始化的。在一些参考代码中,它们具有初始化。这违背了我的愿望。此外,由于无法合成初始化,因此可能存在模拟/合成不匹配。

在这种情况下有什么理由初始化信号吗?

编辑 6/17/11:正如 @Adam12 所问,这适用于存储(Verilog reg)和组合(有线)元素。

【问题讨论】:

  • 我被引导相信当你瞄准一个 FGPA 时,初始化会做一些事情。虽然没有详细信息...
  • @Marty:这通常是通过重置完成的。我说的是声明信号的初始化。
  • “信号”是指存储元件吗?

标签: initialization simulation vhdl verilog


【解决方案1】:

有一种观点认为信号初始化可以替代复位。通常,这些人的目标是基于 SRAM 的 FPGA,它们将在启动时保证状态。这适用于这些设备,但总的来说这是一种不好的做法。这样做的通常原因是为了减轻布线资源并消除需要满足时序的一类网络。在某些情况下这没问题,但是当您想将无复位设计整合到确实需要复位的系统中时,修复它会很痛苦。通常,这种技术被推广用于自行清除垃圾数据的数据流设计。同样,这没关系,但仅适用于实际上是自我清除的设计状态部分。

一般来说,您应该使用某种重置。我更喜欢使用同步释放的异步重置。它具有以下优点:

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

  • 即使时钟已死,您也已保证初始化。如果设计具有双向 I/O 并且您不想冒着卡住输出驱动程序的风险,这一点很重要。

  • 如果需要,您可以轻松地将代码迁移到 ASIC。实现 BIST 和 JTAG 基本上需要适当的可控复位。

  • 如果您仍然坚持无复位设计,您可以轻松地将复位无效并让合成器将其剥离。走另一条路很痛苦。

  • 并非所有合成器都关注初始化值。如果您必须切换到不需要的工具,您将经历很多痛苦。

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

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

同步复位经常被嘲笑为复位控制引入额外的延迟水平。实际上,对于基于 LUT 的 FPGA 尤其是赛灵思的基于 6-LUT 的较新系列来说,这不是问题,因为您通常有一个备用输入到 LUT 以提供可用于同步复位的 FF,而不会引入另一个级别的延迟。我做了一些初步的测试,发现至少对于简单的情况,与异步相比没有真正的速度劣势。不过,我避免同步重置,因为它们在时钟停止时不起作用。

现代 FPGA 的布线资源丰富,一般都有大量未使用的全局网络。在无法路由的设计中,重置通常不是罪魁祸首。如果您在正常结构上路由的复位存在时序问题,请尝试在复位网络上手动实例化时钟缓冲区,以释放其余逻辑的资源。这种做法还可以为您的设计设置方便的 ASIC 迁移。

【讨论】:

  • 我同意。如果 FPGA 具有在某些条件下优越的首选复位功能,那么为什么不提供从异步或同步复位到其首选复位的转换。这将使我们能够使用可移植的编码风格,同时充分利用它们所提供的最佳功能。
  • +1 不错的答案,您能否详细说明如何同步重置取消断言?您使用同步器电路还是某种计数器?谢谢!
【解决方案2】:

(以下建议很大程度上取决于器件架构和综合工具,我根据使用 Xilinx FPGA(例如 Virtex-5 部件)的经验发言。

您认为初始化不可综合的假设是不正确的。 初始化一个信号绝对是可合成的

例如,这可以被合成,以便使用初始值对设备进行编程:

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

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

你能做些什么呢?使用信号初始化。

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

如果您真的只需要重置设计的一小部分(“本地”重置),那么您应该像通常处理重置一样处理这个问题。

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

编辑

经过一些进一步的研究,我发现指定初始值虽然在某些情况下有助于改善 QoR,但在其他情况下可能会损害它。这真的归结为您的综合工具供应商将如何尊重初始值。在其核心,初始值是对工具的约束。当您的设计被综合然后映射到部件时,会在您的设计中添加一条注释,即“当您实现此存储元件时,请为其提供此初始值”。在许多情况下,添加此约束会阻止元素被优化(删除、组合等)。

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

【讨论】:

  • +1 揭穿神话:信号初始值可以合成!
  • 请注意,这仅适用于动态加载的部件,例如 Xilinx 和 Altera。如果您使用这种复位方式,如果您需要将其移植到 ASIC 或 CPLD,您将很高兴为您的设计添加复位。推荐这些技术只是供应商确保您将继续使用他们的零件 - 似乎营销已经包含了工程。
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多