我正在尝试理解芯片中的时钟重置。在设计中,使用什么标准来决定在复位期间是否应将触发器分配给某个值(通常为零)?
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了。然而,似乎对于数据路径逻辑,重置flop可能不是什么大问题,因为它只是管道阶段。但是,如果触发器在控制路径中(即FSM下一状态梳状逻辑),则应将其重置为默认值。我的理解正确吗?我对DFT了解不多,也不确定它是否有其他含义。
发布于 2015-04-11 13:18:00
假设重置意味着异步重置,如代码示例所示。
答案在一定程度上是基于观点的,因为设计可以在复位最小数量的触发器( of )和所有of的情况下工作。
我建议复位最小数量的FF,这通常会导致控制路径中的大多数FF复位,而数据路径中的FF则不会复位。下面概述了这种方法的优点。
对于未初始化值的传播,模拟通常是保守的,无论是对于Verilog还是VHDL语言,因此当值未初始化时,模拟可以同时检查0和1值。
由于未重置的FF导致的错误,因此可能会在通过模拟进行验证时更早地显示出来,因此设计者可以获得关于错误设计假设的有价值的反馈,这可能导致设计中的更正,从而修复其他错误。仅仅重置所有的FFs很可能会隐藏这些bug。
如果控制和数据路径中的所有if都被重置,那么设计和验证似乎就更容易了,因为它修复了设计中所有那些“恼人的”X传播。但它需要更多的测试,以便在通过重置抑制X传播时验证所有值组合。
Implementation对复位信号的负载较小,因此更容易满足整个芯片复位网络的时序要求。
DFT (面向测试的设计)一般情况下,将reset添加到FFs将不会帮助DFT找到卡在重置值的网络。使用DFT扫描链方法,其中所有的FF都是通过扫描链加载的,那么在一些FF上没有复位将不需要更多的向量。
发布于 2015-04-14 00:45:26
通常,您需要考虑‘X’将在您的模拟中传播到哪里,哪些重要,哪些是无关条件。例如,如果您有一个逻辑块,该逻辑块直到设置了使能位才开始操作,只要设置了使能位本身,并且重置了足够的上游逻辑,重置值就会及时传播到已启用的逻辑,您很可能可以不重置中间的逻辑。但是,您确实希望重置任何反馈到自身的逻辑(例如状态机),否则上游重置将永远无法在反馈块中建立已知状态。
发布于 2015-04-16 17:09:52
我同意Morten Zilmer的观点,你应该只重置需要重置的flops,尽管我的背景更多的是FPGA而不是ASIC。
值得指出的是,在Verilog / SystemVerilog中有一个陷阱--如果你有一个时钟进程驱动复位的寄存器和不复位的寄存器,那么你最终会推断出触发器输入上的时钟使能或额外的多路复用器。

这通常不是我们想要的。
在this answer中有更详细的解释。我还写了一个blog post,概述了一种抽象同步/异步和活动高/低重置的机制。
https://stackoverflow.com/questions/29573968
复制相似问题