0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

芯片设计中的Makefile简单教程

电子设计 来源:电子设计 作者:电子设计 2020-12-24 17:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Makefile可以做什么?

Makefile可以根据指定的依赖规则和文件是否有修改来执行命令。常用来编译软件源代码,只需要重新编译修改过的文件,使得编译速度大大加快。

Makefile的基本格式

目标:依赖 命令

目标是要生成的结果,依赖是生成结果需要的源文件和上一步骤的结果,命令是当目标不存在或者依赖更新时执行的命令。注意命令前必须用tab来缩进,不可以用空格。

示例一:

simv: tb.sv dut.v vcs -full64 -sverilog tb.sv dut.v

这个例子中,simv是目标,是我们要生成的仿真执行文件。tb.sv和dut.v是依赖,执行命令前会先检查tb.sv和dut.v是否存在,以及是否有修改。当依赖文件有修改时,或者目标不存在时,则执行命令vcs -full64 -sverilog tb.sv dut.v来生成simv。

伪目标

有时候目标并不是真实要生成的文件,比如我们要用Makefile调用simv来仿真,并不存在一个目标文件,这种情况我们称之为伪目标PHONY。

示例二:

sim: simv ./simv -xxx

这个例子中,sim并不是要生成的结果文件,而只是我们给操作起的一个名字。由于伪目标总是不存在,所以命令也一定会重新执行,即使simv没有修改。

我们常常在Makefile的开头来用.PHONY显式指明伪目标。

示例三:

.PHONY: simsim: simv ./simv -xxx

这样,我们在terminal里就可以用make sim来调用仿真命令。

默认目标

如果我们只是敲make(后面不跟目标),那么将调用Makefile里的第一个目标。那么我们为了防止出错通常把第一个目标定义成all(执行完整的流程)或者help(显示帮助菜单)。我更倾向于后者,可以帮助我们回忆如何使用Makefile脚本。

示例四:

.PHONY: help simhelp: 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.vsim: ./simv -xxx

这样,当我们不记得如何使用Makefile的时候,直接敲make就会有使用帮助菜单。另外,我们还可以看到,一个目标后面可以执行多条命令,比如这里的三条echo命令。

隐藏回显

在执行命令前,make会先回显命令(就是打印出命令)。上面的make help会输出:

echo "make help"make helpecho "make simv to compile"make simv to compileecho "make sim to run simulation"make sim to run simulation

看起来有点重复了。在命令前加@可以关闭回显示,这正是我们需要的。改进过的Makefile如示例五。

示例五:

.PHONY: helphelp: @echo "make help" @echo "make simv to compile" @echo "make sim to run simulation"

makefile内定义变量

当源文件比较多,且常需要增减,我们可以把依赖定义成一个变量,放成文件开头,如下。

示例六:

tbfile := tb.sv env_pkg.sv test_pkg.svrtlfile := dut.v a.v b.v c.vsimv: $(tbfile) $(rtlfile) vcs -full64 -sverilog $(tbfile) $(rtlfile)

当要增减文件时,只需要修改文件开头即可。

调用shell命令

如果rtl文件太多,还可以在Makefile里调用shell命令来帮助生成。如下面的例子:

示例七:

tbfile := $(shell ls *.sv)rtlfile := $(shell find rtl -name "*.v")simv: $(tbfile) $(rtlfile) vcs -full64 -sverilog $(tbfile) $(rtlfile)

例七中的tb和rtl文件写两遍,是不是有点麻烦。我们最好能简化一下。在Makefile中有几个特殊变量,如$@表示目标,$^表示依赖。所以示例七中的命令可以简化成:

simv: $(tbfile) $(rtlfile)vcs -full64 -sverilog $^

学到到这里你已经可以写出大部分的Makefile脚本了。

为makefile增加选项

但我们还需要进一步学习两个重要功能:选项和目录递归。

我们常需要在仿真时提供一些选项,比如testcase名,是否是post仿真,是否要dump波形。那么怎么实现呢?其实Makefile允许从命令行提供额外的变量,格式为OPTION=value。如下面的例子,假设有三个选项,TC、POST、DUMP:

示例八:

