如何更好的解决RTL编译时依赖关系问题

本文

主要介绍一种有效解决RTL编译时依赖关系问题的方法。

版本 说明
0.1 初版发布
0.2 修正对-y的理解,-y只是指定库文件目录
0.3 使用-y对覆盖率收集的影响

关于include

一般在文件中会用include来加载依赖的文件,其效果就好比将依赖文件的内容复制粘贴至此。当然你可以将所有依赖文件都进行include,也就是不仅仅是宏定义文件和函数文件,还包含子模块的文件,这样层层include,自然形成一个完整的编译顺序,而只需要给工具指定最顶层的文件和提供include路径即可。但是并不建议这样实现,因为除了影响代码整洁性(可能某模块子模块众多),还会使代码难以维护。所以我们一般只include宏定义文件和函数文件,这样指定的include路径也会很清楚。

有时候一个文件可能会被多个文件include,为了防止被重复编译,往往会加上ifdef判断条件。虽然重复编译不一定带来问题,但毕竟也影响了编译效率,所以还是要尽量消除重复编译。方法如下:

1
2
3
4
5
6
7
8
`ifndef __file_name
`define __file_name

//.......
//File content......
//.......

`endif

在文件的开头和结尾添加如上内容后,当第一次编译该文件时,不会有“__file_name”的宏定义,所以编译文件内容,当再次编译该文件时,已经定义“__file_name”,ifndef的判断会使该文件不被重复编译。这样的方法是被推荐的,建议所有文件的头尾都添加如上内容。

关于filelist

一般工程中都会用filelist文件来进行维护,这也是最方便的。filelist文件描述的顺序,就是编译顺序,所以这里要小心,要将最底层模块定义到前列,优先编译,否则编译其他模块时找不到其依赖模块,会报编译错误。这里提供两个技巧:

  • 较大设计中,分割子模块,定义各个子模块的的filelist,在上层filelist中采用“-f path/xxx_subfilelist”的形式引入子模块filelist(注意要指明路径),这样由子模块的设计师维护子模块的filelist,待合并系统时,再合并filelist。
  • 可以使用“-y”指定库文件目录,其原理是在源文件中找不到子文件时会去库文件目录查找,所以不必关心编译顺序(注意,要求库文件中的module名与文件名一致)。使用方法为:
    • “+libext+.v+.sv”(指明加载后缀为.v和.sv的文件)
    • “-y file_path”(指定库文件目录)
  • “-y” 的使用其实是指定库文件,为了不将设计扁平化,需要在verdi打开时添加“-ssy”,这样可以保持设计的层次化。
  • include路径必须添加在filelist前部。

示例:

+define+VCS_DUMPON=1

+incdir+$PROJ_ENV/include_dir1
+incdir+$PROJ_ENV/include_dir2

$PROJ_ENV/test_top_tb.v

+libext+.v
+libext+.sv

-v $PROJ_ENV/lib_path/lib1.v
-v $PROJ_ENV/lib_path/lib2.v
-y $PROJ_ENV/design_sub_dir1
-y $PROJ_ENV/design_sub_dir2
-y $PROJ_ENV/design_sub_dir3
-y $PROJ_ENV/design_top_dir

$PROJ_ENV/other_design_path/top_design1.v
$PROJ_ENV/other_design_path/other_design2.v
.............

说明如下:

  • -f代表读取flist文件。
  • -y指定文件目录的导入方式,无需关心具体模块的依赖关系。
  • +incdir+是指定include文件的路径。
  • “+libext+.v”是指定文件后缀,若文件为sv格式,则指定为sv。
  • “+define+”是传入define参数。

总结

对于编写flist的几个建议

  • 使用“+incdir+”详尽的列出include path
  • 使用“-y”指明详尽的库文件目录
  • 指明加载的顶层文件,由于指明了库文件目录和include path,工具会自动按需加载。
  • 目录要使用参数,方便移植。

补充问题

使用-y对覆盖率收集的影响

经过实践,使用-y指定库路径的方式,避免了罗列详细的filelist,虽然与详细的filelist相比,编译仿真实现一致,但是对于覆盖率收集时,却无法实现由-y加载模块的代码覆盖率收集(cadence imc工具)。

所以,最终还是选择项目初期使用-y来加载子模块,避免设计人员添加或删除设计文件,导致验证环境需要对filelist不断更新,如果能够直接引用设计的filelist也可以,但是往往设计的filelist是对整个top去维护的,不方便UT验证环境直接引用,所以我还是习惯自己维护一个filelist。待设计成熟后,不会有模块文件的添加和删减,可以更新为详细的filelist,同时展开回归测试和收集覆盖率工作。


文章原创,可能存在部分错误,欢迎指正,联系邮箱 cao_arvin@163.com。