引言

本次课内容:

  • 一生一芯 v24.07
  • “芯片设计”包含什么?
  • 为什么学一生一芯?
  • 怎么学一生一芯?

一生一芯 v24.07

自我介绍

老博士, 但参与教学的时间比读研究生还长(一些) 😂

  • 大二蹭了jyy老师的OS实验课, 学会了RTFM/RTFSC
  • 大三大四带了两年的OS实验课
  • 本科毕业的暑假, 袁春风老师推动《计算机系统基础》的教学改革
    • 给课程设计大实验, 于是有了PA和NEMU
  • 2017年, jyy提出AM, 第一版Project-N系列计算机系统实验正式诞生
    • 作为co-founder之一参与维护
  • 2019年, 包老师发起第一期一生一芯
    • 作为技术指导带学生, Project-N作为基础设施发挥重要作用

 

博士方向研究指令集模拟器和二进制翻译

  • 卷不过各位大佬, 所以跑来折磨大家了 😈

一生一芯资源

  • 一生一芯项目主页 - ysyx.oscc.cc
    • 包含一生一芯的所有内容, 若有任何疑问, 请到项目主页上查找

 

  • 课程主页 - ysyx.oscc.cc/docs/
    • 包含课件, 讲义, 直播和录播链接等
    • 如果想将课件保存为PDF, 可参考课程主页中的说明

 

 

  • 前导课 - 无
    • 有C语言和数字电路基础会更好; 若无, 可参考预学习阶段提供的材料

线下课程

  • 微处理器设计(2025秋)@深圳理工大学(余子濠, 解壁伟)
    • 每周四8:30~10:55, 16周 (下周开始教室换到天权2-146)

 

  • 作业1 - 按讲义内容完成一生一芯
    • 时间自由分配, 只需完成至D阶段, 达成D阶段流片指标可获附加分
  • 作业2 - 实践报告(主题待定)

 

  • 建个微信群
    • 可能会安排一些学术报告, 关注群里的通知
  • 课堂不点名
    • 建议不来, 看B站直播或录播(录播可以回退, 调倍速)
      • 如果想答疑交流, 可以在大课间过来(9:55~10:15)
    • 动手做实验才是最重要的

课程主页和直播

 

  • B站直播时间: 每周四8:30~10:55(和线下课程时间同步, 没法🕊了)
    • 约16周, 每周2.5小时(去除课间休息, 课堂部分只有2小时)
    • 会上传录播, 尽量保证不翻车
      • 有时上传的录播还不是一次完整的课程内容, 需要和下周的录播拼在一起重新上传

 

  • 线下课程不一定能覆盖一生一芯的所有内容
    • 线下课程结束后, 会换个时间直播, 届时可关注课程主页或B站动态

 

  • 当然不要指望有手把手的教学
    • 不过就算不来上课, 只要独立完成学习, 就能变强

v24.07教学特色 - 处理器设计前后端全链条

和业界现有的流程非常类似, 只不过使用开源组件

v24.07教学特色 - 计算机软硬件协同系统能力

程序, 操作系统, 运行时环境, 指令集, 处理器, SoC, 板卡

 

 

FCEUX

RT-Thread

AM

RISC-V

NPC

ysyxSoC

NVBoard

v24.07教学特色 - 循序渐进的教学方案

  • 用3条自定义指令的CPU计算1+2+...+10
  • 用8条RISC-V指令的CPU运行超级玛丽

环境, 开发语言和工具依赖

  • 软件配置 - Linux环境
    • 软件开发(模拟器, 系统软件, 应用程序)
      • C语言, 很少量的C++(类的基本使用) - gcc编译器
    • 硬件开发
      • Verilog或Chisel - 开源verilator仿真器 + 开源gtkwave波形查看器
    • 后端物理设计 – 商业EDA, 主要由工程师或线下实习生完成
      • 即将把开源EDA融入教学流程
  • 硬件配置 - 笔记本电脑就能做, 无需FPGA
    • FPGA与ASIC流片原理不同, ASIC EDA工具评估的结果更准确
      • 已加入yosys综合器
    • FPGA主要用于仿真加速, 一般用于复杂设计(如香山)
      • 对于简单设计和短时间仿真, 软件仿真+yosys综合通常可满足要求