ifeq ($(POST),1)SRC := "netlist.v"else SRC := "rtl.v"endififeq ($(DUMP),1) DUMP_DEF := "+define+DUMP"else DUMP_DEF := ""endifsim: @echo "vcs -full64 -sverilog $(SRC) $(DUMP_DEF) +UVM_TESTNAME=$(TC)"

那么,使用时就可以通过命令行控制选项开关:

make sim TC=basic_testmake sim TC=basic_test POST=1make sim TC=basic_test DUMP=1make sim TC=basic_test POST=1 DUMP=1

makefile的大杀器:目录递归

另一个重要功能是目录递归,目录递归有一个典型的应用:make clean。在顶层目录里make clean时,将会自动调用子目录的make clean。这个怎么实现呢?看下面的例子:

示例九:

cat ./Makefileclean: rm -f *~ make -C a clean make -C b cleancat ./a/Makefileclean: rm -f *~cat ./b/Makefileclean: rm -f *~ make -C c cleancat ./b/c/Makefileclean: rm -f *~

我们看到一个make -C subdir clean,就是说可以通过-C来把目标clean传递给子目录,相当于在Makefile里调用了另一个Makefile。这样在顶到make clean时,将自动递归到所有的子目录。

Makefile的引用与复用

最后还有一点,我们也会经常遇到,把共用的Makefile脚本写到common.mk,然后再include common.mk,这样可以让Makefile看起来更简洁。

示例十

# ../common/common.mkbasic: @ echo "call basic"# Makefiledep := $(shell depth)all: basic @ echo "call all"include $(dep)/common/common.mk

如果被include的文件使用相对路径的话,必须相对敲make命令的目录。当然也可以像这个示例一样,先获取项目根目录,然后再用变量来引用路径。这样比较易于移植。

与IC Flow的联系

到这里,学了这么多,你已经可以写一些复杂的Makefile了。但重在应用,在IC设计里,我们常常用Makefile串起多个工具,实现完整的流程。下面是一个启发型的例子。

示例十一:

.PHONY: help clean rtl lint sim syn lec pr pt lvshelp: @echo "make help"clean: rm -rf *~ *.log *.fsdb csrc simv* ... make -C xxx cleanrtl: python3 ...lint: sg_shell/nLint ...sim: vcs/irun ...syn: dc_shell -64bit -topographical -f run_syn.tcl | tee log/syn.loglec: fm_shell/lec ...pt: pt_shell ...pr: innovus/icc ...lvs: calibre ...

习题:

