我正在尝试了解芯片中的时钟重置。在设计中,使用什么标准来决定在复位期间是否应将触发器分配给某个值(通常为零)?
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不太了解,也不确定它是否还有其他含义。
最佳答案
如代码示例所示,假定重置意味着异步重置。
答案部分基于意见,因为可以进行设计以复位最少数量的触发器(FF)和所有FF。
我建议复位最少数量的FF,通常这会导致控制路径中大多数FF的复位,而不会导致数据路径中的FF的复位。下面概述了这种方法的优点。
对于Verilog和VHDL,对于传播未初始化的值,模拟通常是保守的,因此就像模拟可以在未初始化的值时立即检查0和1值一样。
因此,由于未重置FF而导致的错误可能会在仿真验证中更早地显示出来,从而使设计人员获得有关错误设计假设的宝贵反馈,这可能会导致设计中的错误得以更正,从而修复了其他错误。仅重置所有FF可能会隐藏此类错误。
如果在控制和数据路径中重置所有FF,似乎设计和验证会更容易,因为它可以修复设计中所有“烦人的” X传播。但是,当通过复位抑制X传播时,为了验证所有值组合,需要增加测试次数。
实施方案使复位信号的负载较小,因此更容易满足整个芯片上复位网络的时序要求。
通常,DFT(测试设计)然后向FF添加重置将不会帮助DFT查找被重置值卡住的网络。采用DFT扫描链方法,其中所有FF都通过扫描链加载,那么某些FF上无需复位就不需要更多的向量。