最近IC被大众关注,掀起了一股全民IC(集成电路)热。本期,我想给朋友们分享一下IC世界,以不求甚解的方式走马观花溜一遍这个看似神秘的地方。虽然说是“观花”,却不是“看花”,因为这个世界更加是一个抽象的世界,而不是一个实际的世界,是看不到的世界。这是一个信息如何承载、组织以及表达的世界。
IC是计算机、互联网的实物载体
图1 IC世界的三大部分
如图1所示,IC世界分为应用软件,系统软件和硬件三大部分。每一部分在自己的领域又有更细的划分。应用软件诸如大家熟悉的EXCEL,王者荣耀,支付宝等等。系统软件像window,IOS,android等。硬件比如CPU,GPU,TPU,我们忆芯的SSD controller这样的专用ASIC等。应用软件和系统软件大家都很熟悉了(图2),都不用我贴图示例,但其实十几年前很多人还对电脑一头雾水的时候,说清楚什么是应用程序还是需要费点工夫,现在肯定还有很多读者嫌我啰嗦了。可见,许多东西不是神秘不神秘,只是知道不知道而已。
系统软件是控制和协调计算机及外部设备,支持应用软件开发和运行的系统。为什么要有这一层软件,我们后面看实例再讲解。
最后就是硬件。硬件是计算机系统中由电子,机械和光电元件等组成的各种物理装置的总称。这些物理装置按系统结构的要求构成一个有机整体为计算机软件运行提供物质基础。
图2 各种应用程序
图3 硬件设备
硬件之下
前面说过,前面的每个层级在各自领域还会进一步分化。比如应用软件领域的通讯协议TCP/IP 就有7层,每一层可能耗尽一个普通人一辈子的精力去研究。当然,当效率提高,做法得到证明已经优化得当,就会固化下来,固化之后因为屏蔽了内部繁琐的内容,就会变得简单。这样一个人能处理多层时,可能层次的分化又会合并,比如TCP/IP的应用层、表示层、会话层也会合并成应用层,使协议变成5层。反之又分离,比如以前计算单元只有CPU,后来图像处理需要分离出GPU,现在AI需要分离出TPU。
这种层次抽象的做法在IC世界非常普遍。
而硬件领域也分成很多层。一方面硬件芯片跟软件一样是一个逻辑系统,有很多逻辑分层,比如我们的忆芯芯片的管理接口协议分层(图4)。
图4 star1000管理接口协议分层
另外一方面,还有硬件实现的分层。第一层是从逻辑设计到物理设计(图5)。大家不要细看图中的内容,听我简单解释就行,咱们要不求甚解!图5中的HDL coding 是前端架构师设计的芯片架构和逻辑。有点像我们的应用软件编程的意思。通过图中的DC Explorer,Design Compiler这样的工具变成 Physical design。
图5 从逻辑网表到物理网表
图6 HDL coding
图7 physical design
HDL coding大概长成图6这个样子,它是一个代码表达的逻辑表述。physical design如图7,是用真实的器件代表了抽象的逻辑表述。图6的HDL 只是我们很长很长的代码的一点点。我们图7也是很大很大的physical design的一点点。有点像我们截取了宇宙的一点点来细看。
前面提到的“器件”,那“器件”是什么?为什么能代表逻辑?这里我们就在拿放大镜看到我们“宇宙”的最基本单元:逻辑器件。
逻辑器件可以进行逻辑操作。图8 是一个逻辑器件。左边是它的电路组成,右边是它的设计版图。有了这个设计版图就可以在晶圆厂去生产这个器件了。这个器件为什么可以表示逻辑呢?这个就比较复杂了,长话短说:计算机世界里,高电压代表逻辑1(真),低电平
图8 一个逻辑器件
图9 逻辑器件的真值表
代表逻辑0(假)。这个器件有输入端A 和 B,输出端 Y。当A和B 不同高低压组合的时候Y会有相应的高低压变化。这就可以代表很多逻辑了。
逻辑怎么用?有一门学科叫“数理逻辑”。有了逻辑可以代表很多事情。比如这个与非门器件。我们可以处理我们实际世界的事情,比如:
家里只有一个小鱼干。对输入端A喵 和 B喵来说,给出0是不吃小鱼干,1是吃小鱼干。对输出端来说1代表小鱼干够吃,0代表小鱼干不够吃了。当输入端A B 喵都要吃小鱼干,AB都输入是1,输出端就输出0,代表说“糟了,小鱼干不够吃了。”
所代表的事情是我们事先约定好的。
杠精:“等等,它们可以分一个小鱼干啊!”
“走开!”
当然也可以用逻辑表示加减乘除。篇幅有限,我这里就不展开了。
再往硬件底层走走,组成“器件”的就是更基础的单元:MOS管。如果把逻辑器件比作分子,而MOS管就是原子了。图10分别是MOS管的符号,工作原理图,结构示意图。MOS管的大小决定了我们硬件的工艺点,比如28nm,7nm等。节点越小工艺越复杂,速度越快,功耗越低。是摩尔定律得以实现最重要的保障。到此我也不再往下科普了。太复杂了。因为解决MOS管里面一个小小的事情都需要费很多脑子。记得小编读书的时候,有位教授讲到“悬浮电子”(MOS管里有些电子因为某些原因跑到不该去的绝缘体去了,又出不来,对周围空间产生了不该有的磁场,造成MOS管不能正常工作)的问题时说,就围绕这个问题全世界每年发表不少论文,并没有有效解决,不过可以毕业不少博士。教授是北大的教授,他口中的博士不只是北大清华的博士,也包括伯克利、麻省的博士。可见,最优秀的人在这方面花掉一个青春可能只是解决了一个“小麻烦”。
所以就不继续深究了,大家晓得MOS管是构成逻辑器件的开关就行了。开关,就是要么开,要么关。通过开和关,形成逻辑组合。从而形成最基本的逻辑行为。
总之,从应用层面到最后的MOS管。每个层面都能横向、纵向分出非常多的领域分支,需要很多人协力完成。就MOS管的制备就分几百个工艺步骤,每个工艺步骤又对应着相应的设备,相应的设备又对应化工、机械、材料等各领域的成就。全世界都没几个国家可以独立掌握。可想而知,虽然不太神秘的IC世界却足够复杂。复杂得需要许许多多的智慧和劳动。所以,IC是一个聚集大量智慧与劳动的世界性工程。只有与世界的通力合作,手头有先进环节的技术,与他人交换,才能坐稳自己的地位,才不被“卡脖子”。现在被“卡脖子”是因为连一个要挟别人的点都没有。形势很严峻,我备当努力!
图10 MOS管
计算
前面带大家从每天触手可见的应用程序看到一辈子都不太可能亲眼所见的最底层的MOS管。那我们的应用软件是如何运行在这些MOS管之上的呢?
应用软件现在可以用于导弹弹道计算,打游戏,支付,定位等等。它们本质都是计算。什么?有朋友表示不懂这句话。朋友说我最喜欢看小视频了,我最讨厌计算了,它们怎么是一回事呢?
比方说,我们用python处理一张图片:
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.mode)
rgb2xyz = (0.412453,0.357580, 0.180423, 0,
0.212671,0.715160, 0.072169, 0,
0.019334,0.119193, 0.950227, 0 )
new_im = im.convert("L", rgb2xyz)
print(new_im.mode)
new_im.show()
嗯,不要看这些代码,看也看不懂。大概你晓得通过python的库,程序员做到了图像处理。不管是大家看的抖音,还是用的photoshop,虽然没有让你来敲代码。但是每一个操作的背后都对应着相应的代码。别的不重要,重要的是晓得应用程序是由一行行代码组成的就行了。而一行行代码背后就是图像的数学模型。图11。不仅图像可以由数学模型表示,
图11 一种图片的数学模型
世界上很多事物都有对应的数学模型。数学界有一句话是说,数学的终极目标是证明整个世界!
有朋友又表示不懂,为什么数学可以表示那么多东西呢?
那小编在此处再多说几句吧。比如1可以表示一个人,一只猫,一个动作,一个颜色,一块钱,也可以是一万块钱,甚至也许是3块钱。世界的万事万物都可以表示。比如图12的RGB部分编码。现在世界上很多东西都有世界性的标准编码。后面会带大家看到机器编码。计算世界的强大之处在于计算快,所以一个简单的事情它可以用简单的加减乘除做成千上万次来完成。比如图13的图像,为了获得这样的效果GPU使用了超过1400各指令。当然每个指令又会分解成成倍的加减或是逻辑运算。
图12 RGB部分编码
图13 GPU使用超过1400各指令渲染的图像
你玩的游戏亦是如此。你轻轻的一点鼠标可能引发上亿次计算获得你要得到一次抬手、奔跑这些动作。
除了计算效果之外,还有很多事件控制。比如I2C协议,nvme协议,PCIE协议前面说的TCP/IP等等。还有火得不得了的区块链技术。其它的还有加密解密技术等。
很多人觉得黑客很厉害,可以敲敲键盘盗取钱财。其实他常常只是利用了一些设计漏洞,做了手脚,跟捡到你手机成功骗你爸妈打来一点钱一样。只是黑客操作的层面普通人不太容易接触到而已。随着信息化社会逐渐完善,每一步涉及利益的操作都会附带冗余的信息日志保存,在公安机关的打击下,网络作案获得收益便不太容易。也因为在信息上面做手脚也是很容易的,所以各个国家才会担心使用设备可能会被留后门。
言归正传。前面解释了应用程序为什么可以做那么多事情。是因为成千上万行的代码,代表着那些实际世界的数学模型,不断地计算的结果。
代码也可以分层:一个完整的应用程序是由很多部分组成的,我们叫它“模块”,而模块又是由语句组成,语句是由表达式组成。
我们抛去那成千上万行代码,把注意力看到一个“语句”上面来。继续我们的探索。
比如高级脚本语言的“cd””print”等命令,涉及到目录跳转,磁盘存取,终端打印等。这个就是前面所介绍的系统软件的功劳了。系统软件就像一个管家一样,把硬件系统管理得井井有条。就像你走进城堡,给管家说“倒一杯茶来”,你得到的相应是茶到你手上了。
但管家却做了很多事情:听到指令>跑到厨房>找到茶叶>选择你需要的茶叶>煮水>泡茶>端上来。系统软件也是一样,比如打印字符。系统可能会涉及:从终端得到ASCII码> 信息进入内存>解析命令、分解操作数操作码>把操作数放到最优化的内存>如果内存没位置>启动页面管理将暂时不用的放到硬盘去腾出空间并记录>数据终于放好了>计算>将计算结果输出到相应文件(计算机设备都叫文件)>文件是什么设备,给相应设备>相应设备启动>相应设备得到数据>相应设备响应并返回>操作结束。。。。
有点累了吧。歇一下。我们的IC世界就是这么孜孜不倦地完成你的指令的!
图14是一个高级程序语言变成机器语言,然后被执行的过程。这里每一步都是跟上一步可以脱离的。所以高级程序员会考虑平台移植、将常用程序做成机器码以加快运算等操作。
图14是一个高级程序语言变成机器语言,然后被执行的过程。
在高级语言里加法可能是:
f = (g+h) –(i+j)
这是通俗易懂,容易学习的。
经过编译转换成“汇编语言”就是:
add $t0,$s1,$s2
add $t1,$s3,$4
sub $s0,$t0,$t1
等等!!有朋友问:$s1,$s2,$s3,$s4,$t1,$t2这些是什么?
嗯,是内存里的寄存器编码。你使用高级语言就不需要了解那么多了,这就是高级语言高效之处。内部的事情机器帮你优化分配好了。
是不是有点晕了?等等!再坚持一下!马上就到最终的0101010101什么的了。这是本篇文章想揭示的终极奥秘!
当然前面的“$s1,$s2,$s3,$s4,$t1,$t2”都只是代码,它是计算机芯片附带的软件告诉你有这些寄存器可以拿来用。但是其实它对应的是:0101这样的编码。
拿“add $t0,$s1,$s2”为例
它变成对应的机器编码是:
是说,做编号为’0’的操作,第一个操作数在第‘18’号寄存器内取数,第二个操作数在第‘19’号寄存器内取数,把结果送到第‘8’号寄存器。
进一步变成二进制:
好了,机器看到它的就是
“00000010010100110100000000100000”
数一数,32位。这就是大家熟悉的32位处理器。响应的寄存器的位数也是32位,可以表达的数值就可以从 -2^31~2^31。(小编记得因为补码什么的原因幅度好像多一位少一位。但是不要在意那么多细节了)。
朋友问为什么操作码的000000是加法啊?是因为设计芯片的人乐意。它也可以设计成减法。所以想定义底层架构吗?要不加入starblaze, 是加是减你说了算!
这里再说下功能码。这里有6位,就可以定义2^6个状态。比如我拿一位做是否是有效数据。0代表无效,1代表有效。所以当你擦除数据的时候只是改变了这个状态位,并没有把数据位一一修改。因为这样节约了31次操作。如果数据很大的话便节约了很大的开销。你也可以明白为什么拷贝比删除要花多得多的时间了:因为拷贝真真切切要把数据搬过来,删除可能只是把状态位切换了下。而且有些状态位代表一大批的数据。这也是为什么数据公司可以轻易恢复你删除的数据,因为在底层只是做了状态位切换的操作。
至于这些机器码怎么执行的。小编把图贴了自己看吧。这个就有点复杂了,涉及到CPU基本的操作行为。篇幅有限就不再展开聊了。图15,某几步的流水线操作。
图15,某几步的流水线操作。
所以,IC世界真的并不神秘。在MOS管的物理载体以下是力热声光电的物理承载,以上,它本质是数学。