1. 景嘉微校招数字电路笔试到底在考什么
先说说我为什么想聊这个话题。前段时间有个学弟跑来问我,说他投了景嘉微的数字电路工程师岗位,笔试通知刚下来,问我有没有什么经验可以分享。我当时就问他,你知道景嘉微是做什么的吗?他支支吾吾说好像是做显卡的。这个回答对了一半,但远远不够。
景嘉微是国内少数几家在GPU领域有实际产品落地的公司,主要做图形显控和通用计算相关的芯片与模块。这意味着他们的数字电路岗位,天然带着很强的工程落地属性,不是纯理论推导那种。你如果拿对付学校期末考的那套去应付他们的笔试,大概率会翻车。
数字电路工程师这个岗位,在景嘉微的校招体系里,属于硬件方向的核心技术岗。笔试环节通常会覆盖几个大块:数字逻辑基础、时序分析、Verilog/HDL语言基础、FPGA相关概念、以及一些简单的电路设计题。题目难度不会到让你手撕一个CPU的程度,但基础不扎实的人会在细节上丢很多分。
我写这篇东西的目的很直接:把景嘉微这类芯片公司数字电路校招笔试的常见考点、出题逻辑、以及我自己和身边人踩过的坑,系统地梳理一遍。不管你是准备景嘉微的笔试,还是准备其他芯片原厂或FPGA相关岗位的笔试,这篇内容都能直接拿来当复习框架用。适合电子工程、微电子、集成电路、计算机等相关专业的应届生,也适合工作一两年想跳槽到芯片公司的朋友参考。
2. 数字逻辑基础:笔试的第一道门槛
2.1 数制转换与编码:送分题还是送命题
数制转换这东西,看起来是送分题,但每年都有人在这里翻车。十进制转二进制、十六进制转二进制、BCD码和格雷码的转换,这些是必考的基础。景嘉微的笔试卷子里,这类题目通常出现在前几道选择题里,分值不高但数量不少。
我个人的经验是,格雷码相关的题目最容易出错。格雷码的特点是相邻两个数只有一位发生变化,这个特性在跨时钟域传输和旋转编码器里用得很多。笔试里常见的考法是给你一个二进制数,让你写出对应的格雷码,或者反过来。转换规则很简单:二进制转格雷码,最高位不变,然后相邻两位异或;格雷码转二进制,最高位不变,然后每一位是前一位二进制结果和当前格雷码位的异或。听起来绕,但你拿几个数手算几遍就记住了。
注意:笔试里如果遇到格雷码转二进制的题目,千万不要用“相邻位异或”的逆向思维去硬推,直接用“最高位保留,逐位异或”的方法,从高位往低位算,不容易出错。
BCD码的考点通常集中在8421码和余3码的区别上。8421码就是正常的二进制表示0到9,余3码是在8421码基础上加3。考试可能会让你把一串十进制数转成余3码,或者判断某个编码是不是合法的BCD码。这里有个小技巧:合法的8421 BCD码,每个四位组的值不会超过9,也就是不会出现1010到1111这六种情况。看到这六种,直接判定非法。
2.2 逻辑门与布尔代数:化简才是真功夫
逻辑门的基础知识,比如与门、或门、非门、与非门、或非门、异或门的真值表和逻辑符号,这些是必须闭着眼睛都能写出来的。但笔试不会只考你认符号,真正拉开差距的是布尔代数化简和卡诺图。
卡诺图化简是数字电路笔试的经典题型。给你一个四变量或五变量的逻辑函数,让你用卡诺图化简成最简与或式。四变量卡诺图是16个格子,五变量是32个格子。我见过有人在考场上画五变量卡诺图画错的,格子顺序搞混了,后面全错。卡诺图的格子排列必须按照格雷码顺序,也就是00、01、11、10,不是00、01、10、11。这个顺序搞错,化简结果一定不对。
化简的时候,圈“1”还是圈“0”,取决于你要得到与或式还是或与式。圈“1”得到与或式,圈“0”得到或与式。圈的时候要尽量大,每个圈包含2的幂次个格子,圈可以重叠,但每个圈必须包含至少一个没有被其他圈覆盖的格子。这些规则说起来简单,但实际操作时,很多人会漏掉可以合并的项,或者圈了不该圈的格子。
我自己的习惯是,先在卡诺图上把所有“1”的位置标出来,然后从最大的圈开始找,比如先找8个格子的圈,再找4个,再找2个,最后找单独的1。这样不容易漏。另外,不要忘记“无关项”,也就是用X表示的格子。无关项可以当作1也可以当作0,目的是让你的圈更大、项更少。很多人一看到X就懵了,其实X是你的朋友,用好了能大幅化简。
2.3 组合逻辑电路:从加法器到译码器
组合逻辑电路的考点非常集中:加法器、比较器、编码器、译码器、数据选择器。这些器件的逻辑功能和典型应用是必考的。
半加器和全加器的区别,这个是最基础的。半加器不考虑进位输入,全加器考虑。全加器的和是三个输入的异或,进位是三个输入两两相与再或。笔试里可能会让你用两个半加器和一个或门搭一个全加器,或者让你写出全加器的Verilog代码。这个必须熟练到肌肉记忆。
译码器和编码器的考点,通常集中在74系列芯片的功能上。比如74138是3-8译码器,74148是8-3优先编码器。考试可能会给你一个74138的电路图,让你分析输出逻辑。这里的关键是记住74138的输出是低电平有效,而且有两个使能端,一个高有效一个低有效。很多人只记得输出低有效,忘了使能端的极性,导致分析错误。
数据选择器,也就是MUX,是另一个高频考点。74151是8选1数据选择器,它的逻辑功能是用三个选择端控制八个数据输入中的一个输出。笔试里常见的考法是用MUX实现逻辑函数。原理很简单:把逻辑函数的输入变量接到MUX的选择端,把函数值接到数据输入端。比如三变量逻辑函数,用8选1 MUX实现,选择端接三个变量,数据端接对应的函数值。这个方法的本质是把真值表直接映射到MUX的输入上。
实操心得:用MUX实现逻辑函数时,如果变量数比MUX的选择端多,可以把多余的变量接到数据端,通过逻辑门处理后再输入MUX。这种“降维”思路在笔试里经常出现,提前练几道就不慌了。
3. 时序逻辑:笔试的分水岭
3.1 触发器与锁存器:一字之差,天壤之别
触发器和锁存器的区别,是数字电路笔试里最经典的送命题。很多人知道触发器是边沿触发,锁存器是电平触发,但一到具体电路分析就糊涂。
锁存器是电平敏感的,使能信号有效时,输出跟随输入变化;使能信号无效时,输出保持。触发器是边沿敏感的,只有在时钟边沿到来的瞬间,输出才更新为输入的值。这个区别在时序分析里非常关键。锁存器容易产生毛刺和时序问题,所以在同步电路设计中,通常推荐使用触发器而不是锁存器。
笔试里常见的考法是给你一个由锁存器构成的电路,让你分析输出波形。这时候你要注意,锁存器的输出在使能期间是透明的,输入变输出就变。如果输入有毛刺,输出也会有毛刺。而触发器只在时钟边沿采样,毛刺只要不在边沿附近就没事。
D触发器、JK触发器、T触发器之间的转换也是考点。D触发器是最常用的,JK触发器功能最全,T触发器是JK触发器的一种特殊接法。考试可能会让你用D触发器实现JK触发器的功能,或者用JK触发器实现T触发器。转换的方法有两种:公式法和激励表法。公式法就是推导出转换后的激励方程,激励表法就是列出目标触发器的状态转移表,然后反推激励输入。两种方法都要会,考场上哪个快用哪个。
3.2 时序分析:建立时间和保持时间
建立时间和保持时间是时序逻辑的核心概念,也是景嘉微这类芯片公司笔试的必考内容。建立时间是指在时钟边沿到来之前,数据必须保持稳定的最小时间。保持时间是指在时钟边沿到来之后,数据必须继续保持稳定的最小时间。这两个参数决定了电路能跑多高的时钟频率。
笔试里常见的计算题是:给你触发器的建立时间、保持时间、时钟到输出的延迟、组合逻辑的延迟,让你计算电路的最高工作频率。公式是:最小时钟周期 = 触发器时钟到输出延迟 + 组合逻辑最大延迟 + 触发器建立时间。最高频率就是最小时钟周期的倒数。
这个公式看起来简单,但有几个坑。第一,组合逻辑的延迟要取最大值,不是平均值。第二,如果时钟有偏斜,还要考虑时钟偏斜的影响。第三,保持时间的检查是另一个公式:触发器时钟到输出延迟 + 组合逻辑最小延迟 > 触发器保持时间。如果这个条件不满足,电路会出现保持时间违例,数据可能被错误采样。
我见过很多人在笔试里只算建立时间,忘了保持时间。题目如果问“电路能否正常工作”,你必须两个条件都检查。只满足建立时间不满足保持时间,电路照样会出错。
注意:时钟偏斜对建立时间和保持时间的影响是相反的。正偏斜有利于建立时间,不利于保持时间;负偏斜有利于保持时间,不利于建立时间。笔试里如果给了时钟偏斜参数,一定要把它代入公式。
3.3 状态机设计:从状态图到Verilog实现
状态机是时序逻辑里综合性最强的考点。笔试里通常会给你一个场景描述,让你画出状态转移图,然后写出状态转移表和输出方程,最后用Verilog实现。
状态机分为Moore型和Mealy型。Moore型的输出只与当前状态有关,Mealy型的输出与当前状态和输入都有关。两者的区别在状态转移图上表现为:Moore型的输出写在状态圈里,Mealy型的输出写在转移箭头上。笔试里如果要求你设计一个序列检测器,比如检测“1011”序列,用Moore型和Mealy型实现的状态数可能不同。Mealy型通常比Moore型少一个状态,因为输出可以提前一个周期产生。
状态化简是另一个考点。如果两个状态在所有输入下的输出相同,且转移到的次态也相同,那么这两个状态是等价的,可以合并。状态化简的目的是减少触发器的数量,降低电路面积。笔试里可能会给你一个状态表,让你化简。化简的方法有隐含表法和分区法,分区法更直观一些。
Verilog实现状态机,我推荐用三段式写法:第一段用时序逻辑描述状态寄存器的更新,第二段用组合逻辑描述次态的计算,第三段用组合逻辑或时序逻辑描述输出。三段式写法的好处是逻辑清晰,综合出来的电路也比较规范。一段式写法虽然代码短,但容易出错,不推荐在笔试里用。
// 三段式状态机示例:检测序列"1011" module seq_detector( input clk, input rst_n, input din, output reg detected ); // 状态编码 localparam IDLE = 3'b000; localparam S1 = 3'b001; localparam S2 = 3'b010; localparam S3 = 3'b011; localparam S4 = 3'b100; reg [2:0] cur_state, nxt_state; // 第一段:状态寄存器更新 always @(posedge clk or negedge rst_n) begin if (!rst_n) cur_state <= IDLE; else cur_state <= nxt_state; end // 第二段:次态组合逻辑 always @(*) begin case (cur_state) IDLE: nxt_state = din ? S1 : IDLE; S1: nxt_state = din ? S1 : S2; S2: nxt_state = din ? S3 : IDLE; S3: nxt_state = din ? S4 : S2; S4: nxt_state = din ? S1 : S2; default: nxt_state = IDLE; endcase end // 第三段:输出逻辑 always @(posedge clk or negedge rst_n) begin if (!rst_n) detected <= 1'b0; else if (cur_state == S4 && din == 1'b1) detected <= 1'b1; else detected <= 1'b0; end endmodule这段代码是Moore型状态机的写法,输出在时钟边沿更新。如果改成Mealy型,输出可以写成组合逻辑,检测到序列时立即输出,不需要等下一个时钟沿。笔试里如果对输出时序有要求,一定要看清楚题目说的是“检测到序列后立即输出”还是“下一个时钟周期输出”。
4. Verilog与FPGA:校招笔试的加分项
4.1 Verilog语法陷阱:阻塞赋值与非阻塞赋值
Verilog的阻塞赋值和非阻塞赋值,是笔试里最容易出错的地方。阻塞赋值用“=”,非阻塞赋值用“<=”。在时序逻辑里,必须用非阻塞赋值;在组合逻辑里,用阻塞赋值。这个规则看起来简单,但考试里经常出一些模棱两可的代码让你判断输出。
阻塞赋值是顺序执行的,后面的语句会等待前面的语句执行完。非阻塞赋值是并行执行的,所有语句在时钟边沿同时计算,然后在时间步结束时统一更新。如果在时序逻辑里用了阻塞赋值,可能会产生竞争冒险,仿真结果和综合结果不一致。
我见过一道笔试题,给了一段用阻塞赋值的时序逻辑代码,问仿真输出是什么。很多人按顺序执行去算,结果算错了。因为阻塞赋值在时序逻辑里,虽然仿真时看起来是顺序执行的,但综合出来的电路可能和你想的不一样。正确的做法是,看到时序逻辑里的阻塞赋值,直接判定为“不推荐写法”,然后按非阻塞赋值的逻辑去分析。
实操心得:笔试里如果让你写代码,时序逻辑一律用非阻塞赋值,组合逻辑一律用阻塞赋值。如果让你改错,看到时序逻辑里的阻塞赋值,改成非阻塞赋值就对了。这个规则能帮你拿下不少分。
4.2 跨时钟域处理:笔试里的高阶考点
跨时钟域处理是FPGA和数字IC设计里的经典问题,景嘉微的笔试里也出现过。跨时钟域的核心问题是亚稳态。当一个信号从一个时钟域传到另一个时钟域时,如果两个时钟没有固定的相位关系,采样时可能采到信号跳变的中间状态,导致亚稳态。
解决亚稳态的常用方法是两级触发器同步。第一级触发器采样异步信号,第二级触发器再采样第一级的输出。两级触发器之间不需要组合逻辑,这样即使第一级出现亚稳态,第二级采样时信号已经稳定了。两级触发器的平均无故障时间可以计算,公式涉及触发器的亚稳态分辨时间常数和时钟频率。笔试里如果考计算,通常会给你这些参数,让你算MTBF。
对于多比特信号的跨时钟域,不能简单用两级触发器,因为多比特信号可能同时变化,采样时可能采到错误的组合。常用的方法是使用异步FIFO或者握手协议。异步FIFO用格雷码指针来避免多比特同时变化的问题,握手协议则通过请求和应答信号来确保数据稳定传输。
笔试里如果考跨时钟域,通常会让你画出同步电路的框图,或者分析某个跨时钟域电路是否存在问题。记住几个关键点:单比特信号用两级触发器,多比特信号用异步FIFO或握手,格雷码用于跨时钟域的计数器。
4.3 FPGA基础概念:从查找表到时钟资源
FPGA相关的概念在景嘉微的笔试里也会涉及,毕竟他们的产品线和FPGA有交集。FPGA的基本结构包括可编程逻辑块、可编程互连、可编程IO。可编程逻辑块的核心是查找表,通常是4输入或6输入的LUT。LUT本质上是一个小型的SRAM,用来实现组合逻辑函数。
笔试里可能会问:一个4输入LUT能实现多少个逻辑函数?答案是2的16次方,因为4输入有16种输入组合,每种组合对应一个输出位,所以有2的16次方种可能的真值表。这个数字很大,但实际设计中只会用到其中一部分。
FPGA的时钟资源也是考点。FPGA内部有专用的时钟网络,包括全局时钟、区域时钟和IO时钟。全局时钟可以驱动整个芯片,偏斜小但功耗高。区域时钟驱动一个区域,偏斜稍大但功耗低。IO时钟用于IO接口。笔试里可能会问:为什么FPGA设计里推荐使用全局时钟?答案是全局时钟的偏斜小,能保证时序收敛。
Block RAM和分布式RAM的区别也是常见考点。Block RAM是FPGA内部的专用存储块,容量大但数量有限。分布式RAM是用LUT实现的,容量小但灵活。笔试里如果问你什么时候用Block RAM,什么时候用分布式RAM,答案是:大容量存储用Block RAM,小容量或需要异步读写的用分布式RAM。
5. 笔试实战策略与避坑指南
5.1 时间分配:先拿稳分,再啃硬骨头
景嘉微的笔试通常是线上进行,时间一般在90到120分钟。题量不小,有选择题、填空题、简答题和设计题。我的建议是:选择题和填空题控制在40分钟内做完,简答题30分钟,设计题留40分钟,最后10分钟检查。
选择题里遇到不确定的,先标记,不要纠结。数字电路的选择题有时候考得很细,比如某个74系列芯片的引脚功能,你如果没记住,想再久也想不出来。不如先跳过,把能拿的分先拿到。填空题通常考基本概念,比如“触发器的建立时间是指什么”,这种题只要复习过就能写出来,不要空着。
设计题是拉分的关键。通常是一道组合逻辑设计加一道时序逻辑设计。组合逻辑设计可能是用MUX或译码器实现逻辑函数,时序逻辑设计可能是状态机或计数器。设计题一定要写清楚思路,即使最后代码没写完,思路对了也能拿步骤分。
注意:线上笔试通常有摄像头监考,不要切屏,不要查资料。一旦被判定作弊,成绩直接作废,还会影响后续投递。老老实实复习比什么都强。
5.2 常见陷阱:这些坑我替你踩过了
第一个坑:混淆“逻辑电平”和“逻辑值”。笔试里经常出现“高电平有效”和“低电平有效”的描述,很多人一看到“有效”就以为是1,其实低电平有效时,有效状态是0。比如74138译码器的输出是低电平有效,输出为0时表示该输出被选中。
第二个坑:忽略“无关项”。卡诺图化简时,无关项用X表示,可以当作1也可以当作0。很多人看到X就跳过,结果化简出来的表达式不是最简的。记住:无关项是你的朋友,用好了能少好几个项。
第三个坑:时序逻辑里忘记复位。Verilog代码里如果有时序逻辑,一定要有复位信号。笔试里如果让你写代码,没有复位的时序逻辑会被扣分。复位分同步复位和异步复位,异步复位用“posedge clk or negedge rst_n”,同步复位只用“posedge clk”。两种写法都要会。
第四个坑:状态机状态编码用二进制还是独热码。二进制编码用的触发器少,但组合逻辑复杂;独热码用的触发器多,但组合逻辑简单,而且不容易出现毛刺。笔试里如果问你选哪种,答案是:状态少的时候用二进制,状态多的时候用独热码。FPGA里因为触发器资源丰富,独热码更常用。
5.3 复习路线:从零到笔试通过
如果你现在距离笔试还有两周,我建议这样安排:第一周把数字逻辑基础过一遍,重点是卡诺图化简、触发器、时序分析。第二周做真题和模拟题,重点练状态机设计和Verilog代码。
具体来说,第一天的任务是数制转换和逻辑门,第二天是布尔代数和卡诺图,第三天是组合逻辑电路,第四天是触发器和锁存器,第五天是时序分析,第六天是状态机,第七天是Verilog语法。第二周开始做套题,每天一套,做完对答案,把错题整理出来,第二天再复习一遍。
复习资料方面,学校的数字电路教材就够了,重点是课后习题。Verilog方面,网上有很多开源的练习题,比如HDLBits,上面的题目和笔试难度接近,适合练手。FPGA基础概念可以看Xilinx或Altera的官方文档,不用看太深,了解基本结构就行。
实操心得:笔试前一天不要熬夜刷题,把之前整理的错题看一遍,早点睡觉。笔试当天提前半小时调试设备,确保摄像头和麦克风正常。做题时先易后难,遇到卡住的题先跳过,最后再回来想。
6. 从笔试到面试:你还需要准备什么
笔试通过之后,通常一到两周内会收到面试通知。景嘉微的面试一般有两到三轮,技术面会问项目经历和基础知识,HR面会问职业规划和薪资期望。
技术面里,面试官可能会让你画一个状态机,或者分析一个时序电路。这时候你要把笔试里学到的东西用上,但更重要的是展示你的思考过程。不要一上来就写答案,先说说你的思路,比如“我先分析这个电路的时钟域,然后看建立时间和保持时间是否满足”。面试官更看重你的分析能力,而不是你背了多少知识点。
项目经历方面,如果你做过FPGA相关的项目,比如图像处理、通信接口、信号发生器,一定要好好准备。面试官会问你项目的架构、你负责的部分、遇到的困难和解决方法。如果你没做过FPGA项目,可以说说课程设计或者竞赛经历,重点是展示你的动手能力和解决问题的能力。
最后说一句,景嘉微作为国内GPU领域的公司,对数字电路工程师的要求还是比较高的。笔试只是第一关,后面的面试才是真正的考验。但只要你把基础打牢,把常见的考点都复习到位,通过笔试并不难。我见过很多非科班的同学,认真复习两周就过了。关键是你愿不愿意花时间把那些看似简单但容易出错的知识点真正搞懂。
这个内容后续还可以这样扩展:如果你对FPGA实现具体算法感兴趣,可以看看图像边缘检测、串口通信、频率测量这些方向,这些都是笔试和面试里经常出现的项目场景。把笔试题和实际项目结合起来理解,你会发现很多知识点是相通的。