1、语法
目标 : 依赖文件
命令1 #命令必须Tab键开头,命令过长使用反斜杠”\”换行
命令2
① 目标:即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译,否则会重新编译并更新目标文件。
② 依赖:即目标文件由哪些文件生成。依赖文件有可能此时并不存在,需要新制作,那么这个依赖文件就成了其他规则的目标,该目标也会有他自己的依赖和命令
③ 命令:即通过执行命令,由依赖文件生成目标文件。
④ all:默认情况Makefile文件生成第一个目标文件即完成编译,但可以通过all指定所需生成的目标文件。当你在命令行中运行make all时,make命令会寻找并执行all目标,将依次执行target1、target2和target3依赖文件。
all : target1 target2 target3
target1 :
命令1
target2 :
命令2
target3 :
命令3
⑤ Makefile并不会关心命令如何执行,仅是去执行所有定义的命令,和直接输入命令行一样。
2、变量
变量在声明时需要给值,使用变量时需在变量名前加"$"符号,当变量多于一个字符时使用"( )"将所有字符括起来。
① 变量赋值:
var := var_value #定义var变量并直接赋值
② 取变量值:
objects := main.o display.o search.o #定义objects变量并直接赋值
all : $(objects) #使用objects变量
命令
3、函数
3.1 foreach函数
$(foreach <var>,<list>,<text/command>)
① 把list中的单词逐一取出放到参数var这个变量中(即赋值给var),然后再执行text(command)所包含的表达式。
② 每一次text(command)都会返回一个字符串,循环过程中text(command)返回的每个字符串以空格分割(command以;分隔),最后当整个循环结束的时候,由text(command)返回的每个字符串组成的整个字符串将会是 foreach 函数的返回值。
③ foreach中的var参数是一个临时的局部变量,foreach 函数执行完后,参数var的变量将不再起作用,其作用域只在 foreach 函数当中。
names := a b c d
files := $(foreach var,$(names),$(var).o) #循环产生text
all:
@echo $(files) #输出a.o b.o c.o d.o
3.2 if函数
$(if <condition>,<then-part>,<else-part>)
参数condition是 if 表达式,如果其是非空字符串,则condition为真,于是then-part就会被计算;否则else-part会被计算,如果else-part没有被定义,则函数返回空字串符。
OBJ0 := #空字符
OBJ1 := foo.c
OBJ2 := $(if $(OBJ0),$(OBJ1),main.c)
OBJ3 := $(if $(OBJ1),$(OBJ1),main.c)
all:
@echo $(OBJ2) #输出main.c
@echo $(OBJ3) #输出foo.c
3.3 shell函数
$(shell command arguments)
shell 函数不像其它的函数,它的参数就是操作系统Shell的命令,shell函数把执行操作系统命令后的输出作为函数返回,如下为执行Shell语言中的seq命令。
nums = $(shell seq -f "test%03g" -s ´ ´ 1 1 3)
#输出宽度3位,间隔为空格的序列 nums = test001 test002 test003
seq [选项] 首数 增量 尾数
-f, --format #使用指定格式输出
-s, --separator #使用指定字符串分隔数字(默认为\n)
-w, --width #在列前添加0使得宽度相同(不能与%03g格式同时使用)
4、示例
#使用Makefile实现VCS编译仿真、Verdi波形分析
all : clean comp sim
#----------------------------------------------------------------------------------------------
clean:
rm -rf csrc simv* *.log *.fsdb novas.* ucli.key verdiLog DVEfiles
#----------------------------------------------------------------------------------------------
comp:
vcs -sverilog -full64 -notice -debug_all -j8 \
+plusargs_save +libext+.v+.V+.sv+.svh +memcbk \
-P ${Verdi_HOME}/share/PLI/VCS/LINUX64/novas.tab \
${Verdi_HOME}/share/PLI/VCS/LINUX64/pli.a \
-cm line+cond+fsm+tgl+branch \
-timescale=1ns/1ns -f ./file.list \
-l compile.log
#----------------------------------------------------------------------------------------------
sim:
./simv -l sim.log +dump -cm line+cond+fsm+tgl+branch
#----------------------------------------------------------------------------------------------
verdi:
verdi -f ./file.list -ssf tb.fsdb -nologo &
参考资料: