一生一心学习记录:一些个人思考。

学一生一心的时候我出现了这样的疑问,我试着给出回答。

  1. 程序是如何运行的

  2. 处理器是如何设计的

  3. RTL代码是如何变成可流片版图的

这三个问题分别对应了计算机系统的三个不同抽象层次:软件层、硬件架构层和物理实现层。

1. 程序是如何运行的

以C语言为例子,你写完一个.c文件后。
编译与链接:经过编译之后成为汇编代码,然后汇编器会将汇编指令翻译成二进制的机器码,并生成可执行文件(.o)。随后要经过链接器将多个目标文件以及库文件合并成一个完整的可执行文件(ELF格式),并解决函数和变量的地址问题。

加载:当你运行程序的时候,操作系统中的加载器会将可执行文件的代码段和数据段加载到物理内存中,并设置CPU的程序计数器指向程序的入口地址。

执行: CPU开始疯狂执行指令,处理器将不断重复这五条指令一直到完成全部功能。

  1. 取指:从内存中读取指令。
  2. 译码:解析指令,判断操作类型和操作数,可以产生一些控制信号来对后面的执行产生作用。
  3. 执行:在ALU中完成计算。
  4. 访存:根据需要访问数据存储器。
  5. 回写:将结果写回寄存器

程序的运行体现了软硬件的协同,编译器生成的指令序列必须余处理器设计的流水线、寄存器组、指令集架构相互配合。

2.处理器是如何设计的

处理器设计是一个从抽象到具体、从行为到结构的过程,他需要完成"取指、译码、执行、访存、回写"的执行流程。

规定指令集架构

规定了

指令格式:指令是如何编码的,哪里是操作码、寄存器字段、立即数字段。

寄存器集:有多少个寄存器?每个多少位?

寻址模式:如何访问内存?

特权级别:机器模式、监督模式、用户模式等。

微架构设计

到了硬件设计范畴了,核心设计包括了

数据通路:数据在处理器中如何流转的。

控制通路:根据当前执行的指令,产生控制数据通路工作的所有控制信号(如寄存器写使能、ALU操作选择、多路选择器选择等)。它通常是一个复杂的状态机。

流水线设计:将指令执行划分为多个阶段,让多条指令重叠执行,提高吞吐率和CPI。

冒险处理:解决流水线带来的数据冒险(后面的指令需要前面指令的结构)和控制冒险(遇到分支跳转)问题。常用前递、流水线停顿、分支预测等技术解决。

RTL实现

使用硬件描述语言将微架构设计描述出来。

处理器是如何设计的体现了软硬件的协同,微架构的设计直接决定了处理器的性能和功耗,而这需要根据目标软件的负载的特征来进行优化。

3.RTL代码是如何变成可流片版图

这一步将逻辑设计转化为物理实现,由EDA工具实现。

功能验证

搭建测试平台,用仿真器模拟电路在输入激励下的行为,通过波形输出或者debug工具测试芯片是否按照我们期望工作。

逻辑综合

通过综合工具将RTL描述的行为映射到标准单元库中的门级,并优化逻辑以满足时序和面积约束,将RTL代码转换为门级网表。

物理设计

布局:确定芯片上单元的具体位置。

时钟树综合:构建一个网络,将时钟信号低偏差地送到所有需要时钟的寄存器。

布线:根据网表,在单元之间连接金属线。

时序验证与收敛:时序分析。

物理验证:检查版图是否符合设计规则和电气规则。

流片

最终将所有版图的数据转换为GDSⅡ的格式。

你需要在不同抽象层级之间穿梭,既要知道编译器如何生成代码,也要清楚每一条指令在硬件上的开销,最终做出全局最优的设计决策。