Makefile中空变量的妙用
时间:10-02
整理:3721RD
点击:
分享一点验证中的小技巧, 原文
-----
做数字验证的时候, 仿真器的编译和运行需要很多的编译运行参数, 一般Makefile里面就会写了很多东西了. 不过, 大多数时候, 在验证平台的调试阶段, 你会需要添加很多额外的编译选项和运行选项比如编译时添加-debug_all编译为行调试模式, 运行时添加+ntb_opt random_seed=<n>指定随机种子运行. 另外, UVM也引入了很多的运行参数.
执行make的时候不能额外的追加参数, 比如make vcs_compile -debug_all的时候-debug_all是不能生效的. 这样一来, 你的Makefile会变的很复杂, target好多, 似乎用shell才是正解了.
不过, make的时候, Makefile的变量是可以重写的, 这是个转机. 我在Makefile里会设置一个空变量:
- ext =
然后再各个target里都添加进这个变量:
- vcs_compile:
- vcs ${VCS_CMP_OPT} ${ext} ...
- vcs_run:
- ./simv ${VCS_RUN_OPT} ${ext} ...
- ius_compile:
- irun ${IUS_CMP_OPT} ${ext} ...
- ius_run:
- irun ${IUS_RUN_OPT} ${ext} ...
- verdi_run:
- verdi ${VERDI_OPT} ${ext} ...
然后根据需要在make的时候重写ext变量, 比如make vcs_compile ext=-debug_all来编译为行调试模式, make vcs_run ext=-ucli进入ucli运行模式, 要添加多个选项的时候需要用引号(推荐用单引号, 双引号会转义, 这个跟shell的规则是一样的)比如make vcs_run ext='+UVM_VERBOSITY=UVM_LOW +UVM_PHASE_TRACE'添加多个UVM运行选项.
做个类比的话, Makefile里的其他变量相当于sequence item里面的一些通用约束块, 这个空变量相当于sequence中的inline constraint, 用起灵活了许多.
从你这个经验,可不可以发散一下?
变量使用 +=赋值,那么就不用额外提供一个ext变量了。我以前一般会留 :=去赋一个default值,如果临时想要变的时候直接在make的时候传一下。
是的, 其实原理是一样的, 就是利用变量重写这一点.
不过使用单独的空变量的好处在于, makefile中target有很多个而且使用的是不同的变量的时候, ext空变量是一个统一的传参数入口, 这样记忆开销更小.
一直是用这个改写makefile的变量,比如控制波形,覆盖率