ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从RTL到样片点亮:一颗自研SoC芯片的完整设计与启动流程

从RTL到样片点亮:一颗自研SoC芯片的完整设计与启动流程 在嵌入式开发中经常听人感叹硬件虽难但没有一颗真正属于自己芯片更难。很多工程师都有过“造一颗芯片”的念头但真正经历过芯片前端、后端、测试和嵌入式适配的人并不多。本文就以“我们造了一颗芯片而且它很快”作为引子从芯片设计的全流程视角拆解一颗芯片从需求到样片点亮的核心知识并重点分享在拿到新芯片时如何快速让它跑起来。这篇文章适合三类读者第一类是芯片设计初学者想了解 RTL、后端、测试到底在做什么第二类是嵌入式软件工程师希望理解芯片启动、BSP 和调试过程第三类是硬件工程师想弄明白一颗自研 SoC 从无到有要经历哪些环节。读完本文你会对“造芯片”这件事建立起一个完整的全局视图同时也能直接参考文中的代码和流程在真实项目中少踩一些坑。说明一下本文不是某家芯片公司的流片新闻也不是生产过程的报告而是一份偏工程视角的“造芯地图”。文中涉及到具体工具链时版本差异可能很大请以你的实际环境为准。1. 背景与核心概念1.1 芯片为什么值得自己造一颗在嵌入式开发圈子里很多人会有一个执念不只是用芯片而是“造一颗芯片”。这听起来像是芯片原厂的专利但随着开源指令集和 MPW多项目晶圆服务的普及小团队甚至个人也已经有机会接触芯片前端设计、后端实现和样片测试。本文不讨论晶圆厂如何生产而是聚焦在工程师视角当我们说“我们造了一颗芯片而且它很快”这句话到底意味着什么“快”可以指主频高也可以指从项目启动到点亮的时间短。事实上对于大多数嵌入式项目造一颗芯片的目的不是为了“炫技”而是为了在功耗、成本、集成度上获得更优的平衡。要理解芯片开发先要分清几个概念。芯片Chip是一个统称我们经常听到的 SoC、MCU、MPU 其实属于不同的芯片类型。SoCSystem on Chip系统级芯片把 CPU、GPU、内存控制器、外设接口、DSP 等很多模块集成在一个硅片上。MCUMicrocontroller Unit微控制器通常集成度更高但性能更低常用于家电、物联网设备。MPUMicroprocessor Unit微处理器则偏向通用计算。对于端侧 AI、边缘计算我们常常选择 SoC例如瑞芯微 RK3588 就是一款被广泛使用的八核 SoC它同时集成了高性能 CPU、GPU 和 NPU适合做智能终端、边缘服务器等场景。如果我们的目标是做一颗端侧 AI SoC核心诉求往往是“足够快”AI 推理要快启动要快外设响应也要快。1.2 一颗芯片从无到有的完整链路在芯片公司一颗芯片的开发通常经过需求定义、架构设计、RTL 编写、前端验证、逻辑综合、DFT 设计、后端物理实现、流片、晶圆测试、封装、样片测试、软件开发等阶段。这里有几个关键词值得展开SoC 启动芯片上电后首先执行片内 BootROM 里的固件然后根据启动模式选择从 SPI Flash、SD 卡或 USB 加载 Bootloader最终引导操作系统或裸机程序。启动方案的优劣直接影响整机部署体验。芯片后端RTL 是逻辑层面的描述真正要把逻辑变成物理设计需要经过逻辑综合、布局布线、时钟树综合、签核验证。后端设计决定了芯片最高能跑多快、功耗多大。芯片测试流片回来的晶圆是不保证一定能工作的需要利用 ATE自动化测试设备扫描测试引脚、测试逻辑、内存还要通过边界扫描JTAG做板级调试。这些环节在传统教科书里往往被分开讨论但真正的工程实践需要把它们串起来。下面我将按一个实际项目的推进顺序把每个阶段的关键技术和踩坑点讲清楚。如果你只是嵌入式软件工程师也可以借此明白你写的代码在芯片内部经历了什么。2. 环境准备与版本说明2.1 芯片前端的开发环境芯片前端设计依赖各种 EDA 工具。这里不指定具体版本因为不同公司使用的工具版本差异很大而且升级频繁。一般来说前端开发需要Linux 工作站推荐 64 位系统内存 32GB 以上Verilog / SystemVerilog 仿真工具常见的有 VCS、NCSim、Xcelium波形查看工具常见的有 Verdi、DVERTL 综合工具如 Design CompilerDC、Genus后端工具如 Innovus、ICC2。这些工具基本都是商业软件个人学习可以使用开源工具链比如 Icarus Verilogiverilog GTKWave 做轻量级仿真调试Verilator 做高性能 Verilog 仿真Yosys 做逻辑综合OpenROAD 做开源物理设计流程。需要注意的是这些开源工具的功能完备性和成熟度与商业工具还有差距。在实际项目中大家仍会以商业工具为主开源工具更适合学习、验证想法和低成本原型开发。如果你的电脑配置不够高也可以去云上租用高性能服务器EDA 类任务对 CPU 主频和内存带宽比较敏感。2.2 嵌入式开发与调试环境当芯片样片或 FPGA 原型回来之后我们就要进入嵌入式开发阶段。此时需要准备操作系统Windows Keil MDK或者 Linux GCC 交叉编译工具链交叉编译器针对 Arm Cortex-A/Cortex-M 可以使用 arm-none-eabi-gcc 或 arm-linux-gnueabihf-gcc针对 RISC-V 可以使用 riscv64-unknown-elf-gcc硬件调试器J-Link、ST-Link、OpenOCD 支持的调试器串口工具minicom、PuTTY、SecureCRT逻辑分析仪和示波器用于实际波形调试。以 Keil 为例很多从事 MCU 开发的朋友会从官网下载对应芯片的芯片包Device Pack。下载后在 Keil 中安装就能在 Device 列表中选择对应型号。如果芯片包下载失败多半是网络或版本不匹配问题。对于自研芯片芯片原厂通常会把 SVD 文件、Flash 算法和启动文件一起放到 Pack 中方便用户创建工程。我们在调试自研 SoC 时也参考了类似流程先在 Keil 里建立最小工程用 J-Link 通过 JTAG/SWD 接口烧录。注意本文示例中的工具版本需要根据你的实际环境调整。下面演示的重点是流程和思路而不是某个固定版本的操作步骤。3. 核心环节拆解从 RTL 到启动3.1 SoC 启动流程设计“芯片很快”的前提是能稳定启动。自研 SoC 的启动流程与商用 SoC 大同小异。一般分为三个阶段BootROM芯片上电后CPU 从固定地址执行芯片内固化的 BootROM它是一段只读代码负责初始化最基础的时钟、存储器和启动介质。引导程序BootROM 根据启动引脚例如 SPI Flash/SD/USB加载二级引导程序比如 U-Boot。这一步会把 DDR 等大内存初始化好。主程序在嵌入式系统里二级引导程序最后跳转到裸机程序、RTOS 或 Linux Kernel。在设计自研 AI SoC 时BootROM 放在芯片内二级引导放在外部 SPI NOR Flash这样既保证启动速度又降低成本。实际调试中最先遇到的问题往往是 BootROM 里对外部 Flash 控制器初始化有 bug导致无法读取任何指令。这个问题在仿真阶段并不容易发现因为它依赖真实的 Flash 时序。所以在芯片验证阶段一定要为关键外设准备好真实的接口模型比如 Flash 的 Verilog 模型或者提前在 FPGA 上做原型验证。比如 Flash 控制器是自研 IP它的读时序可能和型号不匹配。很多 SoC 启动失败并不是 CPU 不工作而是 CPU 读不到合法指令。排查时可以用逻辑分析仪抓取 Flash 的片选、时钟和数据线看看 BootROM 是否产生了读请求。如果数据线一直为高阻说明 Flash 控制器没有正确初始化 IO。这种问题在真实芯片上会消耗大量时间因此仿真时就必须提前覆盖。3.2 RTL 设计与仿真以一个分频器为例芯片逻辑设计的起点是 RTL寄存器传输级代码。我们经常用 Verilog 或 SystemVerilog 来写。下面给出一个最简单的时钟分频器模块它是很多芯片内部模块的雏形。// 文件路径rtl/clk_div.v module clk_div ( input wire clk, input wire rst_n, output reg clk_out ); reg [7:0] cnt; always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 8d0; clk_out 1b0; end else begin if (cnt 8d99) begin cnt 8d0; clk_out ~clk_out; end else begin cnt cnt 1b1; end end end endmodule这段代码的作用是将输入时钟每 100 个周期翻转一次相当于 200 分频。写完之后不能直接拿去流片必须先做功能仿真。下面是仿真测试平台testbench的简单写法// 文件路径tb/clk_div_tb.v timescale 1ns / 1ps module clk_div_tb; reg clk; reg rst_n; wire clk_out; clk_div u_clk_div ( .clk (clk), .rst_n (rst_n), .clk_out(clk_out) ); initial begin clk 0; rst_n 0; #100; rst_n 1; #2000; $finish; end always #10 clk ~clk; endmodule在仿真工具中编译这两个文件后你会看到 clk_out 在复位结束后按预期翻转。如果你使用 Icarus Verilog可以执行iverilog -o clk_div_tb clk_div.v clk_div_tb.v vvp clk_div_tb仿真通过只是第一步。真实的芯片设计还需要考虑时序约束、DFT、低功耗设计等。对于一款 IP 较简单的 SoC前端验证会占整个芯片开发周期的一半以上这是造芯真正耗时的地方。验证工程师需要构建一个包含 CPU 核、总线、外设的完备环境把各种异步事件组合起来跑才有可能在流片前发现隐患。3.3 芯片后端决定“快”的物理层面当 RTL 和验证都完成之后数字设计会进入后端实现阶段。芯片后端是一个广义概念包括逻辑综合、物理设计、时序签核、功耗分析、信号完整性分析等环节。简单来说后端把 RTL 变成一堆标准单元、MOS 管和金属连线并保证它们在目标工艺下的时序满足要求。“我们造了一颗芯片而且它很快”这句话很大程度由后端的时序收敛决定。如果关键路径上的组合逻辑级数太长或者布局布线不够紧凑芯片的主频就无法上去。主频上不去的直接表现就是“跑不快”。在时序分析中我们需要关注 setup time建立时间和 hold time保持时间通过约束文件SDC告诉工具时钟频率让工具努力收敛。工程上一颗 SoC 的时钟树综合也很关键。时钟信号要同时到达所有触发器不能出现明显偏斜。否则即使逻辑功能正确也可能因为时钟到达太晚导致信号采样错误。这些问题在芯片点亮后最容易暴露低频下正常频率一高就随机出错。调试这种问题非常痛苦因为问题可能来自工艺偏差也可能来自版图绘制。所以后端环节宁可多花时间跑时序收敛也不要图快跳过。3.4 芯片测试流片之后的第一次体检芯片从代工厂回来后不能直接上板子跑 Linux要先做芯片测试。常规测试包括开短路测试检查电源域和地是否短路DC 参数测试测量功耗、漏电流功能测试用 ATE 注入激励检查输出是否正确DFT 测试利用扫描链、MBIST内存内建自测试等手段提高故障覆盖率。对于小团队来说自己没有大型 ATE通常会借助封测厂来跑测试向量。前期设计时把扫描链和 MBIST 都集成进去后面测试时就不用烦恼“这颗芯片有没有物理坏点”而是把注意力集中在逻辑功能上。当然板级阶段也可以用 JTAG 做简单的寄存器读写测试这个过程俗称“点灯”。另外芯片测试并不只是在流片后做。在 RTL 设计阶段我们就要为测试留好接口比如预留测试控制寄存器、支持 JTAG 强制进入测试模式。不少自研芯片功能正常但因为测试模式无法进入导致封测厂无法筛选坏片最终只能提高成本或者靠人工手动测试。3.5 版本管理与文档协作芯片开发过程中的版本管理通常比纯软件复杂。RTL 代码可以用 Git 管理但综合后的门级网表、后端 GDSII、测试向量、固件源代码也要纳入可控版本体系。这里有一个常见误区只管理 RTL不管理约束文件。同样一段 RTL在不同 SDC 约束下综合出来的电路性能可能差 30% 以上。所以建议从一开始就建立多层次的目录结构project/ ├── rtl/ │ ├── cpu/ │ ├── soc/ │ └── periph/ ├── sim/ │ ├── tests/ │ └── tb/ ├── syn/ │ ├── scripts/ │ └── constraints/ ├── backend/ │ ├── floorplan/ │ └── timing/ ├── sw/ │ ├── bootrom/ │ ├── baremetal/ │ └── linux/ └── doc/ ├── register_map.xlsx └── datasheet.md芯片团队往往没有专职文档工程师导致寄存器手册更新不及时硬件、验证、软件三方看的信息不一致。如果一个寄存器地址在 RTL 中改了但文档没改轻则驱动跑挂重则流片后功能无法使用。因此现代芯片开发通常使用 SystemRDL 或 IP-XACT 描述寄存器自动生成 RTL、验证模型和头文件从根源上避免人工维护不一致。4. 完整实战从拿到样片到点亮流水灯4.1 上电前的电源设计检查芯片上电前最重要的就是电源。很多自研芯片“点不亮”的根因不是芯片坏了而是电源没伺候好。常见做法是用一颗 DCDC 芯片将输入电压降到芯片需要的核心电压再用 LDO 给模拟模块供电。这里给出一个简单的电源树示例输入 5V └─ DCDC (5V - 3.3V) → I/O 电源 └─ DCDC (3.3V - 0.9V) → 核心逻辑电源 └─ LDO (3.3V - 1.8V) → PLL、DDR 电源在实际硬件上我们还要关注电源时序通常要求先给核心电压再给 I/O 电压或者反过来不同芯片要求不同。不要随意颠倒否则芯片可能进入闩锁状态。如果你手头的电源管理芯片支持电压转 PWM 信号来调节输出电压可以借此精确控制启动过程中的输出爬升斜率。DCDC 芯片的输出电容、电感选型都要按照数据手册计算不能完全照抄其他板子否则会带来很大的电源纹波。示波器是上电检查的必要工具。上电瞬间要观察各路电源是否出现跌落、过冲和竞争。CPU 的复位脚应该在电源稳定后释放如果复位电平不稳定芯片可能反复重启外部现象就是电流波动、串口无输出。很多团队的“点灯”程序迟迟不亮最后发现只是 RESET 按钮没有加上拉电阻。4.2 创建最小固件工程当我们确认电源无误后开始写第一个程序。以“流水灯”为例这是所有嵌入式开发者的 hello world。假设我们的芯片内部有一个 GPIO 控制器地址映射为 0x4000_0000相关寄存器定义如下0x0000GPIO 方向寄存器bit 0 写 1 表示输出0x0004GPIO 输出寄存器bit 0 写 1 输出高电平0x0008GPIO 使能寄存器bit 0 写 1 使能引脚。用 C 语言写一个最简单的点亮 LED 的程序// 文件路径app/main.c #define GPIO_BASE (0x40000000UL) #define GPIO_DIR (*(volatile unsigned int *)(GPIO_BASE 0x0000)) #define GPIO_OUT (*(volatile unsigned int *)(GPIO_BASE 0x0004)) #define GPIO_EN (*(volatile unsigned int *)(GPIO_BASE 0x0008)) void delay(unsigned int count) { while (count--) { __asm volatile(nop); } } int main(void) { GPIO_DIR 0x01; // pin0 输出 GPIO_EN 0x01; // 使能 pin0 while (1) { GPIO_OUT 0x01; // 亮 delay(1000000); GPIO_OUT 0x00; // 灭 delay(1000000); } return 0; }编译这段代码需要指定芯片的链接脚本比如把代码放在 0x20000000如果芯片支持从 SRAM 启动。如果是通过 BootROM 从 SPI Flash 启动则需要把编译出来的二进制烧录到 Flash 指定偏移。这些细节在芯片原厂的 SDK 里都会有。对于自研芯片团队会在 SDK 里提供链接脚本和启动文件开发者不需要关心太底层的事但至少要了解代码加载地址和栈地址。4.3 烧录与运行验证烧录方式取决于启动模式。如果芯片支持 JTAG/SWD 或串口下载最简单的是复用调试口。以 J-Link 为例使用命令行烧录JLinkExe -device MYCHIP -if SWD -speed 4000 -CommanderScript flash.jlink其中flash.jlink的内容可以是这样loadbin app.bin 0x20000000 r g q连接好调试器后执行命令你会看到调试器返回烧录成功。松开复位键LED 开始闪烁。恭喜你的“芯片”已经能执行程序了。这件事的工程量比大多数人想象的要复杂但也不算不可企及。在真实项目中上电到 first light 往往需要几周时间因为中间会不断排查焊接、电源、时钟、JTAG 时序等问题。如果 J-Link 连不上可以先降低 SWD 速率检查调试器供电电压是否和目标板一致再确认调试口复用功能是否默认使能。4.4 串口打印与调试流水灯能跑之后第二步是把调试信息打印出来。最简单的方式是复用某个 UART 外设。在自研 SoC 的 BSP 编程中需要初始化 UART 控制器然后通过轮询方式发送字符。下面是一个极简的 UART 发送函数片段// 文件路径app/uart.c #define UART_BASE (0x40010000UL) #define UART_TXD (*(volatile unsigned int *)(UART_BASE 0x00)) #define UART_STATUS (*(volatile unsigned int *)(UART_BASE 0x04)) #define UART_TX_READY (1 1) void uart_send_char(char c) { // 等待发送寄存器空闲 while ((UART_STATUS UART_TX_READY) 0); UART_TXD c; } void uart_send_string(const char *str) { while (*str) { uart_send_char(*str); } }然后在 main 函数中调用uart_send_string(Hello, MYCHIP!\r\n)用串口工具就能看到输出。这一步验证了芯片内部总线、UART 外设和板级连接是否正常是整个系统跑 Linux 前的重要里程碑。串口打印稳定后再逐步接上时钟中断、定时器、DMA系统才慢慢变成“可开发”的底座。4.5 从裸机到 RTOS启动时间还能更快吗很多人会说“我们造了一颗芯片而且它很快”这里“快”还包含另一层意思系统启动时间短。在嵌入式 Linux 设备中从按下电源到出现用户界面的时间往往被看作产品体验的重要指标。而在 MCURTOS 场景中这个时间可以做到几十毫秒。我们可以通过以下方法压启动时间精简单板涉及的镜像大小比如使用 LTO链接时优化裁掉未使用函数将常驻代码放到 XIP片内执行区域减少从 Flash 拷贝到 RAM 的时间优化 BootROM 里的初始化逻辑不是所有外设都需要上电就初始化调整 Bootloader 的 Flash 读取模式提升突发读取效率。这些优化点也往往需要芯片设计阶段预留支持。比如 BootROM 代码是流片前固化好的如果一开始没有做成可裁剪配置后期想改就非常麻烦。所以“快”不只是软件优化而是整个软硬件协同设计的产物。5. 常见问题与排查思路5.1 高频故障速查表自研芯片开发过程中问题千奇百怪。下面整理一些高频问题供大家参考。问题现象常见原因解决思路上电后芯片发热严重电源短路、IO 配置错误、闩锁断开所有外设用万用表量电源对地电阻检查电源时序CPU 无法启动电流很小BootROM 未运行、时钟未起振用示波器确认晶振和 PLL 输出检查复位引脚是否一直有效JTAG/SWD 连接不上调试口引脚未使能、硬件连接错误、目标电压不匹配检查调试器供电电压对照原理图确认引脚尝试降低连接速度Keil 芯片包安装失败版本不匹配、旧文件残留、网络下载异常先卸载旧的 Pack清缓存后重新下载离线包确认 IDE 版本支持STM32CubeMX 下载芯片固件库失败网络问题、固件包路径配置不正确在软件设置中更换固件包路径或手动下载固件包后导入程序可以跑但频率一高就崩溃时序约束不满足、信号完整性问题降低主频先确认功能再检查关键路径、时钟树设计和信号完整性芯片部分引脚悬空引起功能异常某些引脚必须接上下拉或特定电平仔细阅读引脚说明对于空引脚不要随便接按手册配置默认状态这里特别想提一个容易忽略的点在 PCB 上放置芯片时很多引脚是 NCNot Connected的。比如 eMMC 芯片有很多空引脚这些引脚在原理图上往往不接任何网络。不要以为空引脚越多越好有些 NC 引脚其实在芯片内部有特殊作用硬件工程师需要严格按照封装手册判断。如果某个引脚标记为“Reserved”或者“NC”却要求接固定电平就必须照做否则芯片会进入测试模式或异常状态。另外很多朋友在调试陌生芯片时喜欢用“诱骗”的方式向某个接口灌入电压来尝试激活芯片这种方式非常危险尤其是对手机 OTG 这类有协议协商的接口很容易烧毁芯片。在实际工程中所有对外接口都应该按照协议规范和参考设计来实现而不是“试探式”接电。5.2 一次启动失败的排查实录这里分享一个非常典型的启动失败场景它几乎集成了一半的常见坑。现象样片焊接完成后J-Link 可以识别芯片 ID但无法下载程序提示Could not find supported CPU core on target。用示波器看晶振时钟正常量 3.3V、1.8V、0.9V电压正常复位脚在调试器连接时已经被拉高。为什么还是找不到 CPU 核心进一步检查发现芯片的 Boot 引脚配置为上电从 SPI Flash 启动而 Flash 芯片对应引脚虚焊导致 BootROM 在读取启动介质时卡死。此时 CPU 一直停在 BootROM 循环里没有进入主调试模式。J-Link 虽然能读到调试访问端口DAP但无法获取核心状态。解决办法先通过硬件把 Boot 模式改为从 SRAM 或调试口启动绕过 Flash重新擦除 Flash 后再切回正常启动。从这个案例可以看出拿到芯片后第一步不要急着跑用户程序而要先用最小配置确认“芯片能进入调试状态”。如果调试器能连上至少说明电源、时钟、复位、调试端口都是通的。6. 最佳实践与工程建议6.1 芯片设计阶段的工程建议尽早建立寄存器模型和地址映射文档。芯片软件团队往往要到芯片流片后才会开始写固件但地址空间必须清晰否则后面写驱动时会晕头转向。验证环境一定要可回归。哪怕是修复了一个小 bug也要把之前跑过的用例全部重新跑一遍避免引入新问题。DFT 不要后补。扫描链和 MBIST 等可测性设计应该在 RTL 设计阶段就考虑好否则流片后芯片出问题连“测”都无法测。后端时序约束要真实。约束文件不要把时序写得过于激烈工程上要留一定余量例如 5%~10%否则流片后批次性主频不达标。在实际项目中经常出现 RTL 验证通过、后端实现也收敛但流片回来却发现芯片在低温下无法工作的情况。这往往是因为温度变化影响了延迟模型而后端分析没有把最差工艺角覆盖到位。建议在签核时至少同时分析 slow corner、fast corner 和 typical corner必要时加上电压偏移。6.2 嵌入式适配阶段的工程建议最小系统先行。拿到样片后不要急着跑完整系统先验证电源、时钟、复位再点亮一颗 LED、打通一个 UART循序渐进。BSP 分层。把芯片寄存器操作、外设驱动、板级配置分层管理。这样即使换了一颗引脚布局不同的芯片也只需要修改板级文件不用重写驱动逻辑。日志和断言要留好。芯片刚点亮时Bug 很多打印信息是排查问题最直接的线索。建议从一开始就设计好串口日志格式。严格按数据手册操作。自研芯片只有内部开发人员但依然要按“芯片手册”的方式维护文档。不要凭记忆操作寄存器很多隐蔽问题都来自错误的 bit 位。电源合规。DCDC 芯片和 LDO 的输入输出电容必须靠近芯片引脚放置走线要短粗否则电源噪声会直接影响芯片稳定性。6.3 安全与容错芯片开发中还会涉及到安全边界。例如测试模式寄存器在生产测试后要关掉避免恶意用户通过 JTAG 读取内部固件启动过程建议加入签名校验防止固件被篡改对于烧录、更新等操作必须先备份原固件并在本地测试环境验证后再分发。这些安全措施不仅保护产品也保护开发者自己。尤其在处理擦除、写入、升级等不可逆操作时要反复确认指令目标避免把 Bootloader 或关键配置清掉。还要注意不要在生产环境直接做实验先拿废旧板卡或测试板跑通流程。芯片开发团队里最常见的损失就是某位工程师为了省时间把正在测试的 Bootloader 擦掉了结果整块板砖。7. 总结与学习路线这篇长文围绕着“我们造了一颗芯片而且它很快”展开从芯片类型、开发流程、RTL 示例、后端概念、测试方法、样片点亮到常见问题梳理了一颗芯片从设计到运行的最小路径。你可以看到所谓“很快”并不是单指某颗芯片的 GHz 数字而是快速启动、快速迭代、快速定位问题。造芯和嵌入式开发一样本质是“用确定性流程去对抗不确定性硬件”。如果你对芯片设计有兴趣下一步可以按这个路线继续深入先学 Verilog/SystemVerilog写一个小型 CPU 或者外设模块用开源工具仿真学 RISC-V 指令集架构尝试用 RISC-V 核搭建自己的 SoC很多开源项目如 Rocket Chip、Ibex都可以参考学 FPGA 原型验证把 RTL 跑在实际硬件上你会看到逻辑和物理世界的差距学嵌入式 Linux 驱动理解一颗 SoC 是如何在复杂操作系统下工作的有条件的话参与一次 MPW 流片哪怕只是一个小芯片也能让整个流程变得具象。最后提醒一句芯片项目周期长、坑多尤其是从零设计一颗能稳定运行的芯片需要很强的耐心。如果你是刚入行的工程师建议先用市面上成熟的芯片比如 STM32、ESP32、RK3588把嵌入式软件功底打牢再反向进入芯片设计会容易很多。希望本文能帮你建立一张“造芯地图”少走一些弯路。如果这篇文章对你有帮助欢迎收藏备用也欢迎在评论区留下你遇到的问题我们一起讨论。
返回列表