时钟生成
Posted on 2015-04-19 00:00 in IC
Verilog 编程艺术 时钟生成 笔记,内容基本上都是书上的内容,还有我自己的总结,混合在一起,就不加引用符号了。
如果说总线互连(Bus Matrix)是系统各骨架,CPU 是系统的大脑,那么时钟生成模块(CGM)就是系统的心脏,整个系统就是在时钟的脉搏下有序协调地工作。
我们在设计时钟生成模块时,我们需要考虑下面这些问题。
-
芯片需要多少时钟?它们之间的关系是同步到还是异步的?
-
芯片需要几个时钟源?时钟源是在芯片内还是芯片外?
-
需要使用 PLL 吗?需要几个 PLL?PLL 最高工作频率是多少?
-
如何分频生成各个模块所需要的时钟频率?
-
为了节省功耗需要几种工作模式?它们之间如何切换?
-
测试模式下如何处理时钟信号?综合时如何插入扫描链?
-
代码如何编写才能方便后端做时钟树综合?后端如何做时钟树综合?
Clock
我们都知道,电路设计可以分为 同步设计 和 异步设计 两种,两者的优缺点就不再赘述。由于同步设计的一些优点,一般推荐使用同步设计,即使有异步信号,也将其转化为同步信号,来避免异步信号导致的问题。
虽然同步电路有很多优点,但是它也有一些缺点:
-
首要问题是 时序收敛问题
也就是要保证所有的 flip-flop 的输入端和时钟端之间满足 setup/hold time 的要求,否则就会出现亚稳态,导致电路无法正常工作。
不满足 setup time 的要求,可以通过降低工作频率的方法解决,但是不满足 hold time 时,芯片根本就无法工作。
时序收敛点工作都是由 EDA 工具自动完成的,我们只要设置合理的时间约束,综合及布局布线工具就可以实现时钟平衡,时序分析工具就可以检查电路是否满足时序收敛。
-
其次,对时钟信号要求高
同步设计的基础是时钟信号。关于时钟信号,另外一篇博客 静态时序分析 STA 1 —— 基础知识 有一些总结,比如时钟偏斜 skew、时钟抖动 jitter、占空比失真 Duty Cycle Distortion。
时钟偏斜 skew 的解决方法是采用 EDA 工具进行时钟树综合,它的原理就是按照时钟树的最大长度去平衡其他的时钟路径。但是这种方法会引入大量延迟单元的插入,使得电路的面积和功耗大大增加。
Design Principle
下面是设计时钟生成模块(CGM)时要遵守的一些原则:
-
CGM 要独立于系统的其他模块,其他模块所使用的时钟都要从 CGM 中引出
-
CGM 要有很好的层次结构,既便于前端定义时钟和分析时序,又便于后端做时钟树综合
-
为了调整性能和功耗,CGM 应该支持分频器和停时钟,而且软件能灵活控制
-
在时钟切换和启停时钟时,一定不能出现毛刺,否则电路不能正常工作
Clock Divider
在一个系统中,各个模块可能需要不同的工作频率,这就需要通过 PLL 把时钟源的频率提高到高频,然后通过不同的分频器为每个模块分出不同的工作频率。
以前总结一篇关于 时钟分频器 的博客。
Clock Switch
有时候,我们需要在模块运行的过程中切换时钟,切换时钟最简单的方法就是使用 MUX。但是这种方法会造成毛刺(glitch)。如下:
1 2 3 |
|
书上提供了一个通用的没有 glitch 的时钟切换模块,支持多个时钟的切换,其中 select 信号必须使用 one-hot 编码。(代码略 ...)
Clock Generation
有了上面的基础,就可以设计时钟生成模块了。书里面以一个 时钟切换 + 时钟分频 的组合来说明如何设计。
书后面一章还提供了一个实际项目中的 CGM 的设计文档,以供参考。