JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

设计一颗芯片:IC 设计流程

一块成品芯片里装着几十亿个开关,却没人是手工摆放的——跟着一个设计从一句话的想法一路走到工厂印制的掩模,你就会看见软件是怎么把一个愿望变成硅片的。

从一份规格说明开始

在任何人画下第一根线之前,设计是从一张愿望清单开始的。这块芯片到底要做什么?也许是解码视频,也许是当一部手机的大脑,也许是测量心跳。把这张愿望清单精确地写下来,就叫做规格说明(spec,是 specification 的简称)。把它想成建筑师在房子还不存在时手里那份任务书:要几个房间、盖多高、能花多少钱。

一份真正的规格说明,核心其实是三个让人吵个没完的数字:跑多快、耗多少电,以及占多大芯片面积(也就是多少钱)。这三者彼此较劲,像一场三方拔河——让它更快,通常就会更热、更大。整个芯片设计的功夫,就是在这三者之间找到一个甜蜜点。

从规格说明出发,工程师先勾勒出架构——有哪些大模块、它们怎么连,就像一张平面图写着「厨房在这、卧室在那」。然后他们再放大到微架构:每个模块究竟一步一步怎么干活。这一切都是在纸上和文档里定下来的,远早于任何版图的出现。在这一步把方案想错了,后面再聪明的布线也救不回来。

用 RTL 描述行为

方案定下来后,设计师并不去画晶体管——他们写代码。用 Verilog 或 VHDL 这样的硬件描述语言,在所谓的寄存器传输级(register-transfer level,简称 RTL)上描述这块芯片该做什么。这名字听着唬人,意思却很亲切:你描述的是数据在时钟每跳一下时,怎么从一个小储存格(寄存器)搬到下一个,以及途中算了些什么。

这里有个最容易把新手绊倒的地方:它看起来像软件,但它不是一份一步接一步执行的菜谱。你写的每一行都会变成真实的硬件,全部同时存在、并行运行。写 RTL 与其说像列一张待办清单,不如说像在描述一整支同时演奏的管弦乐队,所有声部都跟着指挥棒——也就是时钟——的每一拍一起响。

// an 8-bit register: on each rising clock edge,
// load new data, unless reset is held
always @(posedge clk) begin
  if (reset)
    count <= 8'd0;       // clear to zero
  else
    count <= count + 1;  // otherwise count up
end
一段 Verilog 写的小计数器。「posedge clk」意思是「在时钟上跳的那一刻」;每跳一下,count 就加一——或者被复位为零。

把上面那段慢慢读一遍,你几乎能听见它的节奏:时钟每往上跳一次,计数器要么清零,要么往上挪一格。一整块芯片,就是成千上万段这样的小描述拼接而成的。RTL 一旦写好,人来做的部分基本就告一段落了——从这里起,方向盘交给软件。

综合 → 逻辑门

你的 RTL 说清了应该发生什么,但还没说清要用哪些真实零件去做。一个叫综合器(synthesizer)的工具来完成这步翻译。把你的代码喂给它,它就把那些行为描述编译成一张网表(netlist)——一份精确的清单,列出实际用到的逻辑门(与门、或门、非门这一家子)以及它们到底怎么连在一起,才能产生你描述的那个行为。

拿普通编程来类比会更好懂:写 RTL 就像用一门高级语言写程序,而综合就是那个把它翻译成硬件世界真能造出来的东西的「编译器」。只不过它产出的不是机器指令,而是一张由逻辑门组成的接线图——而且每个门都是从一本现成的「积木目录」里挑出来的,这本目录我们下一节就会见到。

标准单元、布局与布线

网表里的那些门,并不是每次都从头设计的。晶圆厂会给你一个现成小积木的库,叫做标准单元(standard cells)——画好的与门、画好的触发器等等,每一个都是同样高度的整齐小方块,像专门做来一排排卡在一起的乐高积木。你的网表现在就成了一张巨大的物料清单:成千上万乃至上百万块这样的积木。

