vcs编译解决 module名重复的冲突问题
我们在编译RTL的时候往往会遇到这样的问题:在g0这个模块里面存在文件add.v,实现一个加法器add供g0模块使用,在g1这个模块里面也存在文件add.v,也有个加法器add供g1模块使用。如果我们直接将g0和g1的设计文件加到filelist里面编译,必然会报编译错误:重复定义。解决办法有:1.创建共用的add模块,g0和g1均采用该模块,通过参数配置来达到不...
我们在编译RTL的时候往往会遇到这样的问题:在g0这个模块里面存在文件add.v,实现一个加法器add供g0模块使用,在g1这个模块里面也存在文件add.v,也有个加法器add供g1模块使用。
如果我们直接将g0和g1的设计文件加到filelist里面编译,必然会报编译错误:重复定义。
解决办法有:
1.创建共用的add模块,g0和g1均采用该模块,通过参数配置来达到不同的效果。
2.简单粗暴的修改add模块名,如g0_add和g1_add。
如果类似情况比较多,而且重名的模块是IP厂家提供的,比如CPU IP和GPUIP,那么方法1就行不通了。
方法2仍然可用,大不了写个脚本解决,一键搞定。但是维护性就不太好了,IP版本更新了,新项目要继承,工艺改变,多IP使用,那么都需要来一遍。
看起来以上方法都不是最优解,那么有没有比较好的方式呢?
编译g0的时候我就只看g0下面add,g1的时候只看g1的add。也就是各自采用各自的库,这就需要libmap来实现。
Libmap实际是Verilog的特性,各家EDA工具均支持这个特性,由于猴哥目前主要使用VCS为主,今天讨论是使用VCS的时候怎么来使用libmap特性。
VCS常用两步法和三步法,两步法即vcs命令编译+elaboration生成可执行simv文件,然后simv执行仿真。
三步法是将编译vlogan和elaboration分开实现,成为2步,elaboration是从库文件中获取例化的模块进行例化链接,然后生成simv文件,第3步就是仿真了。
首先是说明两步法libmap的使用方法,这个比较简单。
Vcs的编译默认情况下是将编译结果放到work这个库里,这是默认的库名。编译器会使用的synopsys_sim.setup来指定库名。
WORK > DEFAULT
DEFAULT : ./work
所以不使用libmap的时候编译生成的库就是work,所有的都放在这里,也就是导致重复定义错误的原因。
那么libmap目的就是将库分开,指定不同模块编译放到不同库中,elaboration的时候也指定库名,从中获取模块的内容。
1.定义一个libmap文件:
该文件告诉编译器,将g0目录下的.v文件编译后放入lib_g0中,将g1目录下的.v文件编译后放入lib_g1中。
Top下面的模块g0使用的是lib_g0这个库,模块g1使用的是lib_g1这个库。
Liblist后面可以是多个lib名字,elaboration的时候会从指定的库里面获取需要的内容而不是从默认work库中获取。
对于没有指定library的其它文件,其编译结果放入到work库中。
2.编译命令中加入libmap文件:
这样vcs编译器会使用libmap文件中的指向来存放编译输出结果,生成额外的lib_g0库和lib_g1库。编译器也通过它获得top中模块例化的信息。
通过这两个步骤就实现了两步法的libmap使用,解决了重复文件名的问题。
接着,对于三步法,使用libmap就比较复杂一些了:
三步法的使用是为了节省编译时间,将RTL单独编译,testbench单独编译,最后再一起elaboration。
不过实际上elaboration占用的时间比较多,并不能节省太多时间。
如果环境是UVM的,还需要单独先对UVM的package做一次独立编译。
三步法使用libmap特性需要如下步骤:
1.编写synopsys_sim.setup文件
2.用libmap生成库
vlogan –libmap libmap -f filelist.f
此处的libmap文件只包含库信息
3.编写config信息文件lib_cfg.v
4.顶层编译
vlogan +v2k lib_cfg.v top.v
5.elaboration
vcs libcfg –l elab.log
最后输出执行文件simv.exe
可以看到,使用三步法的时候,编译需要用synopsys_sim.setup来声明库文件,否则在elaboration的时候看不到LIB_G0和LIB_G1。
三步法使用libmap步骤比较多,工具存在的问题还是比较多的,特别对复杂的芯片设计来说。并不是太推荐这种方法使用。
以上就是vcs两步三步法使用libmap的说明,irun来做libmap的情况欢迎大家来补充!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)