ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FPGA原型验证全流程解析:从平台选型到Bring-up调试

FPGA原型验证全流程解析:从平台选型到Bring-up调试 做芯片验证的朋友应该都有过这种经历RTL仿真里跑得顺顺当当的模块一旦放到板子上就原形毕露Bootloader起不来、DDR校准不过、PCIe链路上不去甚至一个简单的寄存器读回值都和预期对不上。问题往往不是RTL逻辑本身错了而是纯软件仿真根本给不了设计一个真实的物理环境。这个缺口靠的正是FPGA原型验证——把待验证的芯片设计烧进FPGA里用接近真实的时钟和物理接口把系统真正跑起来让芯片在流片之前先活上一次。这篇文章想聊的不是怎么点亮一块FPGA开发板上的数码管而是从原型验证的完整技术链条出发把平台选型、架构切分、RTL移植、时钟复位、高速接口Bring-up、硬件调试这些环节逐个拆开讲清楚。不管你是正要踏入芯片验证领域的学生还是刚接手原型验证任务的工程师又或者是跟FPGA打交道多年的硬件开发者应该都能在这里面找到一些实操性的东西。1. FPGA原型验证到底在解决什么问题1.1 软件仿真跑不到的地方挣的就是真实速度先明确一个基本事实纯软件仿真器的速度跟真实的硅片差着好几个数量级。一个主频1GHz的处理器RTL设计在主流事件驱动仿真器里可能只能跑到几十Hz到几百Hz跑个简单的开机流程都要好几分钟想跑完一个完整的操作系统启动过程基本是拿年为单位在等。而FPGA原型验证可以把同样的RTL综合映射到FPGA上以10MHz到100MHz的时钟频率跑起来虽然和最终芯片的目标频率还有距离但已经足够让软件栈和真实接口动起来。这正是原型验证的核心价值它能跑软件。芯片里那些依赖真实物理行为的模块比如DDR控制器的Training流程、PCIe的链路训练、以太网PHY的协商过程在纯仿真环境里很难完整覆盖因为仿真器没法真实模拟物理链路上的信号质量和协议握手细节。把这些东西放到FPGA上接上真实的外设芯片让软件直接跟硬件打交道很多仿真中隐藏的问题就会立刻暴露出来。1.2 原型验证和硬件仿真别把两件事混为一谈很多刚入行的朋友会把FPGA原型验证和硬件仿真Emulation混着说其实二者定位差异非常大。硬件仿真器比如Cadence Palladium、Synopsys Zebu这类大型设备本质上是专用处理器阵列速度通常在几百kHz到几MHz但它保留了极强的内部信号可见性和调试能力可以在整个系统上下断点、看波形、甚至跟仿真测试平台联动适合在流片前做最深入的系统级验证。FPGA原型验证速度快、成本相对低得多但内部观测能力很弱信号一旦综合布局布线基本等于进了黑盒子调试只能靠有限的探针和外部手段。实际项目中很多团队的选择是两者都上先让硬件仿真器把复杂的验证用例跑透把软件和硬件的基本交互打通再把设计切到FPGA原型上去跑更接近真实应用场景的工作负载比如操作系统启动、性能评估、外设兼容性测试。这两种手段不是替代关系而是递进关系。理解这一点你就能明白为什么有些原型验证项目会在SoC流片前一年就启动——它需要足够长的时间来解决软件使能、驱动开发和硬件适配的问题。1.3 流片前最后一关挡住的都是真金白银原型验证在芯片开发流程里扮演的通常是从RTL冻结到流片之间最关键的一道硬件验证关口。许多系统级Bug在仿真阶段根本发现不了比如地址映射配反了、设备中断号对不上、外设寄存器偏移量算错、DMA描述符格式不一致这些问题只有在真实软件跑到真实硬件的时候才会炸出来。而原型验证恰恰提供了这个机会在还没花流片钱的阶段让软件工程师提前在准芯片上调试代码让验证工程师验证那些仿真覆盖不到的场景让系统工程师评估性能和功耗的初步表现。这里说句实在话流片回来之后如果发现一个需要改版才能解决的系统级问题一次ECO的费用可能足够搭好几套原型验证平台。原型验证不是可选项对于稍有规模的设计来说它基本是刚需。2. 平台选型与架构设计动手前先想明白2.1 商用整套、自研板卡还是单板起步做FPGA原型验证第一个要面对的问题就是平台从哪来。市面上的选择大致分成三类各有各的适用场景。第一类是商用整套方案比如Synopsys HAPS系列、Cadence Protium系列、Aldec HES系列。这类平台的好处非常明显工程成熟度高自带自动化切分工具、完善的接口子卡生态、成熟的上位机软件出场基本上把多FPGA切分这个最痛苦的问题解决了一大半。代价也很直接——贵而且交付周期长很多中小团队不一定能接受这个前期投入。第二类是自己设计板卡。不少芯片大厂会组建专门的硬件团队来定制原型验证板因为自家的SoC往往有特殊的接口需求比如特定的高速SerDes数量、特殊的存储器拓扑、自定义的电平标准。自研板卡的好处是成本和自由度都可控缺点是需要很强的硬件设计能力否则板子做回来发现电源纹波超标或者高速信号质量不过关调试起来相当痛苦。第三类是单板起步用Xilinx、Altera/Intel的主流评估板或者现在很常见的国产FPGA开发板把设计映射到单颗FPGA上跑。这种方式适合团队早期验证、学生项目、小规模IP验证。比如你想先验证一个带MIPI接口的图像传感器接口IP就用一块带MIPI connector的板子起步就够。选型的基本原则其实很简单设计规模几十万门能用中档FPGA搞定就别一开始上大规模阵列等到设计长大了再考虑扩展或者上商用平台。2.2 多FPGA切分容量不够时的关键策略当设计规模超过单颗FPGA的容量时就不得不面对多FPGA切分的问题。这个环节是原型验证里最容易被低估难度的地方无数项目在这里翻车常见原因通常是拍脑袋按功能模块切没考虑跨FPGA接口的带宽和时序约束。切分策略的选择有几个维度。一个常见维度是按时钟域切把同一个时钟域的逻辑尽量放在同一颗FPGA里避免跨芯片传播时钟域问题另一个是按功能模块切比如CPU簇放一颗、存储控制器放一颗、多媒体子系统放一颗这样模块边界清晰但必须小心模块之间的数据通路带宽是否够用。更系统的方法是先做带宽矩阵分析统计每个模块之间的通信量把高带宽交集的模块放到同一颗FPGA内跨芯片只保留低速控制信号或异步FIFO。跨FPGA的接口处理也很有讲究。最简单的做法是直接连普通GPIO但受限于IO数量带宽通常不够。很多项目会用到SERDES或者高速收发器来做跨板互联比如用GTX跑PCIe、用LVDS跑并行总线这就需要好好规划收发器的数量和链路速率。需要特别提醒的是跨FPGA路径的时序是不可控的你无法在综合工具里稳定收敛跨芯片逻辑路径所以接口逻辑必须设计成异步接口或者带握手机制的总线否则一上板就是随机性死机。这块基本属于一着不慎满盘皆输的环节切分方案一定要多做预分析别省这个时间。2.3 板级规划FPGA和PCB开发必须并行商量做原型验证的人如果只是把PCB当成买回来的盒子往往会吃大亏。很多高速接口能不能在原型板上跑起来在板子画板的时候就已经注定了。FPGA设计者和PCB设计者之间最关键的事情就是管脚分配。FPGA的Bank电压域决定了哪些IO能支持什么电平标准BGA封装的逃逸布线决定了走线能不能扇出DDR的DQS组必须在同一个Byte Lane内对齐PCIe差分对需要合适的参考时钟和阻抗控制。这些决策要尽早定下来别等RTL全部写完才去分管脚。关于管脚分配很多从ASIC转过来的工程师会问一个问题FPGA的IO有没有类似ARM的模式配置比如推挽、开漏、上拉答案是有的FPGA的IO可以配置成推挽输出、开漏输出、内部上拉/下拉、摆率控制、可编程驱动强度等等功能上一点也不比MCU的GPIO弱只是这些配置是在约束文件里完成的不是在代码里写寄存器。在原型验证板设计时一定要把那些需要开漏或者带上拉的信号比如I2C、中断线、热插拔检测线理清楚提前在约束里配好否则上板后大概率要拿飞线补。另外板级设计里时钟芯片的选型也很关键。原型验证经常需要在不同频率之间切换来模拟不同工作模式这时候最好用可编程时钟芯片比如Silicon Labs的SI5341系列上电后通过I2C/SPI动态配置各路时钟频率。再就是板上的调试资源至少留一个UART串口、一组状态LED、几个按键做中断触发、一个JTAG口、几个空闲的普通IO做逻辑分析仪探针。这些看似基础的东西在后期调试时能救命。3. 芯片RTL到FPGA原型工程迁移与Bring-up全流程3.1 综合与约束哪些代码要改哪些可以不动把ASIC的RTL搬进FPGA不是一个复制粘贴的过程。ASIC和FPGA在底层架构上的差异决定了有些代码能原样用有些必须进行适配改造。最常见的一块是时钟门控。ASIC设计中为了降低动态功耗会大量使用ICG单元但FPGA里没有对应的物理结构直接综合会导致工具把门控时钟当成普通逻辑处理生成一堆毛刺风险极高的时钟网络。解决办法是把门控时钟改造成时钟使能模式或者让综合工具把门控逻辑映射成时钟使能信号。第二块是存储器替换。ASIC设计里通常会用到工艺厂商提供的SRAM Compiler IP这些IP在FPGA上是不存在的。在固化代码前你需要把这些SRAM模型替换成FPGA厂商的Block RAM/URAM IP同时要注意接口时序的适配尤其是读延时一拍还是两拍这种细节很容易导致替换后功能对不上。第三块是IO和PAD模型。ASIC里的PAD cell不能直接用需要改成FPGA的原生IO同时把IO标准、驱动能力、上下拉等在约束里定好。综合时的约束也很重要。除了常见的时钟约束、输入输出延时约束原型验证工程还经常要处理一个问题IP核和顶层之间会出现悬空接口综合工具默认会把它们优化掉但后来调试的时候你又想从外面灌信号进去。这时候可以用虚拟引脚Virtual I/O约束把悬空端口保留。下面是Vivado里头一个很基础的时钟和虚拟IO约束示例create_clock -name sys_clk -period 10.000 [get_ports clk_in] set_property PACKAGE_PIN AE16 [get_ports clk_in] set_property IOSTANDARD LVCMOS33 [get_ports clk_in] # 把顶层复位信号保留为虚拟引脚不接到FPGA物理管脚 set_property VIRTUAL_PIN true [get_ports rst_n]这段约束在ASIC设计移植过来时非常实用尤其是那些暂时还没决定接到哪个物理管脚的调试信号。此外综合策略上建议直接把Optimization Strategy选成Performance档或者面积与性能平衡档别用默认的探索策略不然跑出来的bitstream时序余量可能很紧。3.2 时钟与复位看似简单却最容易翻车时钟和复位是FPGA原型验证里看似基础、实际翻车率最高的两部分。时钟方面ASIC设计通常工作在几百MHz到GHz级别FPGA原型验证则要把频率压到几十MHz甚至更低的量级。这就需要设计者明确一件事原型验证不是在测时序极限而是在保证功能正确的前提下让系统能跑起来。所以时钟频率一般要留有充足的余量比如DDR跑在较低频率、核心逻辑跑在系统要求的十分之一到三分之一频率。时钟切换上如果软件需要在运行中动态变频比如低功耗模式切换千万不要用简单的MUX去切那会产生毛刺导致逻辑误触发。正确做法是用FPGA内部MMCM/PLL的glitchless时钟切换功能或者把切换逻辑做成先关后开、等时钟稳定再切换的流程。复位问题更隐蔽。仿真器里复位信号通常是理想波形一套下去所有寄存器归零大家从来没觉得复位有什么难度。到了FPGA上异步复位释放的时序如果不处理板上就会出现莫名其妙的初始化失败有时上电能跑按一下复位键就挂有时冷启动正常、热复位就崩溃。原因基本都指向亚稳态和复位释放不同步。正确处理方式是用异步复位、同步释放电路如下面这段Verilog所示module rst_clk_sync ( input wire clk, input wire rst_n, output wire sys_rst_n ); reg rst_n_sync1, rst_n_sync2; always (posedge clk or negedge rst_n) begin if (!rst_n) begin rst_n_sync1 1b0; rst_n_sync2 1b0; end else begin rst_n_sync1 1b1; rst_n_sync2 rst_n_sync1; end end assign sys_rst_n rst_n_sync2; endmodule这个同步释放电路几乎是每个原型验证工程里都会看到的开场必备模块。另外很多ASIC系统有复杂的复位层次比如POR复位、软件复位、看门狗复位这些复位之间谁先谁后、谁覆盖谁在FPGA移植时也要显式定义清楚不然上电后状态机会跑进非法状态。3.3 DDR4、PCIe、Ethernet等接口怎么在FPGA上跑起来到了高速接口这一层才是原型验证真正拉开差距的地方。你大概率会在工程里遇到两个高频关键词DDR4 Calibration Fail、PCIe Link Up失败。先说DDR4。FPGA厂商提供的MIGXilinx或EMIFIntelIP上电后要做一次完整的Training Calibration目的是自动调整读写DQS相位、地址命令时序等参数。Cal Fail的原因通常有几种第一是管脚分配错误DQS信号没有放进正确的Byte Lane组内或者地址组跨越了太多Bank第二是参考时钟给错了MIG对参考时钟频率和差分极性极其敏感第三是电源噪声太大DDR的VDDQ电源纹波超标会导致Training结果不稳定第四是PCB走线问题走线长度不匹配严重时Training根本收敛不了。排查时建议从外到内先用示波器确认参考时钟波形和电源纹波再查管脚约束最后考虑降低DDR频率比如从2400降到1600重新Cal。很多情况下降频是快速判断问题是逻辑问题还是物理问题的最直接手段。PCIe的情况类似。FPGA的PCIe硬核自带PHY和Controller你要做的主要是把ASIC里的PCIe接口适配过去。最常见的坑是参考时钟没接对、收发器差分极性接反、以及复位和时钟上下电顺序不满足PCIe规范。Bring-up时先看Link Training状态寄存器确认到哪一步挂掉的再回头排查物理层。Ethernet也是原型验证里的高频接口。如果你要验证带网口的SoCFPGA上大概率会用到三速以太网MAC外部PHY芯片的组合。重点要关注MDIO/MDC配置是否正确、PHY的复位时序是否满足数据手册、时钟源是选125MHz还是25MHz取决于MAC工作在千兆还是百兆。接口层的问题往往都很琐碎但每一个都会卡住你整个系统的联调进度。3.4 最小系统Bring-up顺序先亮灯再跑软件接口调通了不代表系统能跑起来。Bring-up的顺序至关重要很多项目上来就把CPU子系统和DDR全部塞进bitstream里一上电就死然后开始漫长的盲猜。合理做法是分阶段Bring-up每阶段只验证最小功能集。第一阶段做最小配置只点亮FPGA驱动LED翻转读一下FPGA的DNA或者ID寄存器确认bitstream烧录正确、时钟起振、复位释放正常。用Vivado的硬件管理器读取DNA码非常简单用一行Tcl就能办到set dna_value [get_hw_property [get_hw_devices] DNA] puts $dna_value这个每颗芯片唯一的DNA码在原型验证里很有用可以用来确认板卡身份、绑定license也可以用来做运行状态追踪。第二阶段加入时钟和复位管理模块用计数器把时钟分频到目标频率用状态机管复位层次同时用板上LED显示各种复位状态。第三阶段加入DDR控制器跑Memory写读测试和简单的伪随机测试如果这一关过了说明存储子系统基本稳定。第四阶段加入串口打通UART打印这样后面调试就有了嘴巴。之后再逐步挂上PCIe、Ethernet、DMA这些外设最后才是CPU子系统接入和Bootloader启动。顺序稳扎稳打出问题的时候定位范围就小得多。4. 调试手段与问题定位在硬件上抠Bug的实战思路4.1 可见性不如仿真探针一定要提前规划FPGA原型验证最让人不习惯的地方就是内部信号一点都看不见。仿真里你能随便拉波形看任何节点到了FPGA上信号一旦烧进去就属于物理存在但不可观测能看什么、不能看什么在布局布线之前就得决定好。常用手段是逻辑分析仪IPVivado里叫ILAQuartus里叫SignalTap。它的原理是把你想观测的信号通过片上逻辑连到调试核里再通过JTAG把采样数据传回PC显示。但加探针是有代价的探针信号会消耗布线资源抓取信号的采样深度受Block RAM限制更关键的是过多的探针会影响布局布线导致时序更难收敛。所以探针规划一定要提前做。我的经验是核心状态机的主要状态位、关键数据通路的控制信号、中断信号、总线的读写命令通道这些值得抓临时变量、中间计算结果该放手就放手。另一个技巧是在RTL里用宏定义或者mark_debug属性来标记需要调试的信号这样模块级验证和整机验证阶段不需要改代码就能切换探针配置。实测下来探针数量控制在几百根以内对时序的影响通常是可接受的一旦上千根基本就要开始跟编译工具较劲了。4.2 信号质量、跨时钟域和复位释放的排查套路板上跑出问题第一反应别急着怀疑RTL逻辑先想信号质量。示波器是原型验证调试里最值得用的工具之一。时钟起没起振、频率对不对、占空比有没有偏移、复位信号有没有毛刺电源纹波大不大这些用示波器一看便知。尤其是系统跑着跑着偶发死机的情况很多是核心电压在芯片内部跌了一小下触发某个关键寄存器误翻转这种通过逻辑分析仪根本不好定位示波器抓电源却往往一抓一个准。跨时钟域CDC问题在FPGA上比仿真里更容易暴露真实风险。仿真器对亚稳态不敏感板子上可不一样。如果设计里存在跨时钟域信号直接打了一拍就用的偷懒做法在原型验证阶段迟早会出问题。正确做法永远是把异步信号先同步到目标时钟域或者更彻底地使用异步FIFO、握手协议。原型验证平台上看到的偶发错误排除电源因素之后有一大半是CDC问题。复位问题刚才也提过这里再强调一个容易被忽视的点不要用某个芯片管脚直接做全局复位FPGA内部有专用的全局复位资源和寄存器初始值机制最好把外部复位信号先同步、再扇出到各模块的复位逻辑。另外不同模块的复位顺序也值得关注如果外设模块复位晚于CPU复位CPU可能在初始化外设时读到不稳定的寄存器状态。4.3 一个典型问题的隔离过程从报错到定位举个具体例子。某项目在原型验证阶段跑Linux内核每次启动到访问某个外设寄存器时系统就挂死。第一反应是查外设驱动里的寄存器偏移查了一遍没发现问题。这时候就要靠分层隔离。先回到最小工程只验证这个外设模块的寄存器读写通路用ILA抓总线上的读写时序结果发现总线上根本没出现预期地址的写操作系统在更早的地方就挂了。再往前查发现DMA描述符的地址被写错了——问题出在DMA描述符在内存里分配和对齐的方式上而这块内存恰好是从DDR控制器某个特定区域分配的。最后追到根因是DDR控制器配置里的Bank Group映射方式和芯片默认设置不匹配导致某些地址区域读回的数据偶发错误。如果一开始就在完整系统里大海捞针这个问题可能要折腾很久。这个例子说明原型验证的调试必须学会缩小范围先确认物理层OK再确认接口OK再确认逻辑OK一层层往下剥。5. 常见问题速查表与踩坑笔记在多个原型验证项目里摸爬滚打之后我整理了一张高频问题速查表实际排查问题的时候非常实用。现象可能原因优先排查手段bitstream下载后无任何反应时钟没起振、FPGA配置失败、复位拉死示波器看时钟/复位检查配置模式管脚DDR Calibration 一直失败管脚分配错、参考时钟异常、电源纹波大从外到内逐层检查尝试降低DDR频率跑一段时间后偶发死机电源跌落、跨时钟域亚稳态、复位毛刺示波器抓电源加同步器/异步FIFOPCIe链路起不来参考时钟极性错、复位时序不对、收发器未配置查Link Training状态寄存器逐层定位上电能跑但按复位后挂异步复位释放未同步、复位树未定义清楚检查复位同步电路复位层次重新梳理综合后时序收敛困难约束过紧/过松、高扇出信号、探针过多降低频率删除多余探针优化关键路径代码系统引导启动后UART无输出波特率配置错、UART时钟分频不对、引脚约束错用示波器看TX脚有无信号翻转读回的寄存器值偶发翻转DDR数据总线时序问题、信号完整性差降低DDR频率检查管脚约束和走线长度排查问题的时候还有一个原则优先怀疑基础环境再怀疑逻辑实现。很多工程师遇到问题第一反应是改代码改来改去没效果最后发现是时钟频率超了FPGA极限或者电源线太细压降太大。先稳定基础环境再调功能这个顺序一辈子都有效。再顺带说一个版本管理的坑。原型验证的bitstream生成一次可能要跑很久迭代过程中一定要给每个bit文件加清晰的时间戳和版本号同时用寄存器在运行时读出版本信息。烧错bitstream在原型验证里太常见了尤其是多FPGA的大型平台一块板好几颗FPGA不做好版本标记光确认现在板上跑的是哪个版本就能浪费你半天。6. 进阶方向原型验证还能怎么玩6.1 从IP级验证走向SoC软硬协同验证前面讲的更多是接口层面和Bring-up层面的工作真正让原型验证发挥巨大价值的场景是软硬协同验证。把CPU子系统的RTL放到FPGA里接上DDR和标准外设然后灌一个完整的Bootloader、甚至裁剪过的Linux内核进去让真实的软件栈在准芯片上跑起来。这个能力带来的验证深度是仿真阶段很难达到的。在这个阶段验证的对象就不只是RTL了还包括驱动代码、固件、中断配置、地址映射、启动流程这些内容恰恰是最容易在流片后出问题的部分。很多团队还会在原型平台上跑操作系统原生应用来做性能评估衡量处理器主频、Cache命中率、DDR带宽是否满足设计目标。这是原型验证从硬件验证工具升级为系统验证平台的关键一步。6.2 AI芯片、图像处理和特种应用的落地场景近些年原型验证的需求增量很大程度上来自AI芯片和专用计算领域。验证一颗AI加速器芯片你需要在原型平台上跑真实或者接近真实的神经网络模型推理把权重先写进DDR4里然后把图像数据灌进去比较FPGA原型跑出来的结果和软件仿真模型跑出来的结果是否一致。这种对比测试能验证硬件计算精度、流水线时序、DMA搬运逻辑还能顺便评估加速器的实际性能。图像处理和ISP相关的芯片也很适合原型验证。比如验证MIPI接收端、ISP去马赛克模块、图像缩放和色彩校正的完整链路用原型板接真实摄像头传感器实时输出经过处理的图像效果直观且验证充分。此外像TDC时间数字转换器这类需要精密测量的设计也适合用FPGA原型来做验证实测时间间隔测量的直方图分布情况验证统计精度和线性度是否符合设计预期。这些场景有一个共同点单纯靠仿真没法提供足够逼真的激励而原型验证可以提供一个以假乱真的物理环境。6.3 国产FPGA工具链与生态带来的新选项过去原型验证基本是Xilinx和Altera/Intel的天下现在高云、易灵思等国产FPGA也逐渐进入了原型验证的视野。中小规模的项目里国产FPGA在成本、供货稳定性上都更有优势工具链也在快速补齐。比如在一些不需要高速SerDes、DDR4这类复杂接口的验证任务中用国产中低端FPGA完全能胜任。如果你所在的团队正在规划原型验证平台值得把国产器件的评估纳入进来从成本、开发体验、社区支持几个维度综合打分不要只盯着老牌厂商。当然国产FPGA在高速接口IP成熟度、综合工具优化能力、调试工具完善度上跟头部厂商还有差距选择时心里要有数。但作为多平台策略里的一环它确实能分担不少中低端验证任务。对个人开发者来说用国产FPGA开发板学习原型验证的基础流程、练习切分和调试也是一个性价比很高的入门路径。工具链的底层逻辑是相通的这里练熟了换了商用平台一样能上手。整个过程做下来我的个人体会是FPGA原型验证这行技巧性的东西反而不是最稀缺的真正稀缺的是对全流程节奏的把控。很多刚入门的朋友喜欢一上来就堆功能恨不得一个bitstream装完所有模块觉得这样效率高实际上翻车的概率和排查难度都成倍增长。先把最小系统的基础做稳把时钟、复位、DDR、串口这些生命线逐一确认清楚再逐步往上加功能看似多花了两三天时间实际上是在给整个项目省时间。另外还有一个建议原型验证岗位在芯片公司里算是少有的全栈角色你既得懂RTL和综合约束又得懂硬件调试、PCB走线和信号质量还得了解Bootloader、Linux启动和驱动适配。第一年可能觉得杂坚持做两三年你会发现自己看待芯片的方式跟那些只做仿真验证的同事完全不一样——因为你见过芯片流片之前活着的样子。
返回列表