接下来是物理设计,工具的活儿变得无比具体、可见。它先给晶粒(die)做布局规划(floorplan)——决定哪些大区域摆在这块硅矩形的什么位置。然后它把每个单元摆放(place)到一个真实的位置上。再然后它布线(route),把连接它们的金属线一条条接好,并在很多层之间堆叠走线,像一座拥挤城市里的马路、立交桥和隧道。这整套「装箱加接线」的活儿,就叫做布局布线

而且它不能随便乱塞。工具会一刻不停地检查自己有没有守住面积预算(芯片不能长得太大)和功耗预算(不能抽走太多电流),同时还要让导线足够短,好让信号准时到达。这是一道城市那么大的装箱难题,却要在几个小时内解开。

验证与时序

在走完上面这一切的过程中,尤其是在拍板量产之前,设计必须被证明是正确的——因为芯片一旦出货,你没法再打补丁。验证就是那张安全网,它有好几种花样。仿真(simulation)给设计喂进假装的输入、再核对输出,就像真飞之前先上飞行模拟器。形式化检查(formal checks)走得更远,用数学去证明某条性质对每一种可能的输入都成立,而不只是你碰巧试到的那几种。

最难守住的承诺是时序(timing)。还记得那个打节拍的时钟吗?每一个离开寄存器的信号,都得穿过沿途的逻辑门,并在下一个时钟跳动之前抵达下一个寄存器。哪怕只有一条路径太慢,那一拍就会在半路上把信号截住,于是芯片算出一堆垃圾。让每一条路径都按时安顿好,叫做时序收敛(timing closure)——在一块大芯片上,要检查的路径可能多达上百万条。

流片

当验证通过、每条路径都完成时序收敛,设计就迎来它的高光时刻:签核(sign-off)。团队跑完最后一整套检查,所有该批准的人都批准了,然后这份完工的设计被送往工厂——也就是晶圆厂(foundry)——送过去的是一套掩模(masks),那是工厂用来把芯片印到硅片上的「模板」。这次交付,就叫做流片

这个有点好笑的老名字,来自从前——那时完工的设计真的会被写到一卷磁带上,再带出门送去晶圆厂(fab)。磁带早就没了,但这一刻的分量没变:一旦流片,你就收不回来了。掩模会被做出来,晶圆会被印出来,几周之后,第一批真正的芯片就回到自家手里接受测试。

EDA 工具在做什么

退后一步看整段旅程,有一个事实会跳出来:思考是人做的,但搭建是软件做的。综合器、布局器、布线器、时序检查器、各种验证引擎——它们全都属于一个大类,叫做 EDA,是 Electronic Design Automation(电子设计自动化)的简称。你刚刚读到的每一个环节,都跑在 EDA 软件上。

而它非这样不可,原因其实很简单。一块现代芯片可以装下几百亿个晶体管。要是你一秒摆一个、纯手工、还从不睡觉,你也得摆上好几个世纪。没有任何一个人、也没有任何一支人类团队,能用手工设计出那么大的芯片——这个规模根本超出了我们的能力。是 EDA,把不可能变成了日常。

  1. 规格:定下芯片要做什么,以及它的速度、功耗、面积预算。
  2. RTL:用 Verilog 或 VHDL 一个寄存器一个寄存器、一拍时钟一拍时钟地描述行为。
  3. 综合:把 RTL 编译成一张由逻辑门和标准单元组成的网表。
  4. 布局布线:给晶粒做布局规划、摆放每个单元、布好金属线,并守住预算。
  5. 验证并收敛时序:仿真、证明,并确保每条路径都跑赢时钟。
  6. 流片:签核,把掩模送去晶圆厂——这是不可回头的一步。

所以下次你拿起一部手机,记得它内部那个奇妙的小奇迹:一个写成规格的愿望,变成了代码,编译成了逻辑门,由软件装箱接线,一拍一拍地核对过,最后印到一小片比你指甲还小的硅片上。这就是 IC 设计流程——而现在,你已经把整条路走完了一遍。