1.4.2 同步原则
同步原则指的是整个设计采用同步时序电路,“同步”意味着设计中的所有逻辑单元“步调保持一致”,即所有电路在同一时钟沿的触发下同步处理数据。这样看来,设计中只允许存在一个时钟,我们把这种“同步”称为狭义的同步。毕竟,随着芯片规模增大和设计复杂度增加,设计中的时钟个数也越来越多。例如,外部存储器接口时钟、以太网接口时钟、PCIE接口时钟、PS侧时钟、PL主时钟等。因此,我们又引入了广义的同步。这里我们先给同步时钟下定义,所谓同步时钟,是指时钟组(一个时钟组至少有两个时钟)内的时钟之间有明确的相位关系。反之,若时钟组内的时钟之间没有明确的相位关系,则认为它们是异步时钟。最典型的同步时钟场景是时钟组内的时钟是由同一个MMCM/PLL生成的,而异步时钟场景是时钟组内的时钟由不同MMCM/PLL生成,如图1-37所示。在图1-37中,clk0和clk1是同步时钟,clka和clkb是同步时钟,但{clk0,clk1}和{clka,clkb}是异步时钟。从而,模块1内存在同步跨时钟域电路,而模块2内存在异步跨时钟域电路。显然,后者无论是电路设计还是时序约束都更为复杂。因此,广义的同步是指电路在同步时钟的作用下处理数据。
图1-37
尽管当前的FPGA设计允许存在多个时钟,仍要遵循“时钟个数尽可能少”的原则。一方面可以简化跨时钟域电路,另一方面有利于时序约束和时序收敛。这就要求我们在设计初期制定时钟方案时就要明确设计中有哪些时钟,它们之间的关系如何,是否可以由同一个MMCM/PLL生成。
之所以遵循同步原则,还因为相比异步设计,同步设计有着明显的优点。首先,同步设计可以有效地避免毛刺的影响,增强设计的稳定性。组合逻辑可能会产生毛刺,如果毛刺仅存在于同步时序的数据路径中,那么受时钟驱动的触发器就可以过滤掉毛刺,因为触发器仅在时钟有效沿才会有动作,从而消除其对电路的影响。如果将该组合逻辑的输出连接到触发器的控制端,如作为触发器的异步复位/置位信号,那么当毛刺足够宽时,就可能导致触发器误动作。即使毛刺的宽度不足以驱动异步复位/置位端,也会造成触发器不稳定,甚至激发其产生亚稳态。其次,同步设计可以减少外部环境对芯片的影响。芯片的实际工作环境可能要比实验环境更为恶劣,这也是我们做高低温实验的一个主要原因,即检测当前设计是否能在不同环境下正常工作。此外,长时间运行也会使芯片自身温度升高,使电压变得不稳定,芯片内部延时可能会发生微小变化。如果采用异步设计,对时序要求比较严苛的电路将无法正常工作,这是因为异步设计的时序正确与否完全依赖于每个逻辑元件的逻辑延时和布线延时。最后,同步设计更有利于静态时序分析(Static Timing Analysis,STA)和验证设计的时序性能。这得益于同步设计的时序约束更为简单。即使对于同步跨时钟域路径,工具也可以自动对其进行约束,当然有时会出现约束不合理的情形。