购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第五回
听指挥时钟析分 系统时钟与时延

现在有一种趋势,某家不是十分认可。那就是把Verilog作为一种语言,只做代码设计和行为仿真,就认为可以完成设计了。这个现象可能有诸多可以说的原因,借口也好,经费问题也好,懒也好,这里不必多说。但是,这是很不好的现象。打个比方:这就像你从北京到承德度假,结果旅行团到了张家口就解散了。如果是这样,你能饶了旅行社?同样道理,您老只做行为仿真,请你不要再说看过老夫的这本书。贫僧还是那句老话:“再忙也要时序仿真”。

很多人还是不理解行为仿真与时序仿真的区别,这一讲里面,在下就从最基本的根源说起……

既然说到了旅行,老夫就先做一回兼职的导游,带大家游览一次芯片内部的风景。

今天,我将带领大家来个缩骨大法,将我们缩小到原子的尺度,来参观FPGA/ASIC的内部风景。新《旅游法》已经实施了,本次旅游绝无自费项目和强制消费,请诸位放心。尚未买保险的客人们,请与有关部门联系购买事宜。

1.越俎代庖说结构

各位游客,现在我们正沿着PCB市的数据大道,走向芯片大厦,就是大家眼前巨大、银色的大厦。我是本次旅行的导游,敝姓栾,大叫可以叫我栾(乱)导。路途之中,为了使大家不至于感到无聊,本人先给大家略略介绍一下,什么是数字电路的时钟。

闲话一句,时钟在芯片上的结构属于设计后端工程上的一亩三分地。但是,奈何现在他们都不在,贫僧只好“狗拿耗子”地来掰扯掰扯了。

时钟信号是时序逻辑的基础,它用于决定逻辑单元中的状态何时更新。时钟信号是指有固定周期并与运行无关的信号量,时钟频率(Clock Frequency,CF)是时钟周期的倒数。理论上,时钟边沿触发信号意味着所有的状态变化都发生在时钟边沿到来时刻。

首先,来看看时钟信号的来源,这叫“正本清源”。时钟信号一般不是芯片自己产生的,是从片外来的。

时钟信号一般由芯片外的晶振(石英晶体谐振器,英文:quartz crystal unit或quartz crystal resonator,常简写成Xtal,简称石英晶体或晶振。晶振是利用石英晶体/水晶的压电效应,用来产生高精度振荡频率的一种电子元件)产生,通过专门的时钟引脚引入FPGA/ASIC。再由芯片内的专门电路网络,输入到各个寄存器。

为了保证时钟的精度,一般重要的设备都采用温补晶振(Temperature Compensate Xtal Oscillator,TCXO),来补偿温度对于晶振的影响。另外,有些芯片也会有时钟恢复功能,这样需要采用压控晶振(Voltage-Controlled Oscillator,VCO)。这些都是闲话,大伙儿就瞧瞧热闹,不必细表。

下来,再分析一下时钟信号的特点,这叫“重点突破”。数字电路中,时钟是整个电路最重要、最特殊的信号。

第一:系统内大部分器件的动作都是在时钟的跳变沿上进行,这就要求时钟信号时延差要非常小,否则就可能造成时序逻辑状态出错。

第二:时钟信号通常是系统中频率最高的信号。

第三:时钟信号通常是负载最重的信号,所以要合理分配负载。

最后,观赏一下别人的设计,这叫“拜见牛人”。

好的,今天的参观,我们就从芯片的时钟树结果开始。由于上面介绍的特点,在芯片这类可编程器件内部一般都设有数量不等的专门用于系统时钟驱动的全局时钟网络,这种网络就叫做时钟树。

从顶端看下去,可以看到从相同的时钟管脚开始向下延伸,如同人类的血液系统,芯片中的时钟信号被传递到各个寄存器。这个时钟,到达远端的寄存器,需要经过漫长的电路,所以片外的时钟芯片需要被锁定和增强,才能够驱动这数以亿计的寄存器。还有人能记住《数字电路》里面的“扇出数”这个概念吗?如果还记得,就不难理解为什么要多级了。

