大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看完后喜欢的话就请关注我吧~谢谢~
在前面的文章里,我们对时钟的切换电路,分频电路和时钟门控电路进行了介绍,其实这些电路都是芯片中必备的时钟和复位产生模块(CRG, clock reset generator)中的时钟生成模块的基本组成部分。
在本篇文章中,我们将之前介绍的几个crg的组成部分拼合起来,组成一个基础的时钟系统电路。
一、crg电路
在我们的芯片中,各个模块的工作需要一个稳定的时钟源来确保其功能的正常实现。因此通常是通过振荡器(OSC,Oscillator)产生一个稳定的低频时钟,从osc输出的时钟经过了pll的倍频,再经过各种分频器后,会经过各种icg,buffer,最终到达各个触发器的时钟端。以下让我们展示一个基础的crg电路:
我们对上图中的各部分模块的功能进行介绍:
-振荡器(OSC):产生稳定的低频基准时钟,在osc的输出端,还添加了一个mux,用于选择pll的参考时钟的输入是来自与片内osc还是片外osc(即clk_osc_ext),这里之所以使用普通的mux,是因为我们不需要再芯片正常工作时,切换pll的参考钟,并且也不能随意切换!因为这很可能导致pll出现失锁等问题。
-
锁相环(PLL):基于OSC提供的基准时钟,生成稳定的高频时钟。
-
分频器(Divider):
将PLL输出的高频时钟进行分频,以满足不同模块对时钟频率的需求。
在这里clk_bypass_sel和clk_bypass_div是为了保证进行可测性设计(dft,design for test)的全速测试at-speed时,芯片内时钟频率是其最高频率,需要使得对应的时钟分频比为1,因此可通过加入一个mux,并利用clk_bypass_sel选择clk_bypass_div(该信号使得时钟的分频比为1),而非芯片内部寄存器的时钟分频比。
-
片上时钟控制器(OCC):用于在自动测试机台上对芯片进行全速测试时,根据scan信号控制选通ate时钟或者芯片内部的高速时钟进行测试。
-
时钟门控(ICG):
控制各个模块时钟信号的开启和关闭,以实现低功耗设计。
在这里有个信号scan_en,该信号的主要作用是:由于芯片的门控时钟使能信号是来自寄存器,且在进行scan shift时,寄存器的值并不确定,因此为了避免时钟被错误关闭,通过加入scan_en信号,使得时钟使能一直有效,从而时钟不会被关闭。
-
时钟选择器(glitch free clock switching circuit):
这里的glitch free clock mux是为了在芯片工作状态时切换时钟,并起到避免毛刺产生的作用。
除此之外,我们也可以使用普通的mux和这两个时钟路径上的时钟门控实现无毛刺切换时钟,例如:假设从clk0切换到clk1时,先关闭之前选择的时钟clk0的时钟使能信号,再改变sel信号选择另一个时钟clk1,最后使能时钟clk1,这样也可以实现无毛刺的切换时钟。
-
缓冲器(Buffer):增强时钟信号的驱动能力,确保时钟信号在传输过程中的稳定性和准确性。
在一个crg的时钟系统中,osc和pll是模拟电路,后续的时钟分频和时钟门控都是数字负责的,我们需要根据模块需求的工作频率,配置时钟的分频比,以得到满足性能的时钟,也需要根据芯片的工作模式,在模块不需要工作的时钟,对模块的时钟进行门控,关闭时钟的翻转,以减小不必要的功耗消耗。
除此之外,还有很多需要我们注意的细节,例如pll的lock需要时间,我们需要配合复位信号,最好等待pll稳定,再释放复位,以及芯片的操作系统和一些重要信息可能放在flush这类的非易失存储器中,我们需要在上电时先读取这些重要的信息再释放芯片中某些模块的复位等等。这些上电控制电路可以和crg进行配合,以确保芯片能够在上电后恢复到理想的工作状态。
二、总结
一个完整的crg模块由振荡器、锁相环、分频器、时钟门控和时钟缓冲器等组件组成。这些组件协同工作,为芯片内的各个模块提供稳定、可靠的时钟信号,本篇文章对crg中的时钟系统进行了简单的介绍,只是作为抛砖引玉,大家可以在后面的工作学习中积累更多的相关知识呢~
此外,在一个crg模块中,除了时钟系统外,还有复位系统,这部分我们就留到下篇文章在进行分享吧~
如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!