今天想来聊一聊芯片设计中的一个非常基础的概念——时钟。对于外行来说听到这个词可能会感觉迷茫,猜一个大概意思吧可能也不太准。对于芯片工程师来说时钟这个词就像每天喝水吃饭一样平常,以至于可能从来不会注意它的存在。我也趁此机会,通过写文章的方式,梳理一下我所理解的芯片时钟是怎么一回事。
提起时钟,就不得不先说芯片的两种逻辑——时序逻辑(sequential)和组合逻辑(combinational)。组合逻辑比较好理解,他就是我们常说的与或非这种逻辑门,输出信号逻辑仅仅依赖于输入信号的逻辑,或者按我的理解,组合逻辑的信号传播是瞬间完成的(不考虑cell delay的话)。不管是多么复杂的组合电路,就比如刚入门电路时候大家都会学一些全加器、半加器、超前进位加法器什么什么的,虽然电路图猛一看特别复杂,可能一张图还画不完,但只要他全部是由逻辑门构成,都可以认为当给定输入信号的时候,输出是不需要等待就可以直接看到的。当然这只是我的理解啦,具体的组合逻辑定义肯定不是这样吧?而时序逻辑,最重要的就是出现了由时钟驱动的信号。什么意思呢?就是说电路中存在这样一类器件:他有一个特殊的控制输入信号,当这个信号跳变的时候,输出信号才会根据其他一般的输入信号变化。我们一般称这种器件叫触发器(flip-flop),而称这种特殊的控制信号叫时钟。举一个最简单的D触发器的例子,当时钟从0到1跳变的时候,输出才等于输入,其他时间,不管输入如何变化,输出保持不变。由此可以看出时序逻辑器件一个重要的功能:寄存数据,因此这些触发器有时候也可以被称为寄存器(register)。当然还有另一种时序逻辑器件叫锁存器(latch),它是指时钟信号维持某个电平时信号才可以传输。
随着flip-flop的出现,时钟的概念也就应运而生了。其实时钟并没有多么奇怪的,他只是一个特殊的控制信号罢了。但是请大家思考这样一个问题:随着电路渐渐复杂,不同电路分支输出的信号我总要抓取的呀,而具体什么时间点抓取信号就成了问题。如果这个时钟信号一会快一会慢,那么信号的抓取就会很艰难。所以为了规范化、统一化整个电路,让大家都按照同一个规则来走,那么设计就会变得简单化,这也是时钟信号(clock)的最初衷。为什么要叫“时钟”?就是希望这个信号能像钟表一样,稳定的每隔一段时间跳变一次,很形象吧?一个稳定的时钟会控制这个时钟域所有的时序器件,这些器件就会统一的隔一段时间跳变一次,或者说信号传输一次,这就使我们的逻辑设计成为可能。
那么,我们如何得到一个稳定的时钟呢?现在的芯片一般是由晶振产生一个周期信号,但这个信号并不太好,需要后面经过一系列处理,关键的一步就是通过锁相环(PLL),最终得到一个我们想要的时钟。但是这个时钟也并不是数学意义上完美的,对我们后端来说,必须要考虑它的不确定性,就是说我们还是会认为它的周期一会大一会小,从来不会有一个完美的时钟在现实宇宙里,毕竟我们后端是要做具体芯片实现的,必须悲观考虑。时钟从PLL出来,到每个flip-flop的delay也会不同,而我们又希望所有flip-flop都同时跳变,就需要一步CTS(时钟树综合)。这些就比较深入了,PLL和CTS以后再用别的章节来讲吧。
突然又想到一个贴近生活的例子,我们平常看电脑CPU多少多少赫兹,就是指CPU的时钟频率,时钟频率越高,CPU计算速度自然就越快了嘛。而所谓超频,就是强行增大CPU的时钟频率,可以使CPU速度提高。但是频率越快,timing越难满足,可能会出现setup violation哦,所以说超频更容易死机,而且power也会变大,对芯片也不太好哟。
微信公众号:伟酱的芯片后端之路