vcs -libmap

news2024/11/23 7:47:28

1 libmap的作用
主要两个作用:

解决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.

将指定模块做成空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)点相同: 无法精细指定.

另一篇讲解
解决办法有:

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使用,解决了重复文件名的问题。

2.2 三步法

接着,对于三步法,使用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步骤比较多,工具存在的问题还是比较多的,特别对复杂的芯片设计来说。并不是太推荐这种方法使用。

参考文章
http://t.csdn.cn/nSvf3
https://www.cnblogs.com/gaiqingfeng/p/15577602.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超细Redis(二)

五大数据类型 官方文档: 翻译: Redis 是一个开源(BSD 许可)内存数据结构存储系统,用作数据库、缓存、消息代理和流引擎。Redis 提供数据结构,例如字符串、哈希、列表、集、带有范围查询的排序集、位图、超…

MySQL: 运算符使用练习

前言: 练习运算符的使用,加强记忆。 案例目的: 在已建数据库中创建数据表,并对表中数据进行处理,练习运算符(包括数据运算符、逻辑运算符、位运算符)的使用。 操作过程: 创建名…

java基础入门-03-【字符串】

Java基础入门-03-【字符串】 10、字符串10.1.API10.1.1API概述10.1.2如何使用API帮助文档 10.2.String类10.2.1 String类概述10.2.2 String类的特点10.2.3 String类的构造方法10.2.4 创建字符串对象两种方式的区别10.2.5 字符串的比较10.2.5.1 号的作用10.2.5.2 equals方法的作…

清华发布首个最全大模型安全评测系统,ChatGPT登榜首!

夕小瑶科技说 原创作者 | 天于刀刀 Python当前大型语言模型的火爆程度我们不用再进行赘述了,伴随着百度文心一言打响国内商业大模型第一枪,华为盘古,阿里通义千问,智谱ChatGLM,科大讯飞星火等国内公司纷纷开始布局。 另一方面由于…

01-Flink Metrics简介

Flink Metrics简介 Flink Metrics是Flink集群运行中的各项指标,包含机器系统指标,比如:CPU、内存、线程、JVM、网络、IO、GC以及任务运行组件(JM、TM、slot、作业、算子)等相关指标。 Flink Metrics包含两大作用&…

阿里云服务器购买教程(新手入门指南)

阿里云服务器ECS选购指南,阿里云百科分享2023阿里云服务器新手选择流程,选购云服务器有两个入口,一个是选择活动机,只需要选择云服务器地域、系统、带宽即可;另一个是在云服务器页面,自定义选择云服务器配置…

探究C语言数组的奥秘:大小可省略的定义、内存存储、数组名、传参、指针遍历、数组指针和指针数组、柔性数组等

也许你认为,C语言中的数组非常好理解,就是把一组相同类型的元素存储在同一块空间里。但是你可能并没有真正理解数组的本质,不信的话请回答一下下面的几个小问题,如果你能非常清晰的回答这些问题,那么你对C语言中的数组…

【Git】制造冲突以及解决冲突的详细方法

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

CentOS安装Redis数据库流程by阿里云服务器

使用阿里云服务器ECS安装Redis数据库流程,操作系统为CentOS 7.6镜像,在CentOS上安装Redis 4.0.14,云服务器选择的是持久内存型re6p实例,新手站长分享阿里云CentOS服务器安装Redis流程方法: 目录 在CentOS系统中部署R…

2023-05-04 线性DP_力扣练习

线性DP的力扣题目练习 这一章将会介绍线性动态规划的相关概念和经典问题,并给出一些练习题供大家演练。 用动态规划解决问题的过程有以下几个关键点:状态定义,状态的转移,初始化和边界条件。 状态定义 就是定义子问题&#xff…

【IM苹果推iMessage】苹果真机推送自动分配任务,自动分配任务,让您瞄准中高端客户

推荐内容IMESSGAE相关 作者✈️IMEAE推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容3.日历推 *** …

代码命名规范的套路是真优雅呀,命名如歌,代码如诗

日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢? Java项目的代码结构,能够体现它的设计理念。Java采用长命名的方式来规范类的命名,能够自己表达…

ansible常用命令

目录 1、列出默认清单文件中的所有受管主机 2. 列出自定义清单文件中的所有受管主机(自定义清单文件:inventory) 3、运行playbook 4、创建需要输入文件密码的加密的文件 5、创建用密码文件的加密的文件 6、查看加密的文件内容 7、向已有…

学会使用Git,看这一篇文章就够了

文章目录 一、背景二、Git的安装2.1 Windows下安装Git:下载安装包安装Git配置Git 2.2 Linux下安装Git:更新系统安装Git配置Git 三、Git 基本使用3.1 初始化 Git 仓库3.2添加文件3.3 提交代码3.4 查看历史记录3.5创建分支3.6 修改文件3.7 查看文件状态3.8…

【实用工具】JSR-269 插入式注解处理器AbstractProcessor

JSR-269原理浅析 初次使用lombok时,都需要在idea安装lombok插件,这让我们怀疑lombok的实现是通过提供自己的编译器实现的,然而实际情况并非如此,在脱离idea使用javac编译时,只要类路径有lombok的jar包,项目…

Android-源码分析-分析手机热点里的AP Band(频段)被隐藏/置灰的原因?

本博文记录寻找手机热点中AP Band(频段)被隐藏/置灰的原因,相似问题同理去查找解决。 先放上一张MTK平台手机-热点-AP Band界面效果图: 很明显,界面中的AP Band选项变灰,无法点击编辑修改内容,如果是AP Band 被隐藏或…

C#,生信软件实践(01)——DNA序列数据库FASTA文件合并工具的源代码

1 生物信息学简介 生物信息学(BioInformatics)是研究生物信息的采集、处理、存储、传播,分析和解释等各方面的学科,也是随着生命科学和计算机科学的迅猛发展,生命科学和计算机科学相结合形成的一门新学科。它通过综合…

JavaWeb ( 四 ) JavaEE

2.JavaEE 2.1.Java版本 J2SE : 适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Edition,J2SE) J2EE : 适用于创建服务器应用程序和服务的Java 2平台企业版(Java 2 Platform Enterprise Edition,J2EE&a…

学企业管理

工业社会的代表产品是交通运输设备,如火车/高铁、汽车、飞机/火箭、船舶/航母,其核心是发动机。信息社会的代表产品是计算设备,如大型机小型机、工作站/PC台式机电脑/PC笔记本电脑/PC平板电脑、智能手机。 汽车这个产品,既属于高精…

调试别人的API,一般有哪些步骤?

当我们使用了一些由别人实现的API接口时,该如何进行调试呢?当我们使用的API返回一些意想不到错误时,该怎么办呢?这个问题可能是由于用户输入或者API本身,或者其他完全无关的内容等引起的。调试是我们进行定位并修复由单个API调用…