synopsis VCS makefile编写

合集下载

c语言makefile编写规则(一)

c语言makefile编写规则(一)

c语言makefile编写规则(一)C语言Makefile编写规则1. Makefile介绍Makefile是一种文件,其中包含了一组规则(rules)用于编译和构建项目。

它的作用是告诉系统如何编译代码,生成可执行文件。

2. Makefile规则基本结构Makefile规则由以下几部分组成:目标(Target)目标是一个文件,可以是源代码文件、中间文件或最终生成的可执行文件。

依赖(Dependencies)依赖指的是生成目标所需要的文件或其他目标。

当某个依赖文件发生变化时,目标就需要重新生成。

命令(Commands)命令是指执行编译、链接等操作的具体命令。

当目标需要重新生成时,Makefile会执行相应的命令。

规则示例以下是一个简单的示例,展示了一个C语言源文件的编译过程:target: dependenciescommand其中, - target表示目标文件; - dependencies表示生成目标所需要的文件或其他目标; - command表示具体的编译命令。

例如,假设有一个名为`的C语言源文件,我们想要生成一个名为hello`的可执行文件。

那么对应的Makefile规则可以定义如下:hello:gcc -o hello3. Makefile变量Makefile中还可以定义变量,以提高代码的可读性和重用性。

变量可以存储命令、文件名、路径等信息。

变量定义变量的定义采用变量名 = 值的方式进行,例如:CC = gcc其中,CC是变量名,gcc是变量的值。

变量引用使用变量时,需要在变量名前加$符号进行引用。

例如,使用上述定义的CC变量可以这样写:$(CC) -o hello4. Makefile示例以下是一个完整的Makefile示例,展示了多个目标之间的依赖关系和命令定义:CC = gccall: hellohello:$(CC) -o hello:$(CC) -cclean:rm -f hello在上述示例中,共定义了3个目标:all、hello和。

MakeFile脚本的编写

MakeFile脚本的编写

MakeFile脚本的编写1.Eclipse Debug下默认会⽣成 .mk格式的makefile多⽂件2.下连接可以⽤⼀个⽂件来实现MakeFile功能。

转载⾸先进⾏的内容是参数设置部分,如下:设置项⽬名字,它决定了我们make之后,⽣成的⽂件名。

⽐如libXX.so或者XXX.a或者XXXX#set your project namePRJ_NAME=libXXX.so设置项⽬的类型,是共享库、可执⾏程序还是静态库#set your project type : choose one belowPRJ_TYPE =g++ -shared#PRJ_TYPE = g++#PRJ_TYPE = ar -r设置编译的类型,是Debug还是Release#set Debug or ReleaseCompile_Flag = Debug#Compile_Flag = Release设置编译后的⽂件的输出路径,这个⽂件夹⼀定要有才可以,否则会出错的。

所以要事先建⽴好#set your output pathOutput:= bin这⾥是设置代码所在的⽂件夹#set your source folderSRC:=code如果引⽤了什么库,就在这⾥添加好了.#add the lib you used here#LIBS := -lLib1 -lLib2 -lLib3LIBS := -lpthread#LIBPATH := -Lpath1 -Lpath2 -Lpath3LIBPATH :=INCLUDEPATH :=# INCLUDEPATH := -I/usr/lib/XXX/include要设置的参数就这么多。

下⾯进⼊第⼆部分,makefile核⼼内容的解释。

下⾯我仔细讲⼀下。

#符号,表⽰注释。

makefile⾥⾯有它的那⾏,就不会起作⽤了。

⽐如下⾯两⾏就是注释。

####################################DON"T MODIFY THE BELOWS#combine output folderFinalOutput := $(Output)/$(Compile_Flag)/上⾯的代码,定义了⼀个变量,名字是FinalOutput,给它赋值,可以⽤=或者:=,等⼀下说区别。

sv中 makefile文件的写法

sv中 makefile文件的写法