不仅如此,为了达到系统同步的目的,所有寄存器的时钟信号到达时刻允许的差别(子时钟时延,用洋文说就是Skew。Skew是指时钟偏移的抖动,同样的时钟产生的多个子时钟信号之间的延时差异。它表现的形式是多种多样的,既包含了时钟驱动器的多个输出之间的偏移,也包含了由于PCB走线误差造成的接收端和驱动端时钟信号之间的偏移)也要特别小。

还需要考虑信号的完整性问题。妈妈咪呀,这些看起来似乎很难。套用一句 2013年春晚里面的台词:“幸好,我们不必操心这些。”

图1.11 时钟树的一个例子

芯片中采用时钟树(Clock Tree System,CTS),如图1.11所示,来达到对于芯片各个部分的统一时钟要求。时钟树,是个由许多缓冲单元(Buffer Cell)平衡搭建的网状结构。它有一个源点,一般是时钟输入端(Clock Input port),也有可能是design内部某一个单元的输出脚(Cell Output Pin),然后就是由一级一级的缓冲单元搭建而成。具体多少级,根据设置以及所使用的单元而定,目的就是使所用终点的clock skew(一般最关心这个)等指标达到设计要求。至于如何采用驱动门,如何调节时延,这些是后端工程师的基本功,咱们这些前端的倒是晓得个常识就好了。

话虽如此,如果你抱着“事不关己,高高挂起”的态度,随意设计系统的时钟的话,后端设计工程师绝对会带着刀子找你拼命的。不要叫别人打你个满脸桃花开,你才知道花儿为什么这样红。“本是同根生,相煎何太急”啊,兄弟。

时钟布线三部曲到此结束,再套用《牡丹亭》里面的名言做为总结:“不瞧时钟,怎知复杂如许?”

啰啰嗦嗦讲了这么多,总结一下,大家只要记住一点:寄存器的时钟的触发沿是有差别的就好了。

2.丰富多彩说设计

有了时钟树布局和时钟沿存在差别的概念,我们才能理解下面的内容。

大伙,随我来,在时钟大广场上将会看到四座巨大的雕像。这几座雕像以后现代解构主义的手法,表现了四种不同的时钟形式。

第一位是大名鼎鼎(小名吗?不清楚,待考)的全局时钟(Global Clock),见图1.12。它是由片上的时钟管脚引入,经过锁相和放大之后进入时钟树,输出给寄存器的稳定、可靠的时钟信号。这种时钟的时延被设计得最小,相对抖动也最小。后端工程师也不是吃素的,设计的时钟树那叫杠杠滴。

图1.12 全局时钟

第二座是为了纪念数字逻辑设计里面愚蠢的时钟:门控时钟,见图1.13。这种时钟从一些信号经过组合逻辑产生,表面上看着一个字:“美”。但是,既然设计中连时钟的同步都做不到,难道组合逻辑的同步就那么简单吗?答案是:(做到同步)这个真的没有。于是,麻烦来了,这个组合逻辑的时钟,也会上窜下跳的了,整个一个孙猴儿。试问,这种时钟谁敢用?哪个艺高人胆大的,来试试?

图1.13 门控时钟

如果有人面试你,当然不能用上面的说法了,不够严肃。您老可以这样说:首先,组合逻辑一定存在“毛刺”(至于为什么,这一讲的下面会交代,这里不多说),可能造成寄存器状态混乱。其次,这种时钟不能被引入到时钟树系统,无法保证对于时钟抖动的要求。综上所述,在大型系统中不建议采用。这就完美了,面试通过,Offer(录取通知书)到手……

