- 首先看最顶层spec,即整个芯片的功能描述,搞懂基本功能,模块划分,工作流程
- 看目标模块spec前面的基础介绍部分,搞懂基本功能,模块划分,工作流程,位宽定义,输入输出
- 看模块算法流程图,搞懂数据流向
- 再看高级语言表达的算法代码,如python
- 利用verdi查看电路模块图(类似于简单的综合图),了解子模块与相互连接
- 看主要子模块(某些模块是debug模块,一般不执行),画出主要模块之间的数据流向简图
- 看每个模块IO口,明白需要处理哪些数据,处理后输出的结果是什么
- 如果有状态机,看懂状态机的动作,必要时画出状态转移图配合理解
- 看assign和always,这才是真正执行功能的部分,配合注释理解,always块只看下面一半模块(上面一半一般是复位,不用看),先看赋值然后最后再看if中的条件
- 用verdi追踪重要信号的上游来源信号,和下游被驱动的目的信号,理解相互关系
- 拉出波形看,因为verilog是并行的,所以多了一个时间维度,很多时候只有几条波形并行变化的时候才能看懂
- 对着代码敲一遍,能够理解代码每一行的细节
注意:
- 步骤1-4可以多询问大佬,多网上搜索,因为大部分都是通用知识
- 步骤5-8只能多询问对应设计人员,这部分涉及模块具体的功能,在网上基本只能找到类似的参考问题
- 步骤9-12只能自己多琢磨,琢磨不透的再询问,因为RTL代码很容易理解,RTL的细节问题太多容易导致被问的人烦躁,通常不理解设计逻辑的时候再询问
避免:
- 避免一上来就看代码,RTL代码描述层次很低,一个简单的功能写十几行,很多都是没必要的重复,直接看几百上千行代码很容易看懂后面的就忘了前面的,很容易只见树木不见泰山
- 避免没搞懂顶层或整个模块的具体功能就向他人询问某处RTL代码细节,因为此时会出现自己无法提出清晰的问题,即使对方给出解答自己也难以理解,自顶向下理解很重要,上层还没理解就去理解下层容易淹没在一堆细节问题之中
以上,个人经验,欢迎讨论