很高兴接到您的指示,让我来帮助您撰写关于sv中makefile文件的文章。

让我们来深入了解一下makefile文件的概念和作用。

1. 什么是makefile文件?在SV(SystemVerilog)编程中,makefile文件是用来组织和管理编译工程中的各个源文件和依赖关系的文件。

它定义了编译规则和指令,用于自动化编译和构建整个项目。

2. makefile文件的基本结构在编写makefile文件时,通常会包含以下基本元素:- 变量定义:定义编译器、编译选项、源文件列表等变量。

- 规则定义:定义编译规则,包括目标文件、依赖文件和编译指令。

- 依赖关系:明确指出各个源文件之间的依赖关系,以便make工具能够正确地进行编译。

3. sv中makefile文件的写法在SV项目中,编写makefile文件需要特别关注以下几点:- 定义变量:可以通过定义变量来指定编译器、编译选项、原文件列表等信息,使得makefile文件更加灵活和可维护。

- 设置规则:需要设置好编译规则,包括目标文件、依赖文件和编译指令。

这些规则应该准确反映出SV项目的结构和依赖关系。

- 定义依赖:在makefile文件中,需要清晰地定义各个源文件之间的依赖关系,以确保make工具能够正确地进行增量编译,提高编译效率。

4. 个人观点和理解在我看来,编写高质量的makefile文件对于SV项目的管理和维护至关重要。

一个良好的makefile文件可以提高项目的编译效率,简化编译过程,并且便于团队协作和代码管理。

在编写makefile文件时,应该注重规范和细节,以确保项目的可维护性和稳定性。

总结回顾通过编写这篇文章,我深入了解了sv中makefile文件的写法,并且通过我的个人观点和理解对这个主题进行了探讨。

在文章中多次提及了主题文字,并采用了从简到繁、由浅入深的方式来探讨主题,以便您能更深入地理解。

希望这篇文章能够对您有所帮助。

以上是我为您准备的关于sv中makefile文件的文章,希望能够满足您的要求。

makefile的通用编写 -回复

makefile的通用编写 -回复

makefile的通用编写-回复Makefile是一种用于自动化构建和管理项目的工具,它使用一种被称为Makefile的文件来指定构建和管理项目的规则。

Makefile通常由一系列目标(target)、依赖关系(dependencies)和命令(commands)组成。

在本文中,我们将详细介绍Makefile的通用编写方法,从创建一个简单的Makefile文件开始,到使用变量、条件、循环和函数等高级特性,帮助读者更好地理解和使用Makefile。

让我们一步一步地回答您的问题,教您如何编写一个高效的Makefile。

第一步:创建一个简单的Makefile文件为了开始编写Makefile,我们首先需要在项目的根目录下创建一个名为Makefile的文本文件。

可以使用任何文本编辑器来创建并编辑这个文件。

在开始编写之前,我们需要了解一些基本的语法和规则。

Makefile文件由一系列规则组成,每个规则包含一个或多个目标、依赖关系和命令。

例如,我们可以创建一个简单的规则来构建一个名为hello的可执行文件:hello: main.ogcc -o hello main.omain.o: main.cgcc -c main.c在这个例子中,我们创建了一个名为hello的目标,它依赖于main.o 文件。

我们还创建了一个名为main.o的目标,它依赖于main.c文件。

每个目标都有相应的命令,用于构建目标所需的文件。

第二步:使用变量变量是Makefile中非常常用的机制,它可以帮助我们更好地管理和维护项目。

可以通过在Makefile文件中定义变量,然后在规则和命令中使用这些变量来简化代码。

例如,我们可以使用变量来代替文件名:CC = gccCFLAGS = -chello: main.o(CC) -o hello main.omain.o: main.c(CC) (CFLAGS) main.c在这个例子中,我们定义了两个变量CC和CFLAGS。

c语言makefile编写规则

c语言makefile编写规则