根据自己公司的情况,把示例十一补充完整。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11893

    浏览量

    220211
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    20568
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    简单认识微爱芯AiP4057系列锂电充电芯片

    AiP4057系列采用SOT23-6小封装,涵盖常压及高耐压版本,适用于TWS耳机、智能穿戴,各种便携式IoT设备等多种应用场景,丰富了微爱芯锂电充电芯片产品线。
    的头像 发表于 06-05 15:53 206次阅读
    <b class='flag-5'>简单</b>认识<b class='flag-5'>中</b>微爱芯AiP4057系列锂电充电<b class='flag-5'>芯片</b>

    PT8A2512NE:简单实用的烤面包机控制器芯片

    PT8A2512NE:简单实用的烤面包机控制器芯片 在电子设备的设计,为烤面包机这类小家电选择合适的控制器芯片至关重要。今天就来详细介绍一款由PT Pericom Technolog
    的头像 发表于 03-27 13:50 486次阅读

    CI2451实战指南:一款2.4G无线SoC芯片,如何让遥控玩具和灯控设计更简单

    引言 在做嵌入式开发的过程,我们经常会遇到需要“无线遥控”的场景。以前,要实现一个简单的遥控器,往往需要一颗MCU加上一颗2.4G射频芯片(如NRF24L01),不仅占用PCB面积大,BOM成本高
    的头像 发表于 03-26 17:33 97次阅读
    CI2451实战指南:一款2.4G无线SoC<b class='flag-5'>芯片</b>,如何让遥控玩具和灯控设计更<b class='flag-5'>简单</b>?

    静力水准仪应用倾角芯片是为什么?

    静力水准仪(也称为连通管水准仪或液体静力水准系统)应用倾角芯片(倾角传感器)主要是为了提高测量精度、补偿安装误差、监测系统稳定性以及扩大适用范围。以下是具体原因和作用:1.补偿安装误差非水平
    的头像 发表于 01-09 12:03 380次阅读
    静力水准仪<b class='flag-5'>中</b>应用倾角<b class='flag-5'>芯片</b>是为什么?

    Cadence Genus低功耗综合工具在芯片设计的作用

    芯片设计功耗的规划,其实和管理每月的预算很像。要是不盯着“瓦数”都花在了哪儿,最后可能做出一个华而不实且毫无效率的芯片。这就好比把工资全砸在新奇的数码产品上,却忘了交房租。到头来,芯片
    的头像 发表于 12-11 10:10 1102次阅读

    芯片制造检验工艺的全数检查

    在IC芯片制造的检验工艺,全数检查原则贯穿于关键工序的缺陷筛查,而老化测试作为可靠性验证的核心手段,通过高温高压环境加速潜在缺陷的暴露,确保芯片在生命周期内的稳定运行。以逻辑芯片与存
    的头像 发表于 12-03 16:55 1131次阅读
    <b class='flag-5'>芯片</b>制造检验工艺<b class='flag-5'>中</b>的全数检查

    芯片制造的步骤

            简单地说,芯片的制造过程可以大致分为沙子原料(石英)、硅锭、晶圆、光刻(平版印刷)、蚀刻、离子注入、金属沉积、金属层、互连、晶圆测试与切割、核心封装、等级测试、包装上市等诸多
    的头像 发表于 11-14 11:14 972次阅读

    蜂鸟hbird sdk的Makefile架构分析

    dasm;然后执行 make upload对程序进行烧录. 完成上述过程,是一系列Makefile文件联合运行的结果. 1. helloworld文件的Makefile 应用Makef
    发表于 10-30 07:15

    芯片设计Guard Ring的构成和作用

    芯片设计,Guard Ring(保护环) 是一种环绕在敏感电路或器件(如模拟电路、高精度器件、存储器单元、I/O驱动器等)周围的版图结构,形成关键的“隔离带”。它的核心使命是提高电路的可靠性、性能和抗干扰能力,是复杂芯片(尤
    的头像 发表于 10-28 14:49 2749次阅读
    <b class='flag-5'>芯片</b>设计<b class='flag-5'>中</b>Guard Ring的构成和作用

    简单了解射频芯片

    运算与协议栈;二者相辅相成,却又各司其职。本文尝试以“信号的一生”为主线,抽丝剥茧地还原射频芯片从设计、制造到封装的完整旅程。
    的头像 发表于 08-22 15:10 2562次阅读

    如何理解芯片设计的后端布局布线

    后端布局布线(Place and Route,PR)是集成电路设计的一个重要环节,它主要涉及如何在硅片上合理地安排电路元器件的位置,并通过布线将这些元器件连接起来,以确保芯片能够正确地工作。这个过程是芯片设计的最后阶段之一,它
    的头像 发表于 08-15 17:33 1760次阅读

    芯片制造的对准技术详解

    三维集成电路制造,对准技术是确保多层芯片键合精度、实现高密度TSV与金属凸点正确互联的核心技术,直接影响芯片性能与集成密度,其高精度可避免互连失效或错误,并支持更小尺寸的TSV与凸点以节约面积。
    的头像 发表于 08-01 09:16 3968次阅读
    <b class='flag-5'>芯片</b>制造<b class='flag-5'>中</b>的对准技术详解

    谐波怎么处理最简单的方法

    ,如变频器、UPS电源、LED照明、计算机等电子设备。这些设备在工作时会产生非正弦波电流,从而在电网形成谐波。常见的谐波次数为3次、5次、7次等奇次谐波。 二、最简单的谐波处理方法 1. 增加系统短路容量    提高系统的短路容
    的头像 发表于 07-13 16:35 4571次阅读
    谐波怎么处理最<b class='flag-5'>简单</b>的方法

    一个简单的串联电池组充放电实验

    文章介绍了电池充放电的数据采集并简单阶段了电池容量
    的头像 发表于 07-03 14:41 2058次阅读
    一个<b class='flag-5'>简单</b>的串联电池组充放电实验