我们在编译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的情况欢迎大家来补充!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