c语言makefile编写规则C语言Makefile编写规则什么是MakefileMakefile是一种用于管理和构建软件项目的文件,通常被用于编译和链接C语言程序。

Makefile中包含了一系列的规则和指令,用于告诉编译器如何编译程序中的各个部分,并最终生成可执行文件。

Makefile的基本结构Makefile的基本结构由多个规则组成,每个规则由一个目标(target)和一个或多个依赖(dependencies)组成。

目标指明了要生成的文件或要执行的操作,依赖指明了目标所依赖的文件或操作。

一个简单的Makefile规则的语法如下:target: dependenciescommand其中,target是生成的文件或要执行的操作,dependencies是目标所依赖的文件或操作,command是执行的命令。

每个规则的命令必须以一个tab键开始。

Makefile的应用场景Makefile广泛应用于C语言项目的构建中,它可以自动化执行编译、链接和清理等操作。

通过Makefile,我们可以方便地管理源代码文件、头文件和库文件之间的关系,从而提高项目的可维护性和可扩展性。

Makefile的编写规则1.目标和依赖应该使用合适的命名方式,能够清晰地表达其作用以及所依赖的内容。

避免使用中文、空格和特殊字符,使用下划线和英文字母进行命名。

2.命令行命令应该以tab键开始,而不是空格。

这是Makefile的语法要求,且使用tab键可以提高代码的可读性。

3.注意规则的顺序,确保前置依赖在目标之前。

Makefile会按照规则的声明顺序进行构建,如果前置依赖在目标之后,可能导致构建失败。

4.使用变量来定义重复使用的内容,如编译器选项、源文件列表等。

这样可以提高代码的可维护性,并方便进行后续的修改和维护。

5.使用通配符来表示一类文件,如使用*.c表示所有的C语言源文件,使用$(wildcard pattern)函数来获取符合某种模式的文件列表。

MakeFile编写规则

MakeFile编写规则

MakeFile编写规则什么是makefile (3)关于程序的编译和链接 (3)Makefile 介绍 (4)一、Makefile的规则 (4)二、一个示例 (4)三、make是如何工作的 (6)四、makefile中使用变量 (6)五、让make自动推导 (7)六、另类风格的makefile (8)七、清空目标文件的规则 (8)Makefile 总述 (9)一、Makefile里有什么 (9)二、Makefile的文件名 (9)三、引用其它的Makefile (9)四、环境变量MAKEFILES (10)五、make的工作方式 (10)实例说明 (11)一、简单例子 (11)二、规则的语法 (11)三、在规则中使用通配符 (12)四、文件搜寻 (12)五、伪目标 (13)六、多目标 (14)七、静态模式 (15)八、自动生成依赖性 (16)书写命令 (17)一、显示命令 (17)二、命令执行 (18)三、命令出错 (18)四、嵌套执行make (19)五、定义命令包 (20)使用变量 (21)一、变量的基础 (21)二、变量的赋值 (21)第一种方式 (22)第二种方式 (22)三、变量高级用法 (23)一种是变量值的替换 (23)第二种高级用法——“把变量的值再当成变量” (24)四、追加变量值 (25)五、override 指示符 (26)六、多行变量 (26)七、环境变量 (26)八、目标变量 (27)九、模式变量 (27)十、自动化变量 (28)使用条件判断 (30)makefile的编写规则--语法及函数 (31)条件表达式 (31)函数 (32)一、函数的调用语法 (32)二、字符串处理函数 (33)$(subst <from>,<to>,<text> ) (33)$(patsubst <pattern>,<replacement>,<text> ) (33)$(strip <string> ) (34)$(findstring <find>,<in> ) (34)$(filter <pattern...>,<text> ) (34)$(filter-out <pattern...>,<text> ) (34)$(sort <list> ) (35)$(word <n>,<text> ) (35)$(wordlist <s>,<e>,<text> ) (35)$(words <text> ) (35)$(firstword <text> ) (36)三、文件名操作函数 (36)$(dir <names...> ) . (36)$(notdir <names...> ) .. (36)$(suffix <names...> ) .. (37)$(basename <names...> ) .. (37)$(addsuffix <suffix>,<names...> ) (37)$(addprefix <prefix>,<names...> ) .. (37)其他函数 (37)$(join <list1>,<list2> ) (37)foreach 函数 (38)if 函数 (38)call函数 (38)origin函数 (39)shell函数 (40)控制make的函数 (40)$(error <text ...> ) . (40)$(warning <text ...> ) . (40)make 的运行 (41)一、make的退出码 (41)二、指定Makefile (41)三、指定目标 (41)四、检查规则 (42)什么是makefile什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但要作一个好的和professional的程序员,makefile还是要懂。

