Makefile可以做什么?
Makefile可以根據(jù)指定的依賴規(guī)則和文件是否有修改來(lái)執(zhí)行命令。常用來(lái)編譯軟件源代碼,只需要重新編譯修改過(guò)的文件,使得編譯速度大大加快。
Makefile的基本格式
目標(biāo):依賴
命令
目標(biāo)是要生成的結(jié)果,依賴是生成結(jié)果需要的源文件和上一步驟的結(jié)果,命令是當(dāng)目標(biāo)不存在或者依賴更新時(shí)執(zhí)行的命令。注意命令前必須用tab來(lái)縮進(jìn),不可以用空格。
示例一:
simv: tb.sv dut.v
vcs -full64 -sverilog tb.sv dut.v
這個(gè)例子中,simv是目標(biāo),是我們要生成的仿真執(zhí)行文件。tb.sv和dut.v是依賴,執(zhí)行命令前會(huì)先檢查tb.sv和dut.v是否存在,以及是否有修改。當(dāng)依賴文件有修改時(shí),或者目標(biāo)不存在時(shí),則執(zhí)行命令vcs -full64 -sverilog tb.sv dut.v來(lái)生成simv。
偽目標(biāo)
有時(shí)候目標(biāo)并不是真實(shí)要生成的文件,比如我們要用Makefile調(diào)用simv來(lái)仿真,并不存在一個(gè)叫做sim的目標(biāo)文件,這種情況我們稱之為偽目標(biāo)PHONY。
示例二:
sim: simv
./simv -xxx
這個(gè)例子中,sim并不是要生成的結(jié)果文件,而只是我們給操作起的一個(gè)名字。由于偽目標(biāo)總是不存在,所以命令也一定會(huì)重新執(zhí)行,即使simv沒(méi)有修改。
我們常常在Makefile的開頭來(lái)用.PHONY顯式指明偽目標(biāo)。
示例三:
.PHONY: sim
sim: simv
./simv -xxx
這樣,我們?cè)?a href="http://www.ttokpm.com/tags/te/" target="_blank">terminal里就可以用make sim來(lái)調(diào)用仿真命令。
默認(rèn)目標(biāo)
如果我們只是敲make(后面不跟目標(biāo)),那么將調(diào)用Makefile里的第一個(gè)目標(biāo)。那么我們?yōu)榱朔乐钩鲥e(cuò)通常把第一個(gè)目標(biāo)定義成all(執(zhí)行完整的流程)或者h(yuǎn)elp(顯示幫助菜單)。我更傾向于后者,可以幫助我們回憶如何使用Makefile腳本。
示例四:
.PHONY: help sim
help:
echo "make help"
echo "make simv to compile"
echo "make sim to run simulation"
simv: tb.sv dut.v
vcs -full64 -sverilog tb.sv dut.v
sim:
./simv -xxx
這樣,當(dāng)我們不記得如何使用Makefile的時(shí)候,直接敲make就會(huì)有使用幫助菜單。另外,我們還可以看到,一個(gè)目標(biāo)后面可以執(zhí)行多條命令,比如這里的三條echo命令。
隱藏回顯
在執(zhí)行命令前,make會(huì)先回顯命令(就是打印出命令)。上面的make help會(huì)輸出:
echo "make help"
make help
echo "make simv to compile"
make simv to compile
echo "make sim to run simulation"
make sim to run simulation
看起來(lái)有點(diǎn)重復(fù)了。在命令前加@可以關(guān)閉回顯示,這正是我們需要的。改進(jìn)過(guò)的Makefile如示例五。
示例五:
.PHONY: help
help:
@echo "make help"
@echo "make simv to compile"
@echo "make sim to run simulation"
makefile內(nèi)定義變量
當(dāng)源文件比較多,且常需要增減,我們可以把依賴定義成一個(gè)變量,放成文件開頭,如下。
示例六:
tbfile := tb.sv env_pkg.sv test_pkg.sv
rtlfile := dut.v a.v b.v c.v
simv: $(tbfile) $(rtlfile)
vcs -full64 -sverilog $(tbfile) $(rtlfile)
當(dāng)要增減文件時(shí),只需要修改文件開頭即可。
調(diào)用shell命令
如果rtl文件太多,還可以在Makefile里調(diào)用shell命令來(lái)幫助生成。如下面的例子:
示例七:
tbfile := $(shell ls *.sv)
rtlfile := $(shell find rtl -name "*.v")
simv: $(tbfile) ($rtlfile)
vcs -full64 -sverilog $(tbfile) $(rtlfile)
例七中的tb和rtl文件寫兩遍,是不是有點(diǎn)麻煩。我們最好能簡(jiǎn)化一下。在Makefile中有幾個(gè)特殊變量,如$@表示目標(biāo),$^表示依賴。所以示例七中的命令可以簡(jiǎn)化成:
simv: $(tbfile) $(rtlfile)
vcs -full64 -sverilog $^
學(xué)到到這里你已經(jīng)可以寫出大部分的Makefile腳本了。
為makefile增加選項(xiàng)
但我們還需要進(jìn)一步學(xué)習(xí)兩個(gè)重要功能:選項(xiàng)和目錄遞歸。
我們常需要在仿真時(shí)提供一些選項(xiàng),比如testcase名,是否是post仿真,是否要dump波形。那么怎么實(shí)現(xiàn)呢?其實(shí)Makefile允許從命令行提供額外的變量,格式為OPTION=value。如下面的例子,假設(shè)有三個(gè)選項(xiàng),TC、POST、DUMP:
示例八:
ifeq ($(POST),1)
SRC := "netlist.v"
else
SRC := "rtl.v"
endif
ifeq ($(DUMP),1)
DUMP_DEF := "+define+DUMP"
else
DUMP_DEF := ""
endif
sim:
@echo "vcs -full64 -sverilog $(SRC) $(DUMP_DEF) +UVM_TESTNAME=$(TC)"
那么,使用時(shí)就可以通過(guò)命令行控制選項(xiàng)開關(guān):
make sim TC=basic_test
make sim TC=basic_test POST=1
make sim TC=basic_test DUMP=1
make sim TC=basic_test POST=1 DUMP=1
makefile的大殺器:目錄遞歸
另一個(gè)重要功能是目錄遞歸,目錄遞歸有一個(gè)典型的應(yīng)用:make clean。在頂層目錄里make clean時(shí),將會(huì)自動(dòng)調(diào)用子目錄的make clean。這個(gè)怎么實(shí)現(xiàn)呢?看下面的例子:
示例九:
./Makefile
clean:
rm -f *~
make -C a clean
make -C b clean
./a/Makefile
clean:
rm -f *~
./b/Makefile
clean:
rm -f *~
make -C c clean
./b/c/Makefile
clean:
rm -f *~
我們看到一個(gè)make -C subdir clean,就是說(shuō)可以通過(guò)-C來(lái)把目標(biāo)clean傳遞給子目錄,相當(dāng)于在Makefile里調(diào)用了另一個(gè)Makefile。這樣在頂?shù)絤ake clean時(shí),將自動(dòng)遞歸到所有的子目錄。
Makefile的引用與復(fù)用
最后還有一點(diǎn),我們也會(huì)經(jīng)常遇到,把共用的Makefile腳本寫到common.mk,然后再include common.mk,這樣可以讓Makefile看起來(lái)更簡(jiǎn)潔。
與IC Flow的聯(lián)系
到這里,學(xué)了這么多,你已經(jīng)可以寫一些復(fù)雜的Makefile了。但重在應(yīng)用,在IC設(shè)計(jì)里,我們常常用Makefile串起多個(gè)工具,實(shí)現(xiàn)完整的流程。下面是一個(gè)啟發(fā)型的例子。
示例十:
.PHONY: help clean rtl lint sim syn lec pr pt lvs
help:
@echo "make help"
clean:
rm -rf *~ *.log *.fsdb csrc simv* ...
make -C xxx clean
rtl:
python3 ...
lint:
sg_shell/nLint ...
sim:
vcs/irun ...
syn:
dc_shell -64bit -topographical -f run_syn.tcl | tee log/syn.log
lec:
fm_shell/lec ...
pt:
pt_shell ...
pr:
innovus/icc ...
lvs:
calibre ...
習(xí)題:
根據(jù)自己公司的情況,把示例十補(bǔ)充完整。
審核編輯:湯梓紅
-
命令
+關(guān)注
關(guān)注
5文章
658瀏覽量
21928 -
編譯
+關(guān)注
關(guān)注
0文章
646瀏覽量
32668 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19145
原文標(biāo)題:【手把手系列】:芯片設(shè)計(jì)中的Makefile簡(jiǎn)明教程
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論