特权同学

不容忽视的跨时钟域设计

0
阅读(3497)

最近挺忙的,也没什么时间打理博客。但是再忙,也应该在适当的时候停下来做一点回顾,过去做过的对的不对的都应该做一些记录。一个项目中碰到了一系列跨时钟域设计中非常典型的问题,技术细节恐怕不会说得太详细,但是一定会说到点上。

从一个题外话开始吧,周三晚上家里电脑挂了,其实之前就有些症状,只不过我现在忙得都“懒”得去理它了,也最怕去折腾它了,因为很浪费时间。经常开机不久 就蓝屏,周三晚上算是“病入膏肓”了,一度无法进入系统中。其实初步的定位是一直以来怀疑硬盘有坏道导致的。当时重装系统也是常常认不到光驱或是无法重新 启动硬盘,于是不停的重复着应该算是“小概率”事件的进入系统桌面,然后在蓝屏前赶紧的把最重要的数据拷贝出来。还好虽然硬盘里躺着估计100多个G的 Byte,但是认为应该存活下来的也不过20来个G。今天上午完成了这个重大任务,于是大刀阔斧的准备低格它。但是看到关于蓝屏现象,网络上大伙都说和外 设连接导致异常有关,要么是线连接问题,要么是外设本身有问题。而如果按照我的猜想只是硬盘“挂了”,那么为什么光驱boot成功也是小概率事件,带着这 个疑问,决定先对主机彻底的“清理”一遍。打开布满灰尘的机箱,看到那条唯一的IDE线有些老化了,感觉应该先让他Out试试。这一试不要紧,在重新上电 后,一上午不再发生曾经大概率的蓝屏症状了。俺的低格计划也就暂时搁浅把,问题应该就是这样了(不管是那个经常超负荷工作的光驱本身还是那条嫌疑最大的排 线,总之问题的根源应该就是它们了)。这点问题其实也没什么,生活中我们常常要面对,工作上也是。而问题的解决可能非常的简单,一点不像出现的症状那么吓 人。

再回到标题上来,不可小视的跨时钟域设计。跨时钟域是逻辑设计中不变的话题。特权同学的《深入浅出玩转FPGA》一书有专门的篇幅有板有眼的介绍这方面的 解决办法。而实践中即便是自己也还是常常要在这方面吃一些“一不小心”的亏。问题定位的过程就像咱的电脑蓝屏一样,绕了一大圈才发现问题出在了最简单的地 方。

同样的跨时钟问题在一个项目的类似设计中出现多次,教训可谓深刻。首先一个问题是出在了CPU工作时钟和软件代码运行的FLASH上,CPU需要运行的软 件程序必须从FLASH读出,而这个CPU本身只给出了一组RAM运行代码的总线接口,而FLASH运行软件的代码是直接使用了官方给出的源代码。因此, 一开始只是想当然的将二者按照实例“对接”上了。却忽视了例化中供给二者的时钟不同,CPU跑得频率是FLASH频率的3倍多。于是在实际调试中,出现了 很多说不清道不明的“幽灵”现象。通常断电较长时间后若给芯片供电,第一次没反应,第二次通常就起来了,然后不停的上下电,一般也都能够起来,我们笑称 “是不是这个芯片要充电啊”。但是从始至终居然有那么一个样机(一共有四套)非常坚挺的从来不出这个症状。开始我们一直怀疑是芯片厂商提供的所谓“工程样 片”有猫腻,但是随着调试不断的深入,工程代码改进后不断产生新的编译结果,有些工程的逻辑编译居然无论如何都无法让工程跑起来,对比前后能跑和不能跑的 工程,改动的地方确认是一些无关紧要的逻辑。和FAE谈到这些比较怪异的症状,并且我们也聊到了软件是运行在FLASH上,聊到了它们的时钟频率,FAE 给了我一些启发和灵感。于是深入的去解析那份“舶来品”,发现了CPU读写代码接口中的等待信号非常可能就是罪魁祸首。我们做了一个假设,比如CPU以 100M在跑,FLASH操作是20M。CPU需要每若干个时钟周期执行一次软件代码读操作,FLASH要响应这样一次操作要慢很多,因此FLASH就是 通过wait信号来拖长CPU的操作时间,以保证完成这样的一次读操作。那么wait信号是由FLASH的时钟产生的,它会比CPU的时钟慢很多。存在那 么一种情况,当CPU执行第一个读操作时,好不容易等到了FLASH模块的wait信号,然后发出第二次的读操作,而此时由于这个wait信号保持的时间 还未结束,那么CPU误以为是给它的wait信号了,所以接着往下走了。如此一来,软件就大乱了。这般推测后,特权同学适时的对这个wait信号的产生逻 辑做了一些处理,此后经过恩天的验证果然不再有芯片在上电后无法运行的情况了。

另外,由于项目中涉及CPU与内部逻辑的接口,说白了接口方式就两类,一类是CPU内部扩展的专用并行总线,一类是CPU的IO口直接连接控制。在 出现问题的时候,一直非常关注前一种接口,因为习惯上认为CPU的IO口控制的比较简单,肯定能够把数据送出去,但是并没有考虑到它们对内部的逻辑而言也 是不折不扣的“外星人”。在无数次改进并行接口方式确保稳定工作无果后,静下心来也就着问题找到这些也算是异步并习惯认为不用关心的IO接口时,只是抱着 试试的态度对它们用逻辑时钟做了一拍锁存来同步后,问题居然意外的得到了解决,数天之内也确实不再复现。

这一连串的异步问题困扰了特权同学数周,想说的还是那句话“不容忽视的异步设计”。但,也许很多时候,那些项目这些问题都是要在我们亲身经历了才愈发有感觉。