MAKEFILE的编写

MAKEFILE的编写

MAKEFILE的编写第一章Makefile简介什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

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

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

可见,makefile都成为了一种在工程方面的编译方法。

make命令执行时,需要一个Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明Makefile的书写规则。

以便给大家一个感兴认识。

这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。

我们的规则是:1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

使用Makefile+VCS+Verdi做个简单的TestBench

使用Makefile+VCS+Verdi做个简单的TestBench

使⽤Makefile+VCS+Verdi做个简单的TestBench使⽤Make?le、VCS、Verdi 做个简单的 Test Bench⽬录:1. 简介2. 需求3. 加法器模块4. 测试模块5. 测试脚本6. 编译项⽬7. 测试结果1. 简介Synopsys 的 VCS 和 Verdi 是做 IC 使⽤的很好的开发⼯具。

但新⼿往往是⽆法下⼿,⼊门⽐较困难。

在此,我根据⾃⼰的学习经历,写个最简单的使⽤教程。

教程中会⽤到 Make?le、VCS、Verdi,写个简单的 8 位加法器的 TB 例⼦。

所有代码都使⽤ verilog 编写,带简单的结果验证功能。

此教程没有使⽤到 UVM,以后有时间我在单独写个 UVM 的简单例⼦。

2. 需求我是在 VMware 下开发测试的,⽤到的软件列表如下:VMware? Workstation 12 Pro,12.5.7 build-5813279 CentOS-6.10-x86_64-bin-DVD1.isoscl_v2016.12_common.spfscl_v2016.12_linux64.spfSynopsysInstaller_v3.5.runuvm-1.1d.tar.gzVCS_vL-2016-SP2-12verdi_vL-2016.06-SP2-12Win7 下的许可证破解软件是:scl_keygen.rar3. 加法器模块8 位加法器 adder8.v 代码如下:module adder8(input clk,input[7:0]a_i,input[7:0]b_i,output reg[8:0]c_o);always @ (posedge clk)beginc_o <=a_i+b_i;endendmodule输⼊ a_i 和 b_i 都是 8 位的,输出 c_o 是 9 位的。

只是⽤做⽰例,不需要太纠结合理性了。

4. 测试模块测试模块 tb_adder8.v,代码如下:// TB_SEED 是随机种⼦`ifndef TB_SEED`define TB_SEED0`endifmodule tb_adder8();wire[8:0]result;reg[7:0]input_0;reg[7:0]input_1;reg clk;// clk2 是主 clk 的延迟,⽤于验证结果wire#5clk2;assign clk2=clk;initial begin$fsdbDumpfile("adder8.fsdb");$fsdbDumpvars();$display("TB_SEED is %d", `TB_SEED);clk=0;input_0=8'd0;input_1=8'd0;#10000$display("All test PASS!");$finish;end// 主时钟 50MHzalways begin#10clk=~clk;end// 产⽣随机输⼊always @ (negedge clk)begininput_0=$random()%256;input_1=$random()%256;end// 获取验证输出always @ (posedge clk2)beginif((input_0+input_1)!=result)begin$display("Test failed for %x + %x = %x", input_0, input_1, result);$finish;end else begin$display("%x + %x = %x", input_0, input_1, result);endend// 连接加法器模块adder8dut(.clk(clk),.a_i(input_0), .b_i(input_1), .c_o(result) );endmodule5. 测试脚本整个编译过程采⽤ Make?le 控制,Make?le ⽂件内容如下:VCS = vcs -sverilog -timescale=1ns/1ns +vpi -l build.log -debug_access+allSIMV = ./simv -l simv.logifndef TB_SEEDTB_SEED = 1024endifall: comp runcomp:$(VCS) +define+TB_SEED=$(TB_SEED) +incdir+. \adder8.v \tb_adder8.vrun:$(SIMV) +fsdbfile+top.fsdbdbg:verdi -f file.f -ssf top.fsdb &clean:rm -rf core csrc simv* vc_hdrs.h ucli.key urg* *.log *.fsdb novas.* verdiLogMake?le ⾥⾯的空格排版都是 TAB 键,否则会出错,修改的时候请注意⼀下这个细节。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

