写在前面
本文记录总结之前在FPGA分享会中学到的关于赛灵思系列的复位功能操作的设计以及建议,进行分析总结。
学习FPGA入门,有一说一我的领路人大部分都是用的intel的芯片下板验证,当时也不理解为啥子要这样复位,写抄就完了甚至感觉还挺有道理哈哈哈哈。
但是现在随着学习的深入我渐渐得发现复位还真是门学问。话不多说正文见。
总述
为什么复位?
使用全局复位有利于我们仿真,所有的寄存器都是有初始值的,也可以在任意时刻让你的寄存器恢复初值,所以验证工程师很喜欢这样的设计,但是Xilinx建议的是尽量避免使用全局复位。
复位的基本目的是使器件强制进入到可以稳定工作的确定状态。
这避免了器件在上电后进入到随机状态导致进入到无法判断的状态(也就是死机了)。在实际设计过程中,设计者必须选择最适合于设计本身的复位方式。
xilinx为什么不推荐异步复位?
- 异步重置将不会被添加到数据路径。所以数据路径对于时序分析来说是干净的。
- 电路可以复位与或没有时钟的情况下复位电路。
- 不需要综合指令
导致亚稳态
异步复位比预期的要复杂得多,异步复位与寄存器工作时钟域没有一定的相位关系,很难确保所有寄存器同时从状态中释放出来。
因为内部复位信号的偏差,寄存器A将在当前时钟周期内从复位中释放,C将在下一个时钟周期释放,B难以定义,甚至可能导致亚稳态。
简而言之,***亚稳态亚稳态亚稳态!!!***
浪费布线资源
异步复位信号会占用大量的布线资源是高速设计的必要条件,但我们不能看到它在源代码
-占用太多布线资源将减少其他连接的自由。
-可能降低系统性能潜在地需要一个更高的设备速度等级。
-增加布线时间。
浪费Slice资源
-有和没有异步复位的寄存器不能被包装在一个Slice
-不同异步复位的寄存器不能被包装在一个Slice
降低DSP和BRAM性能
如图,在XILINX内部 的dsp和bram中,只有同步复位,异步复位是不会包含复位到BRAM/DSP的
解决方案
- 不复位
- 同步复位
同步复位的好处
同步复位为工具提供了更多的灵活性
异步复位确实会出现高扇出的情况。Fan-out即扇出,模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛。因此,在写代码时应尽量避免高扇出的情况。
- 合成可以选择将控制信号的低扇出同步复位移到数据通路,以释放更多的寄存器。
- 这可以允许将这个寄存器打包到以前不可能的一个slice中
- 可以改善时序以及寄存器密度
同步复位让我们的设计稳定
从上图我们可以看出,在我们的复位发送故障时,我们的同步复位只能在时钟的边沿触发,这样进而保证了我们系统的稳定性,在复位故障时尽量相对保证系统稳定。
复位建议
- 避免复位
- 高复位
- 同步复位
- 不要混合复位
- 可以在寄存器初始化时候直接赋值
reg [7:0] code = 8'hff;
内部寄存器其实很多情况不需要过分复位,大不了之前的垃圾数据我们不用就行了。重置重置是设计中需要考虑和限制的更常见和重要的控制信号之一。重置可以显著影响设计的性能、面积和功率。
模块化复位
模块复位可以降低扇出,保证电路的稳定进行。
使用指令确保模块复位信号不被综合掉
example:
(* keep="true" *) reg my_modular_reset1; (* keep="true" *) reg my_modular_reset2; (* keep=“true” *) reg my_modular_reset3; always @(posedge clkA) begin my_modular_reset1 <= synchronized_reset; my_modular_reset2 <= synchronized_reset; my_modular_reset3 <= synchronized_reset; end
DSP片采用同步复位
DSP芯片比大多数实现的芯片更通用
-它可以用于乘数,增加/sub, MACC,计数器(与可编程终端计数),比较器,移位,多路复用器,模式匹配,和许多其他逻辑功能。
每个DSP片有效地具有> 310寄存器
-没有异步复位
使用同步全局重置可以使合成工具更容易地使用DSP切片
-异步复位方法将防止工具使用的存储资源在DSP片。