使用libmap

1 libmap的作用

主要两个作用:

  1. 解决module名重复问题:

比如有两个IP, IP0和IP1, 它们都例化了一个叫ADD的module, 而且它们的filelist中都包含add.v.
这时会引起编译错误, 这时可以:
(1) 指定IP0中的add.v编译到库lib0中, IP1中的add.v编译到库lib1中,
(2) 指定IP0中的ADD使用库lib0, IP1中的ADD使用库lib1.

  1. 将指定模块做成空module, 用来加速仿真.

比如module M0例化了4次, U0~U3, 如果只仿真U0, 则可以:
(1) 做一个空module M0_DUMMY, 只保留端口信号.
(2) M0_DUMMY编译到DUMMY库中.
(3) 指定U1~U3使用DUMMY库.

其实通过修改设计的方式, 也可以完成上述两个功能, 但修改设计不易维护, 或者有时无法修改原设计, 所以必须要用到libmap方法.

2 如何使用libmap

使用libmap有两种方法: 两步法, 三步法.

两步法: 1) 编译(在编译阶段指定libmap), 2) 仿真.
三步法: 1) RTL编译/tb编译, 2) elaboration, 3) 仿真.

三步法有点麻烦.

2.1 两步法

2.1.1 编写dummy.v

将a.v和b.sv复制一份, 并删去其中的内容, 只保留port声明, 文件命名为a_dummy.v和b_dummy.sv

2.1.2 编写libmap文件

libmap文件有两部分内容: 1) 指定哪些文件编译到DUMMY库中. 2) 指定哪些inst使用DUMMY库(这部分可以放到单独的topcfg.v文件中).

libmap.v

//指定哪些文件编译到DUMMY库中. DUMMY是个字符, 可以随便改成其它名字.
library DUMMY xx/xx/a_dummy.v
library DUMMY xx/xx/b_dummy.sv

//指定哪些inst使用DUMMY库
config lib_cfg;
    design top; //指定仿真顶层名称, 详细见2.1.5 注意1.

    instance top.U_A1 liblist DUMMY; //U_A1使用DUMMY库
    instance top.U_B1 liblist DUMMY; //U_B1使用DUMMY库

    //instance top.U_A0 liblist work; //U_A0使用work库, 默认的, 可以不设置
    //instance top.U_B0 liblist work; //U_B0使用work库, 默认的, 可以不设置

endconfig

2.1.3 编译

在编译时有三点:
(1) 指定dummy.v.
(2) 指定libmap文件.
(3) 指定top为config指定的名称lib_cfg(可以随便改成其它名字)

vcs \
    -f file.lst       \ # 原本的设计
    -f file_dummy.lst \ # dummy.v
    -libmap libmap.v  \ # libmap文件
    -top lib_cfg      \ # 如果不指定lib_cfg为top, 会导致libmap有问题, 详细见2.1.5 注意2.
    ...

2.1.4 仿真

正常调用simv仿真即可. 这时top.U_A1和top.U_B1就会使用空module了.

2.1.5 注意事项

注意1: libmap config中design语句
在libmap config的design语句中, design必须要指定仿真的顶层名称, 这样libmap才会正确生效.
如果指定中间层次, 会导致libmap不成功.

注意2: 关于仿真选项-top的问题:
假设仿真的顶层名称是top_tb, libmap的名称是lib_cfg, 同时config中design的名称是top_tb, 这时:
(1) 如果同时指定两个top: -top top_tb -top lib_cfg, 会导致comiple报错: "duplicate top level module is found Module top_tb".
(2) 如果只定义一个-top top_tb, 不定义-top lib_cfg, 会导致libmap异常: 所有DUMMY library都生效了, 无法通过instance xx/U_A liblist DUMMY精细指定.
(3) 如果只定义一个-top lib_cfg, 不定义top_tb, 这时是正常的, DUMMY library符合预期.
(4) 如果两个top都不指定: vcs会将每个module都视为top, 而lib_cfg也不生效(其实也相当于没指定-top lib_cfg), 结果与第(2)点相同: 无法精细指定.

2.2 三步法

posted @ 2021-11-19 15:33  编程驴子  阅读(1449)  评论(0编辑  收藏  举报