初识处理器芯片

各种芯片

芯片有几十种大门类, 上千种小门类

  • 驱动芯片, 射频芯片, 电源管理芯片, 传感器芯片, 存储芯片…

处理器芯片 - 芯片产业皇冠上的明珠

在众多芯片中, 处理器芯片设计复杂度高, 难度大

  • 中央处理器 CPU

  • AI处理器 NPU

  • 图形处理器 GPU

 

处理器芯片和其他芯片的最大区别 - 光靠自己无法工作, 需要运行程序

  • 程序(软件) + 处理器(硬件) = 计算机
  • 程序和具体应用场景有关
  • 要设计一颗能在各种场景下都能运行得好的处理器芯片, 是个挑战

一颗处理器芯片的内部 - Motorola 68030

为了提升程序运行的性能, 处理器芯片中通常包含很多模块, 背后承载着各种技术

芯片? 故宫!

给处理器芯片 “画图纸”的工作, 称为架构设计(architecture design)

芯片发展史

处理器芯片的前世

第一台通用电子计算机ENIAC(1945), 用于计算数值积分

ENIAC的主要元件 - 电子管

电子管 = 开关 = 0/1(二进制表示)

电子管的连接方式反映了二进制信息如何被传递和处理, 从而在整体上实现数值积分的功能

从晶体管到芯片

  • 1947年, 科学家发明了晶体管
    • 作为电路元件, 在体积, 功耗, 可靠性上都优于电子管

 

  • 集成电路 = 将若干元件连接起来, 然后集成在一起的电路
    • 例如, 用面包板搭建集成电路

 

  • 芯片 = 用半导体工艺将集成电路微缩到硅片上

 

摩尔定律

  • 集成电路上晶体管数, 每隔约18个月增加一倍, 性能也提升一倍
    • Gordon Moore, 1965

 

集成电路的发展

  • 小规模集成电路(Small Scale Integration, SSI)
    • 芯片包含数十个晶体管
      • 几个逻辑门(与门, 或门…)
    • 不同芯片之间通过导线连接
    • 早期用于完成较简单的应用, 如与运算, 或运算

 

  • 中规模集成电路(MSI)
    • 芯片包含10~1000个晶体管
      • 30~300个逻辑门
    • 功能包括加法器, 计数器, 寄存器等
    • 成本比SSI低, 且可在更小的电路板上搭建更复杂的系统

集成电路的发展(2)

  • 大规模集成电路(LSI)
    • 芯片包含数千个晶体管
      • 任天堂红白机采用的6502 CPU芯片(8位, 1970s)有4528个晶体管
    • 功能更复杂, 更专用, 如小型微处理器, 存储器等

 

  • 芯片复杂度增加, 无法靠纯手工设计并检查
  • 出现了一批辅助工程师设计电路的计算机程序, 称为CAD(Computer Aided Design)工具
    • EDA工具的前身

从芯片到晶体管

  • 6502 CPU
  • 溢出检测电路
  • 电路的晶体管结构
  • 电路的晶体示意图
  • 门电路逻辑图

集成电路的发展(3)

  • 设计过程分化成前端+后端
    • 前端 = 用HDL语言设计电路逻辑, 进行仿真验证
    • 后端 = 使用EDA工具自动进行物理设计
  • 现代处理器设计中的前端和后端流程

用现代芯片技术实现ENIAC

  • 大小: 房间 -> 硬币
    • 见证了50年间芯片技术的发展

现代处理器设计流程

启发

有很多新的概念?

  • 不用担心, 学习完一生一芯之后, 你将有能力理解它们

 

