如何阅读大型设计代码--FPGA开发经验(一)

最近刚刚接到一个有关CAN总线控制器的程序,领导只是说先看,但没说看完之后要干嘛,猜测可能是后面需要调试板卡对接通信。

由于之前没有了解过CAN总线,因此这又是一次从零开始的摸索。

之前自己写过的程序虽然也不比这个程序的规模小,但是困难主要存在于以下几点:

  1. CAN总线的概念不了解(理论知识)
  2. 不清楚该CAN总线控制器模块的功能和通信对象
  3. 这是别人写的程序(编写习惯、命名习惯等),阅读起来有难度

一、了解概念

对于第一点,通常阅读相关理论介绍的博客,配合知网上面相关硕博士论文的引言加前两章理论背景介绍就可以掌握差不多。(需要花费一定的时间耐心阅读了解不熟悉的领域,较为枯燥)

二、了解设计功能

对于第二点,我目前的经验是从身边一切项目资源入手,比如将要运行本程序的板卡的原理图,相关项目文档(通常会有模块划分的依据和各个模块的功能介绍等内容,方便快速理解程序的结构),通过最外层模块端口信号的走向了解到该模块的周围模块(如果整个芯片内的设计已经完成),直接询问项目负责人。

相对第三点的难度和要花费的时间,前两步会比较轻松,进展也会比较快,但是它们对于完整理解整个程序是必不可少的。

三、熟悉模块内部结构和代码实现

第三点,最难最耗费时间的一环,如果前两点工作做得好,这一环会进展地非常顺利。结合在第二步中的理解,理清各个模块的层级结构和功能。这里建议在Visio绘制一个框图,或者从EDA中的工程Design列表中直接观察整个程序的结构,即各个模块的层级划分,个人觉得绘图更加直观。

之后就是弄清楚各个模块的功能和具体实现。各个模块的功能可以比较快速地了解,下面就是阅读程序。

当你了解清楚了整个设计的结构之后,可以根据自己的感觉(与你的经验和能力有关)找到一个合适的层级自上而下地阅读,也即是说没必要从最底层的模块开始阅读,然而直接从最上层开始阅读你要梳理的信号又太多,所以建议从中间选择一个合适的层级开始阅读。这样你对阅读的每一个模块在整体设计中的位置都能做到有一个较为清晰的认识,理解起来也会更加快速。

在选择好这个合适的层级之后,就可以开始从这个模块开始一个一个子模块开始阅读。个人经验是,主要看模块的接口信号有哪些,它们去向了哪里(与哪些模块相连),以及它们的时序和逻辑是怎样实现的。阅读程序的时候再结合相关的设计文档,原理图等资源,就能够很快地理解这个模块。

等到将某个子模块下的模块都阅读完之后,再在这个模块的层级将这些子模块按照设计的结构组织起来(这个时候你应该对每个小模块内部的端口信号和各个模块之间的连接都比较熟悉了),即可“征服”这个模块了。之后的阅读也是一样,化整为零,各个击破,再大的模块也能了解啦,yeah~

四、补充

在阅读过程中任何不清楚或者有疑问的地方(比如觉得这里是不是写得不对)要记录下来,然后反复阅读整理,刨根问底,一定要弄懂,不要模棱两可,既然是纯逻辑的东西就不可能找不到源头。

以上就是本人的一些经验和总结,欢迎指导交流,共勉。