4

我试图了解芯片中的时钟重置。在设计中,使用什么标准来决定在复位期间是否应将触发器分配给一个值(通常为零)?

always_ff @(posedge clk or negedge reset) begin : process_w_reset
   if(~reset) begin
      flop1 <= '0;
      ....
   end else begin
      if (condition) begin
         flop1 <= something ;
         .... 
      end
   end
end

always_ff @(posedge clk) begin : process_wo_reset
      if (condition) begin
         flop1 <= something ;
         .... 
      end
end

不重置稍后用作梳状逻辑中的控制信号的触发器是一种不好的做法吗?如果设计确保触发器在用于梳状逻辑块(即在 if 语句或 FSM 梳状逻辑中)之前将具有分配给它的有效值(0 或 1)怎么办?

我觉得最好总是重置设计中的所有翻牌。这样芯片复位后就不会出现X了。然而,对于数据路径逻辑来说,重置触发器可能并不重要,因为它只是管道阶段。但是,如果触发器处于控制路径(即 FSM 下一状态梳状逻辑)中,则应将其重置为默认值。我的理解正确吗?我对 DFT 了解不多,不确定它是否还有其他含义。

4

4 回答 4

4

假设重置意味着异步重置,如代码示例中所示。

答案部分是基于意见的,因为可以使设计与重置最少数量的触发器 (FF) 和所有 FF 一起工作。

我建议重置最少数量的 FF,通常这会导致控制路径中的大多数 FF 重置,而数据路径中的 FF 不会重置。这种方法的优点概述如下。

对于 Verilog 和 VHDL 而言,对于未初始化值的传播,仿真通常是保守的,因此当值未初始化时,仿真可以同时检查 0 和 1 值。

因此,由于 FF 未重置而导致的错误很可能在仿真验证中更早出现,因此设计人员会获得有关错误设计假设的宝贵反馈,这可能会导致设计中的更正以修复其他错误。仅重置所有 FF 可能会隐藏此类错误。

如果所有 FF 在控制和数据路径中都被重置,设计和验证似乎会更容易,因为它修复了设计中所有那些“烦人的”X 传播。但是当 X 传播通过复位被抑制时,它需要更多的测试来验证所有的值组合。

实现对复位信号的负载较小,因此更容易满足整个芯片的复位网络时序。

一般而言, DFT(测试设计),然后将复位添加到 FF 不会帮助 DFT 找到卡在复位值的网络。使用 DFT 扫描链方法,其中所有 FF 都通过扫描链加载,因此某些 FF 上缺少复位将不需要更多向量。

于 2015-04-11T05:17:59.530 回答
1

我同意 Morten Zilmer 的观点,即您应该只重置需要重置的触发器,尽管我的背景是 FPGA 而不是 ASIC。

值得指出的是,在 Verilog / SystemVerilog 中有一个陷阱——如果你有一个时钟进程来驱动被重置的寄存器不是你的寄存器,你最终会在你的翻转输入上推断出时钟启用或额外的多路复用器——翻牌。

state.b 上的意外时钟启用

这通常不是预期的。

这个答案有更详细的解释。我还写了一篇博文,概述了一种抽象同步/异步和主动高/低复位的机制。

于 2015-04-16T09:09:52.233 回答
1

通常,您需要考虑“X”将在您的模拟中传播到哪里,哪些很重要,哪些是无关条件。例如,如果您有一个在设置启用位之前不会开始运行的逻辑块,只要设置了启用位本身并且重置了足够的上游逻辑,那么重置值将及时传播到启用的逻辑,您很可能可以不重置两者之间的逻辑。但是,您确实希望重置任何反馈到自身的逻辑(例如状态机),否则上游重置将永远无法在反馈块中建立已知状态。

于 2015-04-13T16:45:25.753 回答
1

作为一般经验法则,您可能应该始终重置控制信号。

对于数据触发器,重置可能会花费您的区域,因此这实际上取决于您是否关心区域。

近年来,模拟器开始支持 X 传播模式,允许您在 RTL(而不是门级模拟)中捕获一些 X 问题。运行这些以确保您没有未初始化的 sram 或触发器的重置问题是一个很好的做法。

于 2016-05-06T09:32:25.153 回答