更重要的两个观念:

  1. 处理器需要软件的支持才能发挥作用
  • 真正的处理器芯片设计: 计算机系统软硬件协同设计
    • 一生一芯讨论的范畴
  1. 复杂系统是迭代演进的
  • 电路: 晶体管->SSI->MSI->LSI->VLSI
  • 处理器架构: 多周期->流水线->超标量->乱序执行
  • 做事规律 - 从易到难, 逐步推进
  • 推荐阅读: 《系统设计黄金法则:简单之美》, 包云岗
    • KISS法则 - Keep It Simple, Stupid

为什么学一生一芯?

你也许设计过处理器, 但不一定能回答以下问题

always @(posedge clk) begin
  case (raddr[1:0])
    2’b00: rdata <= reg0[31:0];
    2’b01: rdata <= reg1[31:0];
    2’b10: rdata <= reg2[31:0];
    2’b11: rdata <= reg3[31:0];
  endcase
end

 

  1. 上述RTL代码实现了若干设备寄存器供CPU访问, 它有问题吗?
  2. 如何编写一个打印Hello的C程序放到你的CPU上运行?
    • 第三期一生一芯答辩, 80%的学生不知道
  3. 你写的流水线CPU具体在哪里地方比单周期CPU快多少?
  4. CPU仿真过了100000000周期后出错, 如何快速调试?

处理器芯片设计离不开软件

  1. 处理器离开了软件就无法工作
    • 要评估一个处理器, 就是看软件在这个处理器上运行得对不对(功能), 运行得好不好(性能)
  2. 要完成设计流程中的步骤, 就需要各种工具和基础设施的支撑
    • 尤其是那些与处理器功能紧密相关的工具
    • 如指令集模拟器, 功能模拟器, 差分测试方法等
  3. HDL代码作为代码, 也是一种软件对象
    • 虽然描述的对象是硬件
    • 既然是代码, 就需要使用合适的软件技术对其进行管理, 维护, 测试, 评估和优化

 

  • 处理器设计 != RTL编码
    • 逻辑设计只是处理器设计中的其中一个环节

学习一生一芯的目的(1) - 重新认识处理器芯片设计

  • 架构设计: 给定一个新特性, 如何给出一个设计方案, 将其分解成合适的硬件模块来实现它?
    • 可能是添加新指令, 也可能是性能优化
  • 逻辑设计: 有了设计方案, 如何通过HDL在电路层次将设计方案中的硬件模块实现出来?
  • 功能验证: 如何验证HDL所描述的电路满足新特性所期望的功能?
  • 性能验证: 如何保证处理器的性能符合预期?
  • 电路评估: 如何评估并优化处理器的频率, 面积和功耗等指标?
  • 物理设计: 如何将HDL代码转变成可流片的版图?
  • 性能优化: 如何发现并定位处理器中性能瓶颈, 并设计出相应优化方案?

 

  • 处理器设计 != RTL编码
    • 逻辑设计只是处理器设计中的其中一个环节

学习一生一芯的目的(2) - 培养大家成为专业人士

一生一芯将引导大家用全新的方法和科学的现代处理器设计流程, 按计算机发展史的顺序(不同的学习阶段)设计处理器

  • 树立全面的软硬件全系统认识
  • 理解科学的安排规划和优化方法
  • 掌握正确的工具技能高效解决实际的工程问题

 

通过我们设置的训练让你变强

  • 全方位, 全身心, 肉眼可见地变强
  • 锻炼专业人士所需的专业素质

熟练工 vs. 专业人士

老板分配任务 熟练工 专业人士
跑RT-Thread 软件跟我没关系 出了bug我能调对
尝试新工具 我没接触过 我来看手册
改进工具 工具会用不就行吗 我来分析瓶颈
实现新需求 我需要详细设计文档 我规划一下

 

熟练工: 可以很好地完成指定任务, 保证项目流程往前推进

专业人士: 具备独立解决未知问题的专业素质

  • 专业技能: 正确理解专业知识点, 并具备全局系统观
  • 专业方法: 知道如何找到相关的代码/资料/工具
  • 专业世界观: 明白做什么事情是正确/高效/科学的, 如何分解复杂任务

专业训练

