我试图理解芯片中的时钟复位。在设计中,使用什么标准来决定在复位期间是否应将触发器分配给一个值(通常为零)?
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,也不确定它是否有任何其他含义。
答案 0 :(得分:4)
假设重置意味着异步重置,如代码示例中那样。
答案部分基于意见,因为可以设计复位最少数量的触发器(FF)和所有FF。
我建议重置最小数量的FF,通常会导致控制路径中大多数FF复位,并且数据路径中不会复位FF。这种方法的优点概述如下。
对于Verilog和VHDL的未初始化值的传播,模拟通常是保守的,因此仿真可以在值未初始化时同时检查0和1值。
由于未复位的FF导致的错误因此可能在模拟验证中更早出现,因此设计人员可以获得有关错误设计假设的有价值的反馈,这可能导致设计中的修正以修复其他错误。只是重置所有的FF可能会隐藏这些错误。
如果在控制和数据路径中重置所有FF,设计和验证似乎更容易,因为它修复了设计中所有那些“恼人的”X传播。但是,当通过重置抑制X传播时,它需要增加测试次数以验证所有值组合。
实现给复位信号带来较小的负载,因此更容易满足整个芯片复位网络的时序。
一般情况下,DFT (设计测试),然后将重置添加到FF将无法帮助DFT找到陷入重置值的网络。使用DFT扫描链方法,通过扫描链加载所有FF,然后在某些FF上缺少复位将不需要更多矢量。
答案 1 :(得分:1)
一般来说,你需要考虑'X'在模拟中传播的位置以及哪些是重要的,哪些不关心条件。例如,如果你有一个逻辑块在设置使能位之前没有开始工作,只要使能位本身被置位并且足够的上游逻辑被复位,所以复位值将及时传播到启用的逻辑,你很可能没有重置之间的逻辑。但是,您确实希望重置任何反馈到自身的逻辑(例如状态机),否则上游重置将永远无法在反馈块中建立已知状态。
答案 2 :(得分:1)
我同意Morten Zilmer的说法,你应该只重置需要重置的触发器,尽管我的背景是FPGA而不是ASIC。
值得指出的是Verilog / SystemVerilog中有一个问题 - 如果你有一个时钟进程来驱动重置和寄存器的寄存器,那么你最终会推断时钟启用或在你的触发器输入端有一个额外的多路复用器。
这通常不是预期的。
this answer中有更详细的解释。我还写了一个blog post概述了一种抽象同步/异步和有效高/低复位的机制。
答案 3 :(得分:1)
作为一般经验法则,您应该始终重置控制信号。
对于数据触发器,重置可能会花费你的面积,所以这实际上取决于你是否关心区域。
近年来,模拟器开始支持X传播模式,允许您捕获RTL中的一些X问题(而不是门级仿真)。运行这些是一个很好的做法,以确保您没有未初始化的sram或flops的重置问题。