VCS使用Makefile教程

article/2025/9/12 15:43:12

在从事IC验证工作的过程中,其实最开始的一步不是写什么test plan或者说verification of structure,而是应该知道makefile怎么写,先写出一个通用,基础的编译仿真脚本,可能会让你编译仿真轻松一点。
这份Makefile使用教程仅是基础版,不涉及复杂编译环境

一、VCS编译的四个步骤

预处理—>编译—>汇编—>链接
在这里插入图片描述
1、预处理(Pre-processing):
先将Verilog/SystemVerilog文件转化为C文件
2、编译:
生成目标文件
3、链接:
生成可执行文件

二、程序的编译和链接

要得到最后可执行的程序,首先要把源文件编译成中间代码文件,在Windows 下也就是 .obj 文件,UNIX\Linux 下是 .o 文件,即Object File,编译(compile)。再把大量的Object File 合成执行文件,链接(link)。

编译时,编译器需要的是语法正确,函数与变量的声明正确。对于后者,通常是你需要告诉编译器头文件的所在位置,只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O 文件或是OBJ 文件)。

链接时,主要是链接函数和全局变量。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File)。

在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,通常要给中间目标文件打个包,在Windows 下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。

三、Makefile 是什么

GNU make是一个命令工具,是一个用来控制软件构建过程的自动化管理工具。Make工具通过称为Makefile的文件来完成并自动维护编译工作,由Richard Stallman 与Roland McGrath设计开发 。

Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信 息,在make时会决定在链接的时候需要重新编译哪些文件。

make命令格式:make [-f Makefile] [option] [target]

在terminal中可以敲入以下命令:
#make target #make #make clean (伪目标)

Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

makefile带来的好处就是—“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

四、Makefile的使用

4.1 Makefile的文件名
默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。

当然,你可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“–file”参数,如:make -f Make.Linux或make --file Make.AIX。

4.2 Makefile里有什么
Makefile里主要包含了五个东西:显式规则、隐含规则、变量定义、
文件指示和注释。
1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由
Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
如: foo.o : foo.c defs.h 依赖关系
gcc -o foo.o foo.c 生成目标的方法(方式)

2、隐含规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让
我们比较粗糙地简略地书写Makefile,这是由make所支持的。
如: foo.o : foo.c (.o文件自己推导出同名的依赖文件.c.)

3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
如:H: =foo.c gcc -o foo.o $(H) (赋值可以用: =也可以直接用 =)

4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。

5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++,Java中的“//”一样。

在Makefile中的命令,必须要以[Tab]键开始。

4.3 定义变量和引用变量

变量的定义和应用与Linux环境变量一样,变量名要大写,变量一旦定义后,就可以通过将变量名用圆括号括起来,并在前面加上“$”符号来进行引用。

变量的主要作用:
1、保存文件名列表
2、保存可执行命令名,如编译器
3、保存编译器的参数

变量一般都在makefile的头部定义。按照惯例,所有的makefile变量都应该是大写。

4.4 Makefile的规则
target … : dependencies …
command

target也就是一个目标文件,可以是Object File,也可以是执行文
。还可以是一个标签(Label)
dependencies就是依赖文件,要生成那个target所需要的文件或是目标
command也就是make需要执行的命令。(任意的Shell命令,可以有若干行)

Command必须以Tab键开头。否则,make就会显示出错信息。如果某一命令行太长可以分作两行,用反斜杠(\)连接。也可以跟目标和依赖文件在一行,不过要以 ; 隔开。

在makefile执行时,make 带有参数“-n”或”-just-print”,那么其就只会显示命令,不执行命令。这个功能有利于我们调试Makefile,看看我们书写的命令执行起来是什么样子的或是什么顺序的。

4.5 伪目标

目标“.PHONY”的所有的依赖被作为伪目标。伪目标时这样一个目标:当使用make命令行指定此目标时,这个目标所在规则定义的命令、无论目标文件是否存在都会被无条件执行。

五、Makefile仿真

VCS对verilog模型进行仿真包括两个步骤:

  1. 编译verilog文件成为一个可执行的二进制文件

  2. 运行该可执行文件:./simv

以下是其他博主做的vcs命令的整理,在这里就不再赘述了,有需要请自行查看
vcs编译命令
vcs仿真命令

5.1 Makefile example
在每一行前面需要加上tab,而不是空格,不用tab会报错