基本原理 做事方案 正确性风险 代表例子
阐述 明确 基本正确 高中物理实验
阐述 明确 可能出错 程序设计作业, 培训班
阐述 需要思考 基本正确 数学/算法题
阐述 需要思考 可能出错 PA, 一生一芯
需要探索 需要思考 可能出错 业界和科研的真实问题

把知识包装成 “新问题”呈现给大家

  • 通过试错深入理解问题:
    • 我想要x, 那么就需要做y, 这是因为z
    • 而做u是不行的, 它会因为v而导致w
  • 解决上百个 “新问题”, 锻炼出专业世界观

我当年做的处理器设计实验(2012年)

实验课老师没有正经的处理器设计经验

  • 过分强调信号层次的电路图, 做实验就是看图写代码
    • 谭浩强: 写C代码之前要画流程图
  • 忽悠学生设计自定义指令集, 连微结构是什么都不理解
  • 把指令数量作为处理器复杂度唯一指标, 不知道中断异常如何处理
  • 没有任何后端概念, 对HDL代码如何映射到工艺原语完全没有认识
  • 调试全靠波形和瞪眼调试法, 说是锻炼耐心
  • 没有任何软件和工具链的意识
    • 连Hello程序都跑不起来, 更别说像样的程序

 

据说这个实验曾经是计算机系最难的实验 😂

  • 做这样的实验, 怎么解决国家卡脖子危机?

一生一芯(或者好课)的真正意义

树立正确的专业世界观, 吸收过去数十年构建的知识体系, 接触领域前沿的真正研究

这期的S阶段又要🕊了, 但不管怎样:

如果你的回答是肯定的, 那就来参加一生一芯

怎么学一生一芯?

真正的处理器是一个复杂的系统

  • 教科书上的处理器
    • 6条指令(MIPS)
  • 课程大作业的处理器
    • ~40条指令
  • 一生一芯中的处理器
    • 果壳 = ~100条指令+流水线+中断异常+cache+MMU+AXI总线
  • 科研原型系统的高性能处理器
  • 量产的工业级高性能处理器
    • M1 = ARMv8指令集+8译码+17个FU+~630项ROB+黑科技+…

仅仅会看波形是不够的

如果在你设计的处理器上

  • 跑超级玛丽, 100,000周期后assert失败
  • 跑仙剑, 10,000,000周期后图形不正确
  • 启动Linux Debian跑gcc, 1,000,000,000周期后段错误

 

你愿意从1,000,000,000个周期的波形中寻找错误的信号吗?

  • 就算你愿意, 波形文件也已经大得磁盘存不下了 😂

 

教科书/大作业并不会教你如何应对这些问题

  • 做小玩具, 方法再简陋, 也能做出来

复杂系统需要用科学的方法来构建和维护

  1. 了解软硬件全系统的每一处细节, 为调bug提供大方向
  2. 先完成后完美, 体会每一项技术对系统带来的性能提升
  3. 构建正确的工具, 提升开发和验证效率

 

2012年一篇总结七大互联网公司经验教训的博文

(对应2) Keep it simple - complexity will come naturally over time.
(对应3) Automate everything, including failure recovery.
(对应2) Iterate your solutions - be prepared to throw away a working component when
  you want to scale it up to the next level.
(对应3) Use the right tool for the job, but don't be afraid to roll your own
  solution.
(对应1) Use caching, where appropriate.
(对应1) Know when to favor data consistency over data availability, and vice versa.

 

这些做事的观念和方法, 就是工业界所需要的

  • 就算以后你不从事芯片方向的工作, 也可以从中受益

一生一芯对绝大部分同学来说并不轻松

不仅需要学习很多新知识, 在新环境中使用新工具

还需要锻炼出独立解决问题的意识和能力

 

更重要的是, 完成观念和心态上的转变

  • 一生一芯不是传统意义上的课程大作业
    • 课堂和讲义不会告诉你所有细节
    • 你需要主动从相关资料/代码中找到重要的信息
  • 你遇到的所有问题(除了框架代码自身错误), 都是在锻炼你的能力
    • 老师助教不会手把手帮你解决所有问题
    • 独立解决这些问题, 是对你最大的训练

 

