时钟生成

Posted on 2015-04-19 00:00 in IC

Verilog 编程艺术 时钟生成 笔记,内容基本上都是书上的内容,还有我自己的总结,混合在一起,就不加引用符号了。


如果说总线互连(Bus Matrix)是系统各骨架,CPU 是系统的大脑,那么时钟生成模块(CGM)就是系统的心脏,整个系统就是在时钟的脉搏下有序协调地工作。

我们在设计时钟生成模块时,我们需要考虑下面这些问题。

  1. 芯片需要多少时钟?它们之间的关系是同步到还是异步的?

  2. 芯片需要几个时钟源?时钟源是在芯片内还是芯片外?

  3. 需要使用 PLL 吗?需要几个 PLL?PLL 最高工作频率是多少?

  4. 如何分频生成各个模块所需要的时钟频率?

  5. 为了节省功耗需要几种工作模式?它们之间如何切换?

  6. 测试模式下如何处理时钟信号?综合时如何插入扫描链?

  7. 代码如何编写才能方便后端做时钟树综合?后端如何做时钟树综合?

Clock


我们都知道,电路设计可以分为 同步设计异步设计 两种,两者的优缺点就不再赘述。由于同步设计的一些优点,一般推荐使用同步设计,即使有异步信号,也将其转化为同步信号,来避免异步信号导致的问题。

虽然同步电路有很多优点,但是它也有一些缺点:

  1. 首要问题是 时序收敛问题

    也就是要保证所有的 flip-flop 的输入端和时钟端之间满足 setup/hold time 的要求,否则就会出现亚稳态,导致电路无法正常工作。

    不满足 setup time 的要求,可以通过降低工作频率的方法解决,但是不满足 hold time 时,芯片根本就无法工作。

    时序收敛点工作都是由 EDA 工具自动完成的,我们只要设置合理的时间约束,综合及布局布线工具就可以实现时钟平衡,时序分析工具就可以检查电路是否满足时序收敛。

  2. 其次,对时钟信号要求高

    同步设计的基础是时钟信号。关于时钟信号,另外一篇博客 静态时序分析 STA 1 —— 基础知识 有一些总结,比如时钟偏斜 skew、时钟抖动 jitter、占空比失真 Duty Cycle Distortion。

    时钟偏斜 skew 的解决方法是采用 EDA 工具进行时钟树综合,它的原理就是按照时钟树的最大长度去平衡其他的时钟路径。但是这种方法会引入大量延迟单元的插入,使得电路的面积和功耗大大增加。


Design Principle


下面是设计时钟生成模块(CGM)时要遵守的一些原则:

  1. CGM 要独立于系统的其他模块,其他模块所使用的时钟都要从 CGM 中引出

  2. CGM 要有很好的层次结构,既便于前端定义时钟和分析时序,又便于后端做时钟树综合

  3. 为了调整性能和功耗,CGM 应该支持分频器和停时钟,而且软件能灵活控制

  4. 在时钟切换和启停时钟时,一定不能出现毛刺,否则电路不能正常工作


Clock Divider


在一个系统中,各个模块可能需要不同的工作频率,这就需要通过 PLL 把时钟源的频率提高到高频,然后通过不同的分频器为每个模块分出不同的工作频率。

以前总结一篇关于 时钟分频器 的博客。


Clock Switch


有时候,我们需要在模块运行的过程中切换时钟,切换时钟最简单的方法就是使用 MUX。但是这种方法会造成毛刺(glitch)。如下:

1
2
3
always @(clk_a or clk_b or sel) begin
    if (sel)    out_clk <= clk_a;
    else        out_clk <= clk_b;

书上提供了一个通用的没有 glitch 的时钟切换模块,支持多个时钟的切换,其中 select 信号必须使用 one-hot 编码。(代码略 ...)


Clock Generation


有了上面的基础,就可以设计时钟生成模块了。书里面以一个 时钟切换 + 时钟分频 的组合来说明如何设计。

书后面一章还提供了一个实际项目中的 CGM 的设计文档,以供参考。

Ref

Verilog 编程艺术