.PHONY : comp sim clean 
//当使用make命令行指定此目标时,这个目标所在规则定义的命令、无论目标文件是否存在都会被无条件执行。
PROJECT = xxx
UVM_VERBOSITY = UVM_LOW
DEBUG = -debug/-debug_all/-debug_pp (在这里可以对debug的命令进行选择)
-debug    —— (对应TB中的$vcdpluson加载波形函数)使能DVE、VERDI波形调试和UCLI命令行调试等;
-debug_all  —— 使能所有的debug调试功能;
-debug_pp  —— 同-debug_all,但是更加节约资源;
CM_PATH = XXX 指定覆盖率文件放置的路径comp : 
(tab) vcs \
(tab) -ucli \ 使能UCLI命令
(tab) -lca \ vcs参数,表示使用vcs“用户限制使用”功能,即vcs提供的一些功能,但该功能还未经过充分验证。
(tab) -kdb \ Knowledge Database (KDB),生成kdb.elab++,位于simv.daidir目录下
(tab) -sverilog \  编译支持SystemVerilog语法;
(tab) +v2k \ 编译支持Verilog—2001语法;
(tab) -timescale=time_unit/time_precision \ 添加仿真时间单位、精度;
(tab) $(DEBUG) \
(tab) -ntb_opts uvm \ —— 常用参数uvm,这里表示加载uvm库文件
(tab) -f filename  \   —— 指定源文件的路径名列表
(tab) -cm line|cond|fsm|tgl|branch|assert —— 覆盖率收集,常用命令 -cm line+cond+fsm+tgl
(tab) -cm_dir $(CM_PATH) \  —— 指定覆盖率文件放置的路径
(tab) +vcs+lic+wait \—— 当所有的license都不可用时,等待vcs的license
(tab) -full64 \ 以64位模式编译设计并创建64位可执行文件用于64位模式下的模拟,如果不加上这个option,在仿真时,当出现内存超过4GB时,仿真会停止,但出现内存超过4GB可能是正常现象。
(tab) -o $(PROJECT)   \  ——指定编译后产生的文件名,默认编译后的文件名为simv,在这为PROJECT指定的名字
(tab) -l compile.log \ 生成编译的日志sim : 
(tab)./simv \
(tab)+fsdb+autoflush \  # 命令行参数autoflush,一边仿真一边dump波形,如果没有该参数,那么不会dump波形,需要在ucli命令run 100ns后键入fsdbDumpflush才会dump波形
(tab)-l sim.logclean	:rm -rf *.log simv *.daidir csrc *.key DVEfiles *.vpd 

http://chatgpt.dhexx.cn/article/ZC7WFQLy.shtml

相关文章

Makefile教程(Makefile的结构)

文章目录 前言一、Makefile的结构二、深入案例三、Makefile中的一些技巧总结 前言 一、Makefile的结构 Makefile 通常由一系列规则组成,每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。 下面是 Makefile 规则的基本结构&…

linux初试gcc makefile菜鸟教程