如果你只是想轻松愉快地写RTL, 网上已经有很多教程和MOOC

能否完成一生一芯与学校/年级/专业无直接关系

取决于你是否已转变观念和心态, 锻炼出独立解决问题的意识和能力

王晨宇@南通大学, 学习时大二(转专业), 获得第四期流片资格

烟雨松@北京101中学, 学习时高三, 已流片并成功点亮

 

另一个角度: 大家都有潜力完成一生一芯的学习

  • 拿 “自己是xxx专业/零基础”来当借口是没有用的
    • 这除了让你降低对自己的要求之外, 没有实际的帮助
    • 还不如想想是不是自己哪里没做好, 导致接受的训练没到位

专业世界观1 - 学术诚信

MIT对学术诚信的诠释, 尤其是关于写代码的学术诚信

  • 独立完成学习任务
  • 在允许的范围内参考相关资料
  • 不参考别人的代码, 不分享自己的代码

意义: 让你接受预期的训练, 锻炼出预期的能力

这是需要大家发自内心去认可和执行的: 我们很难约束大家

 

“凭什么不能参考别人的代码? 我都看懂了啊!”/“能抄对也是本事”

  • “看懂”和 “自己独立完成”的效果是天差地别的
    • 你表面上看到了做y能得到x, 但不知道原因z, 更不知道试错的uvw
    • 你收获了肤浅的理解, 让你重做一遍, 很可能还是搞不定

专业世界观2 - 独立尝试

STFW - Search The Friendly Web

  • 只要我用的工具是大众的, 我几乎不可能是世界上第一个遇到问题的
  • 网上一定有人遇到过相同/类似问题, 我应该搜一下看看他们怎么解决

RTFM - Read The Friendly Manual

  • 只要我用的工具是大众的, 应该有手册记录这个工具的所有细节
  • 如果我想了解它的某个问题, 我应该去搜索手册的描述

RTFSC - Read The Friendly Source Code

  • 只要我获得了项目代码, 理论上我就可以知晓它的一切行为
  • 如果我想了解它具体是如何工作的, 我应该去读一下(关键)代码

 

如果你在提问时收到了这些回复, 其背后的含义是:

  1. 你想要的答案很容易找到, 你很应该自己去获取
  2. 相比于我直接告诉你答案, 你自己获取答案能学到更多

STFW/RTFM/RTFSC背后的理论 - 知识局部性

  • 时间局部性 - 你遇到一个知识点时, 最近很可能还会遇到它
  • 空间局部性 - 你学习一个知识点时, 也会了解到附近的知识点

 

但更重要的是它们的逆否命题在调bug中的应用

  • 时间局部性 - 当你不了解一个知识点时, 说明你最近没有学习它
    • 没有STFW/RTFM/RTFSC
  • 空间局部性 - 当你不了解一个知识点时, 说明你也没有学习与它相关的内容

 

正确理解 “相比于我直接告诉你答案, 你自己获取答案能学到更多

  • add指令的格式是什么? -> 很可能连sub指令的格式也不知道
    • 别人通常无法把相关知识点全部告诉你
    • RTFM可以解决更多的疑问

专业世界观3 - 科学提问

提问的智慧》/《别像弱智一样提问

  • 提问能反映出你的学习态度: 主动尝试 vs. 被动依赖

不是所有问题都值得问

  • 你以为自己热爱学习? 不, 别人只觉得你是伸手党

开源社区中的一个真实案例:

  • 新手的提问: 两个不同的安装包有什么区别? 我是新手.
  • 开发者的回答: 自己上网找答案. 在开源社区中不应该随便问这种配置问题, 除非你有明确的证据证明代码或者文档有缺陷.