个流程大致步骤都相同都是:Compile,SIM(urg,覆盖#率的分析和采集),debug时主要是跑一个pattern,并dump VPD文件,SIM的同时可以打开DVE视图界面,结束后观察波形,regress主要用#于采集覆盖率,一般要跑多个pattern,这时就无需dump VPD文件(节约时间),由于是debug后有进行的重复运行,所以叫regress(回归)。

# 在我们的验证平台中,若不做代码覆盖率的功能,可以不写regress,只要写debug的流程和跑多个pattern的脚本就好了。

#---------------------------------------------------------------------------------------------------------------------# The DEBUG flow turns on VPD dumping and turns off coverage collection. After # building a testcase using the debug targets, you can debug the TB and the DUT# source code using the testbench debugger and DVE. Of course, you can turn on # coverage metrics and run in debug mode by changing compile and runtime options # in the makefile. These changes are independent of the regression flow so that# the regressions will still run optimally without the interference of VPD dumping.# debug流程打开VPD文件的dump并关闭覆盖率在build了一个包含DUT的testcase后,可以使用VCS的debugger和DVE进行debug。

当# 然,你也以通过改变makefile文件中的compile和runtime选项参数来开启覆盖率功能。

Debug流程和regress流程是各自独立的,regression# 流程一般不生成VPD。

#--------------------------------------------------------------------------------------------------------------------------------# The REGRESSION flow turns off VPD dumping and turns on Coverage Metrics and TB # coverage collection. This flow is intended to support verification engineers who# are working through the regression process and are interested in coverage# collection and urg.# REGRESSION流程关闭VPD dump并打开Coverage collection功能,该流程是为了支持验证引擎进行“流水线验证“(跑多个testcase)和# 代码覆盖率功能。

??在验证平台中可以将运行多个testcase的脚本命名为regress,运行单个testcase的脚本命名为regone??,这只是# synopsys的模版,我们不必完全遵守,可以不区分debug和regress,然后将是否打开波形和coverage设置成参数。

#-------------------------------------------------------------------------------------------------------------------------------# Command Line make命令行# -----------------# The Makefile supports the following command line# makefile支持下列命令行# % make target_name_* <SEED=xxx> <DEFINES=xxxx># makefile文件放在哪?放在仿真路径。

make [-f makefile文件名][选项][宏定义][目标]# -f 指定makefile 若没有则make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。

# Where target_name is the name of a testcase located in the testdirectory. Every# test in the test directory is named using test_{test_name}. All of the test targets# are listed in the TEST TARGETS section of the makefile.# target_name是test路径下的一个testcase的名字,test路径下的testcase的名字使用test_{test_name}来命名,例如test_1# 所有的test target 都在makefile文件中的TEST TARGETS部分列出#---------------------------------------------------------------------------------------------------------------------------# Compile and Run Testcases 编译与运行testcase# -------------------------------# To compile and run a tescase use the test_* and regress_test_* targets.# 编译与运行testcase,(test_1 就是执行了下面的两个命令先编译在运行)test_1==> compile_1 run_1 详见下面命令定义# % make test_1 // Builds and runs test 1 with VPD dumping 其实就是debug的前边的流程# % make regress_test_1// Builds and runs test 1 with coverage turned on# -------------------------------------------------------------------------------------------------------------------------# Debugging Testcases Debug 实在上面命令之后在进行的# ------------------------# You can use DVE and the testbench debugger to visualize waveforms and testbench # execution. You must first build the testbench using the make compile_* command.# dubug必须是在DVE(VCS的debug工具,与debussy一样的功能)下进行,因为要看波形嘛,但是debug之前必须先compile# % make compile_1 // Builds test 1 for debugging //需要重新编译一次吗?# Once you have built the environment with the proper debug switches, you can use DVE and the testbench debugger.# # testbench debugger 是否是指编译后的那个simv可执行文件呢?其实gui_1 和上面test_1中的run_1是一样的只是增加了-gui项# 即增加了打开gui界面的参数,其他雷同# % make gui_1 // Debug test 1 with DVE# % make tb_gui_1 // Debug test 1 with the testbench debugger# % make both_guis_1 // Debug using both guis# % make pp_1 // Debug using the VPD file VPD文件要在执行simv之后才有吧?# If you want, you can turn on coverage for the DEBUG flow by uncommenting the # coverage flag in the makefile. If you do this, you can still look at coverage.# This may be useful in helping those who are debugging coverage related issues. # 如果在makefile中的debug流程中使用了coverage功能,那么可以使用下面命令观察覆盖率# % make urg // Visualize coverage data from debug runs# -----------------------------------------------------------------------------------------------------------------------------# Regression Testcases# --------------------# Regression tests are used to collect coverage information. To build a testcase# for coverage collection use a command similar to the following.# regress流程主要是为了收集代码覆盖率信息,在执行regress之前需要重新build testcase 类似debug时的compile# % make regress_build_1 // Build and run a regression test with a default seed# Once the test has been built, you can run it again with a new seed.# 与debug不同的是regress需要重新run(使用新的SEED)一下,【还是debug的时候也要run一下?】# % make regress_run_1 SEED=1234# After running one or more regression runs, you can visualize the coverage data # using urg and the following command# run完之后可以用下面命令看代码覆盖率# % make regress_urg#----------------------------------------------------------------------------------------------------------------------------# HOW TO REUSE THIS FILE ON ANOTHER DUT //如何重用该模版# STEP 1: Update the file locations as required //设置file所属的路径# STEP 2: Update the DUT section with directory and source location info//更新模版中DUT部分,指定DUT的路径和include的路径# STEP 3: Update the TB section with directory and source location info//更新模版中TB部分,指定TB的路径和include的路径# STEP 4: Update the Coverage section with name of dut top (eg top.dut)//跟新模版中Coverage部分,指定要测试代码覆盖率的dut的top# STEP 5: Add test targets to the debug and regression targets section//将debug 和regress的target加入模版中对应的部分# STEP 5: Adjust the debug and regression compile and run time arguments//调整debug和regress的compile和runtime的命令参数# STEP 7: Adjust command line options as required//调整命令行命令(后边带百分号和冒号的就表示可以在make命令行中使用的命令)# STEP 8: Update the env class so that it extends dkm_env//更新env class(环境类)使得它可以提供dkm_env# You will need to have a copy of the dkm directory and it should //dkm 是什么?# be located at $(TB_SRC_DIR)/dkm# a) Add [`include "dkm_env.sv"]# b) Add [extends dkm_env] to the environment class definition# c) Call the super.new("name") from the constructor# STEP 9: Run the debug and regression targets# % make testbench_target_* // testbench_target_* 是指test_1之类的testcase#-----------------------------------------------------------------------------看了上文,大家应该可以简单了解这个Makefile的功能了。

相关文档
最新文档