接下来,为了体现IQ无下限,我们见到了第三座雕像:多级逻辑时钟,见图1.14。它不仅仅用了组合逻辑还加入了前级寄存器的输出。所谓,毛刺也无极限啊。哪个艺高人胆大的,想来试试?这个面试的说法,和门控时钟一致。不多说,省的您埋怨我多写字诳钱。

图1.14 多级逻辑时钟

最后也是一个“英明”的设计:行波时钟。如同莫小贝的最爱——糖葫芦,上级寄存器的输出作为下级寄存器的时钟逐次传下去。理论上,行波时钟可以非常完美地运行下去。

这种设计来源于传统中等规模集成电路时代的一种设计。那个时候,天空是不是很蓝贫僧不清楚;时钟信号走的PCB(Printed Circuit Broad,印刷电路板),贫僧倒是确定的。没有时钟线什么的概念,行波计数可以简化电路,不失为一种可行的设计。

但是,到了现在大规模集成电路时代,这个设计就落伍了。考虑到这些寄存器时间的时钟时延控制难度,我们不得不说:行波链上的时钟波动会变得极大,最终破坏整体时延要求,使得系统的整体工作时钟严重降低,见图1.15。

图1.15 行波时钟

有诗赞曰:“芯片设计万万千,抓住时钟是关键;四大金刚长得帅,唯有全局获方便。”

有的客人会说了:不是有多时钟系统吗?多时钟是有的,但是或者需要通过同步化,或者不同时钟系统之间需要某种隔离。这两个技术,在后面的讲座中,都是会遇到的。

3.深入基层道时延

图1.16 HDL综合流程

这里,再买一送一,提供硬件描述语言的综合流程图一份,如图 1.16 所示。Verilog 代码,只有结合技术/工艺库,才能真正被综合。换一句话说,不同的技术/工艺,可能获得的综合结果是不同的。洒家屈从一下C程序员的习惯,汝等可以将不同的技术或者工艺视为不同的操作系统。这样可以理解了吧?

接下来,我们会进入时延风景区,免费体验一下信号的时延风光。

图1.17 实际系统中的时延

在下给大家聊聊组合逻辑和时序逻辑的时延来源,以及老生常谈但是没人注意的“冒险”问题。

从简单入手,先看看组合逻辑的情况。组合逻辑的时延又可以分为处理时延和布线时延。首先,处理时延应该不难理解。教您做个8比特位宽的计数器,您老还要一天时间呢。人家组合逻辑干活要点时间,这也算天经地义的了。您没意见吧?处理时延是器件本身的特点造成的,非人力可以改变。其次,布线时延是组合逻辑内部的布局布线引起的。很多情况下,一个组合逻辑不一定是一个FPGA逻辑单元/ASIC的门可以完成的。多个逻辑单元/门之间就存在连线,也就存在连线时延。另外,组合逻辑的输入信号到达逻辑也不一定是理想的,还有组合逻辑到观察点(例如D触发器的输入点)也存在skew。

图1.17是一个信号由全0变为全1的例子,可以看出不同阶段的信号变化时机不完全一致。只有后仿真的结果,才是与系统比较契合的。所以,如果只做行为仿真,再快的时钟也是可以的。

上面的诸多原因都会造成组合逻辑的“冒险”问题。

“冒险”是指由于各种时延造成的非理想信号的产生。这些非理想信号称为“毛刺”,见图1.18。举一个例子:对于2路的异或(XOR)门,两路信号由全“1”变化到全“0”。理论上,输出应该是全“0”;但是,由于信号到达的时间有所差别,如图 1.18,输出出现了不希望的一个短暂的“1”。一般说,“毛刺”持续的时间不会太长。如果信号后面接的是类似触发器的采样性质的电路,只要毛刺不出线在时钟触发沿附近,一般可以被忽略。

图1.18 “毛刺”的例子

图1.19 高频率时钟造成的结果错误

对于时序逻辑,除了组合逻辑的时延之外,还要考虑上文说到的时钟间的抖动问题,所以“毛刺”出现的可能性更多。