鼓励的提问 vs. 不应该的提问

  • 鼓励的提问
    • 心理辅导, 学习困惑等非具体技术问题
      • 可以私戳老师助教, 时间充裕的话还可以线上聊聊
    • bug report: 要有证据, 当一名专业的社区contributor
    • 经过思考的高质量问题
    • 属于训练环节, 但经历过合理尝试还无法解决的问题: 提问模板
  • 不应该的提问 (背后含义: 你应该接受训练)
    • 没有看出合理尝试和思考的提问
      • 可以不知道怎么尝试和思考, 但不代表可以跳过训练获得答案
      • 接受训练: 方法 -> 看讲义总结归纳, 细节 -> RTFM/RTFSC
    • 自己动手试试就能得到答案的提问

 

一篇参考文章: 什么样的问题我不太想回答?

虚假的帮助 vs. 真实的帮助

虚假的帮助: 面向结果, 解决当下问题优先

真实的帮助: 面向能力, 领悟学习方法优先

本质区别: 如果将来不再提供帮助, 学生能否独立解决类似的问题?

真实案例: 学生A询问某报错信息

  • 分析: 根据提问内容, 学生A只进行了很少的尝试, 没有其他想法
  • 虚假的帮助: 学生B指出可能是klib模块有bug, 提示学生A去看看
    • 学生A的收获是 “报错信息->klib模块有bug”的表面因果关系, 难以深入理解和记忆, 并未学会真正思路和方法, 同时也错过一次锻炼机会
  • 真实的帮助: 引导学生A学会对bug进行深入的分析和定位
    • 这比虚假的帮助困难得多, 大部分学生并不知道如何引导

任何直接获得答案的做法都是在放弃训练的机会

  • 遇到一个总线的bug, 希望同学提供点思路
    • 正确做法: RTFM(AXI手册), 确认自己正确理解细节; RTFSC, 梳理这个bug是如何出现的
  • 不知道CSR应该放在哪里, 希望助教告知一个好的设计方案
    • 正确做法: 自己尝试不同的方案, 然后总结它们的优劣
  • 希望助教/大佬能整理一本攻略手册
    • 正确做法: 自己整理(作为学习成果), 但不要分享出去
      • 这些攻略并不能真正帮助你学习, 而是在剥夺你接受训练的机会
  • 阅读开源项目(如果壳, 香山等)
    • 正确做法: 先尽力完成一个满意的设计, 再对比开源项目
      • 缺少试错, 你无法理解 “为什么好, 为什么不好”

 

躺平容易坚持难, 但如果你能坚持下来, 你就可以得到脱胎换骨的提升

我们也知道大家不爱听这些大道理

这些做法和大家在课堂上接受的观念差别很大, 甚至是矛盾的

  • 我不是学计算机的, 这些跟我没关系
  • 我不懂还不能问吗

 

大家也处于血气方刚的年纪, 有自己的想法

  • 让我STFW/RTFM, 明摆着是敷衍我
  • 我借鉴开源代码是顺应时代的潮流

 

为躺平找理由也很容易

  • 我喜欢和大家共同学习
  • 我看英文手册很慢, 想找个大佬给我讲讲
  • 反正助教老师也管不着

所以

我们来玩真的: 在线调试考核, 通过才能获得流片机会

  • 助教在你提交的项目中随机注入3个bug 😈
    • 涵盖硬件, 软件和环境
  • 你需要在指定时间内(约45分钟)排除bug 😈
    • 强迫大家理解所有细节, 吸收科学的调试方法
      • 参考代码, 抱大腿, “看波形就够”都没戏 😈
    • 抓紧每一次调试锻炼的机会
      • 突击是没用的, 考的就是真本事 😈
      • 抱一次大腿 = 少一次训练

 

这和大家将来遇到的实际问题非常接近

  • 如果你能解决实际问题, 你就是专家

总结

总结

一生一芯不仅仅是训练大家编写RTL

  • 而是用全新的方法和科学的现代处理器设计流程, 按计算机发展史的顺序(不同的学习阶段)设计处理器
    • 树立全面的软硬件全系统认识
    • 理解科学的安排规划和优化方法
    • 掌握正确的工具技能解决实际的工程问题

 

大部分同学并不会感到舒适

  • 但如果能坚持下来, 你就可以得到脱胎换骨的提升