linux初试gcc makefile菜鸟教程 1.实验环境 1.ubuntu16(安装教程) 2.gcc (gcc安装:apt install gcc) 3.make (make安装 apt install make) 用C举个小例子 2.源码 main.c /*************************************************************************> File N…

Makefile使用教程

目录 一、前言 二、VCS的常用命令参数 2.1. 一步法 2.2. 两步法 2.3. 三步法 三、常见错误 四、参考资料 一、前言 以Makefile启动VCS为例来讲解如何使用命令参数,VCS编译文件会引入过多参数,试想如果我们每次都需要终端中敲击过多参数才能运行一…

Makefile详细教程

Makefile详细教程 我编写本指南是因为我永远无法完全理解 Makefile。 他们似乎充斥着隐藏的规则和深奥的符号,提出简单的问题并没有得到简单的答案。 为了解决这个问题,我花了几个周末的时间坐下来阅读所有关于 Makefile 的内容。 我已将最关键的知识浓…

最实用的Makefile教程 真的很简单(搞不明白网上的教程写那么复杂干嘛)

前言 其实我的要求不高,我就是想要写个Makefile,把我那些需要反复编译的文件处理一下就可以了,所以我当时就拼命地在网上找关于Makefile的教程,结果看到的教程都是啰里啰嗦一大堆,看得我云里雾里。 大家要知道&#…

Makefile的入门完整教程(包学包会)

Makefile的完整入门教程(实现不了来打我TAT) 看完能够了解Makefile是什么;我们能用makefile做什么;makefile的简易使用 1、什么是Makefile Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和…

Linux makefile 教程 非常详细,且易懂

最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。 于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。 后记,看完发现这篇文章和《Linux环境下的C…

Makefile基础教程

前期准备 在真正使用Makefile之前,我们首先先写四个c文件和相应的h文件,分别是fun0.c,fun1.c,fun2.c,fun0.h,fun1.h,fun2.h以及main.c //fun0.c #include "fun0.h" void print0(){printf("hello world 0"); }//fun0.h #include &l…

Makefile教程(掌握这里足够)

众所周知,在Linux环境下进行项目开发那就少了使用make来构建和管理自己的工程。如果想要更加深入的学习,我在这里推荐一本书 https://www.jianguoyun.com/p/DZWKrLIQjKL5Bxi0z5UD 访问密码:KvhT2v 1. makefile的命名 默认的情况下&#xff…

Makefile 编写教程(由简至难)

目录 一、测试代码二、.c 文件与Makefile同级三、.c文件与Makefile不同级四、链接静态库 一、测试代码 本文以将main.c add.c common.h三个文件编译成一个可执行文件为例,来讲解Makefile的编写。以下是每个文件的代码(很简单,测试用&#xf…

好看的vscode字体

vscode下载上面出现的字体(自行百度搜索) (Cascadia Code, 等线)(等线是中文, Cascadia Code是英文, 自认为比较cool的搭配, 也可以自行选择)然后放到C:\Windows\Fonts 会自动安装就完事了~ 欢迎大家关注我的公众号:<前端成长指南> 我会把我的原创作品陆续放在上面

Unity3D中字体样式

字体样式分为三种 系统默认字体 自定义字体&#xff08;包括全部字体&#xff09; 自定义字体&#xff08;不包括全部字体&#xff09;系统默认字体描述优点内存占用小缺点没有艺术效果&#xff0c;没有灵魂 自定义字体&#xff08;包括全部字体&#xff09;描述优点具有一定…

前端HTML字体和文本样式

前端HTML字体和文本样式 文章目录 前端HTML字体和文本样式1.字体样式1.1字体大小1.2 字体粗细1.3 字体样式&#xff08;是否倾斜&#xff09;1.4字体类型1.5 样式层叠问题1.6 字体复合属性 2.文本样式2.1 文本缩进2.2 文本水平对齐方式2.3文本修饰 3.行高 属性表示注意点font-s…

layui表头样式_Layui表格好看样式

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Layui表格好看样式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a;web 作者&#xff1a;xq 撰写时间&#xff1a;2019.7.27 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

android+字体样式包,android 改变全局字体样式(第三方字体包)

android 改变全局字体样式 参考&#xff1a;http://stackoverflow.com/questions/2711858/is-it-possible-to-set-font-for-entire-application/16883281#16883281 1.将要替换的字体包放到assets下 2.具体代码&#xff1a; //设置新的字体样式 public static void setDefaultFo…

IDEA 修改字体样式

每次发现别人的IDEA字体都是这么好看&#xff0c; 今天这里推荐一款设置方法美化我们IDEA的代码&#xff0c; 代码变漂亮了&#xff0c;写代码也更带劲&#xff01;注意哦这针对的都是windows系统哦&#xff0c;mac系统就不用了&#xff0c;已经很完美了 第一步&#xff1a;下载…

7.20 Web前端-字体样式

今天为大家介绍一下关于字体的相关知识&#xff0c;这里的知识比较简单&#xff0c;因为之前的教学中我们已经接触到了一部分关于字体的知识&#xff0c;在这里我来汇总说一下。 1.长度单位&#xff1a; 长度单位就是你的字体在网页中占用的长度是多少&#xff0c;在web中不是…

9款漂亮的纯css字体样式

样式&#xff1a; 代码&#xff1a; <html> <head> </head> <style>body{text-align: center;}.hcqFont{position:relative;letter-spacing:.07em;font-size:3em;font-weight:normal;margin:0 auto}.hcqFont:before,.hcqFont:after{position:absolut…

7款漂亮的纯css字体样式

简单粗暴&#xff0c;直接上马&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><h1 class"vintage1">美丽的中国语</h1><h1 class"vi…

纯Css比较好看的中英文字体样式(持续整理版)

刚好公司要用到&#xff0c;需要纯css的&#xff0c;不用任何插件就可以显示很不错的字体 样式一&#xff1a; <style type"text/css"> .tb-js-yf-style{font-family: "Arial","Microsoft YaHei","黑体","宋体",san…