但是,如果在时序仿真阶段,时钟快到了低于系统的处理时延,麻烦就来了。如图 1.19 所示,如果时钟上升沿在信号变化的中间,那么输出信号就不是“1111”而是“1011”。“你就摊上事儿了,摊上大事儿了”。

另外,还有一点值得提醒一下,组合逻辑输入信号的位宽越大,那么对应的处理时延和抖动也会越大,这点很重要。

为了减少高速时钟情况下,“冒险”对于系统的影响。一般采用的方法就是拆分触发器之间的组合逻辑,这个在后面会经常遇到。

4.谨慎处理多时钟

我们出生之时,已经是大规模集成电路的时代了;现在开始赚钱了,遇到的系统也是极为复杂的。假如还守着全局统一时钟的桎梏,那么您老人家不是还在学习就是非常非常的幸运。像贫僧这种年会上最多抽到手纸的运气,遇到的系统几乎都是多时钟或者叫异步时钟的。天不佑吾,我却要活,如之奈何?

但见有人来抬杠:“贱人就是矫情。上面还说要全局时钟呢,现在就介绍多时钟了。红口白牙的,随便翻啊!”

有些系统纯粹为了节约PCB面积的原因,把几个不相干的系统(当然也包括时钟不相干)放在一个芯片内。系统之间没有数据交互的,这里不讨论了,实实在在和本书的内容无关。如果多时钟系统之间存在数据交互,或者存在触发关系,那么看官来得刚刚好,您老的银子没有白花。

全局时钟是“丰满的理想”,多时钟是“骨感的现实”。即使不能做鲁迅先生说的“敢于正视淋漓的鲜血”的勇士,为了混口饭吃大伙儿也不得不“直面惨淡的人生”。举一个例子,说明一下场景,也证明一下某家不是“没有问题,制造问题”。现在芯片里面嵌入一个处理器已经算主流了,无论我们愿意与否,大家的设计越来越属于协处理器的范畴了。一般因为成本问题,处理器采用硬核的居多。这种硬核一般存在锁相环,也就造成了处理器的时钟与芯片的全局时钟不一致的情况。此时,处理器与我们设计电路的数据交换就需要特殊处理。

记住一句口诀,多时钟系统问题也就迎刃而解了。庖丁解牛的要诀是:“时钟触发变使能,数据交换靠隔离。”

“时钟触发变使能”是说:如果一个系统的时钟是另一个系统产生的门控时钟或者多级逻辑时钟,那么可以采用第二个系统的时钟,而把产生的时钟变成第一个系统的使能信号。这个方法的基本结构可以见图1.20。实际上,在第一讲中老朽给出的累加器的原理图里面就采用了这种手段,不晓得有多少人注意到了?

图1.20 将逻辑时钟变为使能信号

至于“数据交换靠隔离”是说:对于不同系统之间的数据交换,依靠器件隔离,保证不会产生读写冲突。这个方法的基本结构可以参考图1.21。这些隔离单元可能是双口异步FIFO(First In First Out,先入先出队列)、双口RAM或者专门设计的读写时序。这些器件都将会在第2章里面详细介绍,这里留个念想。

图1.21 不同时钟系统的数据隔离

最后,当然也可以采用大量的锁相环保证各个时钟的同步。但是,这种方法一则造价较高,另外也只适用其他时钟是最快的时钟的整数倍的情况,最好在不得以的时候再使用。

各位游客,今天的旅行到此就结束了。欢迎下次光临。

这正是:“时钟输入芯片里,其中抖动要仔细;组合时序存毛刺,实践全局是唯一。高速设计须在意,分裂电路为真谛;异步时序狭路逢,小心谨慎靠隔离。” sszLLSiw5D+ok2O0HD6MNjEHOS4XIkHNZ10j8CP1tOKLCvjGXJHMkMSSYeetwXe6

点击中间区域
呼出菜单
上一章
目录
下一章
×