1. 景嘉微校招数字电路笔试到底在考什么
景嘉微这家公司,做国产GPU的,在图形显控和雷达领域深耕多年,对数字前端和FPGA方向的人才需求一直很稳定。它的校招数字电路工程师笔试,跟互联网大厂那种纯算法题完全不是一个路子,更偏向硬件底层功底和工程直觉。我前后帮几个学弟复盘过这场笔试,也跟圈内做过类似岗位的朋友聊过,发现它的出题逻辑其实很清晰:数字电路基础要扎实,Verilog不能只会写不能综合的代码,时序分析得能上手算,FPGA工程思维得有。
这场笔试面向的是校招应届生,所以不会考太偏的工艺知识,但也不会只考课本上的卡诺图化简。它更像是一个筛选器,把那些“只会考试不会做项目”和“真正动手写过FPGA代码”的人区分开。如果你正在准备这类笔试,或者想搞清楚数字电路工程师校招到底该复习到什么深度,下面这些内容应该能帮你少走不少弯路。
先说一下整体印象。景嘉微的笔试卷子通常分几个大块:数字电路基础、Verilog HDL、时序与约束、FPGA相关常识、少量C语言和计算机体系结构。题量不算特别大,但每道题都有一定的区分度,尤其是时序计算和Verilog综合相关的题目,很多人在这里翻车。我见过一个学弟,数电课本背得滚瓜烂熟,结果一道“给定建立时间和保持时间,判断电路能否正常工作”的题直接空着,因为他从来没在实际项目里算过这些东西。
注意:景嘉微的笔试不是纯选择题,有填空题、简答题和设计题。设计题往往要求写出完整的Verilog模块并附带testbench思路,所以光看不练肯定不行。
2. 数字电路基础:从课本到笔试的距离
2.1 组合逻辑与时序逻辑的边界感
数字电路基础这块,笔试不会直接问你“什么是组合逻辑”,而是给你一个电路图或者一段描述,让你判断输出波形或者分析竞争冒险。景嘉微的题目里经常出现多路选择器、译码器、加法器这些基本模块的组合,然后让你分析某个输入变化时输出会不会出现毛刺。
我印象比较深的一道题是:用两个2选1多路选择器和一个非门搭一个电路,问当选择信号从0变到1时,输出端是否可能产生毛刺。这种题考的不是死记硬背,而是你对信号传播延迟的理解。在实际FPGA设计里,毛刺如果不影响最终采样结果,通常可以忽略;但如果直接驱动异步复位或者时钟使能,那就可能出大问题。
复习建议是这样:把组合逻辑的竞争冒险搞清楚,知道代数法和卡诺图法怎么判断险象,更重要的是理解为什么在同步电路里毛刺通常不是问题。时序逻辑部分,触发器的建立时间、保持时间、传输延迟这三个参数必须烂熟于心,因为后面时序计算的题全靠它们。
2.2 状态机与编码方式的取舍
状态机是数字电路笔试的必考项。景嘉微的题目里,状态机通常不会只让你画状态转移图,而是给你一个实际场景,比如“设计一个序列检测器,检测到1011时输出高电平”,然后要求你用Verilog实现,并且说明你选择二进制编码、格雷码还是独热码。
这里就涉及到一个很实际的工程问题。独热码在FPGA里很常用,因为FPGA的触发器资源相对丰富,而组合逻辑资源相对紧张。独热码每个状态只用一个触发器,状态译码逻辑简单,速度容易做上去。但如果你用的是CPLD或者资源受限的场合,二进制编码或者格雷码就更合适。格雷码的好处是相邻状态切换时只有一位变化,能降低功耗和毛刺风险。
实操心得:在笔试里遇到状态机编码的选择题,如果题目没有特别说明资源限制,优先选独热码并解释理由——FPGA触发器多、译码逻辑简单、时序容易收敛。这个答案在景嘉微这类以FPGA为主的公司里基本不会错。
2.3 时钟与复位设计的细节
时钟和复位是数字电路里最容易被忽视但又最容易出问题的地方。景嘉微的笔试里有一类题是给你一个异步复位、同步释放的电路,让你分析复位撤除时是否会出现亚稳态。这个知识点在实际项目里非常关键,因为异步复位同步释放是FPGA设计的标准做法。
具体来说,异步复位的好处是复位信号不需要时钟参与,上电就能生效;但缺点是复位撤除时如果刚好在时钟边沿附近,触发器的输出可能进入亚稳态。解决办法就是用两级触发器对复位信号进行同步,把撤除边沿对齐到时钟域内。笔试里经常让你画出这个电路的波形,或者写出Verilog代码。
module reset_sync ( input wire clk, input wire rst_async_n, output wire rst_sync_n ); reg rst_meta, rst_sync; always @(posedge clk or negedge rst_async_n) begin if (!rst_async_n) begin rst_meta <= 1'b0; rst_sync <= 1'b0; end else begin rst_meta <= 1'b1; rst_sync <= rst_meta; end end assign rst_sync_n = rst_sync; endmodule这段代码看起来简单,但笔试里能完整写对的人并不多。很多人会忘记复位撤除后的两个周期延迟,或者把同步级数搞错。
3. Verilog HDL:笔试里最容易拉开差距的部分
3.1 可综合与不可综合的界限
Verilog笔试题里,景嘉微特别喜欢考“下面这段代码能不能综合”或者“综合出来是什么电路”。比如initial块、#10延时、while循环这些,在仿真里能用,但综合工具通常不支持。笔试里会给你一段代码,让你指出哪些语句不可综合,并改成可综合的写法。
我见过一道题,用for循环写了一个移位寄存器,问综合后是什么结构。很多人以为for循环会被综合成循环结构,实际上在Verilog里,for循环如果循环次数是常数,综合工具会把它展开成并行逻辑。所以那段代码综合出来就是一串级联的触发器,而不是什么“循环电路”。
注意:笔试里遇到
for循环,先看循环边界是不是常数。是常数就展开,不是常数就不可综合。这个判断标准能帮你快速排除错误选项。
3.2 阻塞赋值与非阻塞赋值的经典陷阱
阻塞赋值=和非阻塞赋值<=的区别,是Verilog笔试的保留节目。景嘉微的题目里经常出现两个always块,一个用阻塞赋值一个用非阻塞赋值,然后问你输出波形有什么不同。标准答案是:时序逻辑用非阻塞赋值,组合逻辑用阻塞赋值。但笔试不会只考这句话,它会给你一段混合使用的代码,让你分析仿真结果和综合结果的差异。
举个例子,两个触发器串联,如果用阻塞赋值写:
always @(posedge clk) begin q1 = d; q2 = q1; end综合出来只有一个触发器,因为q1 = d立即生效,q2 = q1拿到的是更新后的q1,也就是d。如果用非阻塞赋值:
always @(posedge clk) begin q1 <= d; q2 <= q1; end综合出来是两个触发器串联,q2比q1晚一个周期。这个区别在笔试里经常用波形图来考,你得能准确画出每个时钟沿之后各信号的值。
3.3 有限状态机的Verilog实现套路
状态机的Verilog实现,笔试里通常要求你写出完整代码。景嘉微的题目偏向于三段式状态机:第一段时序逻辑更新当前状态,第二段组合逻辑计算次态,第三段时序逻辑或组合逻辑产生输出。三段式的好处是逻辑清晰、易于综合和调试,缺点是输出如果放在组合逻辑里可能会有毛刺。
module seq_detector ( input wire clk, input wire rst_n, input wire din, output reg dout ); localparam S0 = 3'b001, S1 = 3'b010, S2 = 3'b100; reg [2:0] cur_state, nxt_state; always @(posedge clk or negedge rst_n) begin if (!rst_n) cur_state <= S0; else cur_state <= nxt_state; end always @(*) begin case (cur_state) S0: nxt_state = din ? S1 : S0; S1: nxt_state = din ? S1 : S2; S2: nxt_state = din ? S1 : S0; default: nxt_state = S0; endcase end always @(posedge clk or negedge rst_n) begin if (!rst_n) dout <= 1'b0; else dout <= (cur_state == S2 && din); end endmodule这段代码在笔试里能拿高分,因为它体现了你对状态机结构的理解。注意输出用了寄存器打一拍,避免了组合逻辑毛刺,这在工程里是常见做法。
4. 时序分析:笔试里的硬骨头
4.1 建立时间与保持时间的计算
时序计算是景嘉微笔试里区分度最高的部分。题目通常给你几个参数:触发器的建立时间Tsu、保持时间Th、时钟到输出延迟Tco、组合逻辑延迟Tcomb、时钟偏斜Tskew,然后让你判断电路能跑到的最高频率,或者判断是否存在时序违例。
建立时间检查的公式是:
Tclk >= Tco + Tcomb + Tsu - Tskew保持时间检查的公式是:
Tco + Tcomb >= Th + Tskew这两个公式必须背下来,而且要知道每个参数的含义。笔试里经常把Tskew的正负号搞反,或者忘记Tco。我建议你在草稿纸上画一个简单的触发器到触发器的路径图,把每个延迟标上去,这样不容易出错。
实操心得:算最高频率时,先算建立时间约束,因为建立时间通常比保持时间更紧。如果题目问“电路能否工作在XXX MHz”,先算周期,再代入公式比较。保持时间违例通常出现在组合逻辑延迟太小的情况下,这时候需要插入缓冲器来增加延迟。
4.2 时钟域交叉与亚稳态
时钟域交叉是FPGA设计里的经典问题,笔试里也经常考。景嘉微的题目可能会给你一个慢时钟域到快时钟域的信号,问你怎么安全地传递。标准答案是:单比特信号用两级触发器同步,多比特信号用异步FIFO或者握手协议。
两级触发器同步的原理是让亚稳态有足够的时间衰减到稳定值。第一级触发器可能进入亚稳态,但在一个时钟周期内通常会稳定下来,第二级触发器采样到的就是稳定值。笔试里会问你“两级触发器够不够”,答案取决于时钟频率和触发器的亚稳态衰减时间,但在大多数校招笔试里,两级是标准答案。
多比特信号不能用简单的两级触发器同步,因为各个比特的延迟可能不同,导致采样到错误的数据。这时候需要用格雷码或者握手协议。格雷码保证每次只有一个比特变化,同步后不会出现多比特同时跳变的问题。握手协议则是用请求和应答信号来确保数据稳定后再采样。
4.3 时序约束的基本写法
景嘉微的笔试里有时会考时序约束的写法,比如让你写出一个时钟周期的约束或者输入输出延迟的约束。虽然校招不会要求你精通SDC语法,但基本的create_clock、set_input_delay、set_output_delay得知道。
create_clock -name clk -period 10 [get_ports clk] set_input_delay -clock clk -max 2 [get_ports data_in] set_output_delay -clock clk -max 3 [get_ports data_out]这段约束的意思是:时钟周期10ns,输入数据在时钟边沿后最多2ns到达,输出数据需要在时钟边沿前最多3ns稳定。笔试里可能会让你根据这些参数计算建立时间和保持时间的余量。
5. FPGA工程常识:笔试里的加分项
5.1 FPGA基本架构与资源类型
景嘉微是做GPU的,但笔试里FPGA相关的内容不少。题目可能会问你FPGA的基本组成部分:可编程逻辑块、可编程互连、可编程IO、时钟资源、块RAM、DSP切片。你需要知道每种资源适合做什么,比如DSP切片适合做乘加运算,块RAM适合做数据缓存,分布式RAM适合做小容量存储。
笔试里经常考的一道题是:“实现一个16x16的乘法器,应该用什么资源?”答案是DSP切片,因为FPGA里的DSP硬核就是为乘加运算设计的,用查找表实现乘法器会消耗大量逻辑资源。类似地,实现一个深度1024、位宽8的FIFO,应该用块RAM而不是分布式RAM。
5.2 跨时钟域处理的工程实践
跨时钟域处理在FPGA项目里非常常见,笔试里也会考。除了前面说的两级触发器同步和异步FIFO,还有一种常见方法是脉冲同步器,用于把快时钟域的脉冲信号同步到慢时钟域。脉冲同步器的原理是用快时钟域的信号翻转一个寄存器,然后在慢时钟域检测这个翻转,再还原成脉冲。
注意:脉冲同步器要求输入脉冲的宽度大于慢时钟周期,否则可能丢失。笔试里如果题目没有说明时钟频率关系,默认快时钟域到慢时钟域需要脉冲展宽。
5.3 常见接口协议与实现要点
景嘉微的笔试里偶尔会考UART、SPI、I2C这些常见接口。UART的波特率计算是高频考点:波特率 = 时钟频率 / 分频系数。比如时钟50MHz,想要115200的波特率,分频系数就是50_000_000 / 115200 ≈ 434。笔试里可能会让你写出分频系数的计算过程,或者画出UART发送模块的状态转移图。
SPI和I2C的考点主要集中在时序图上。SPI的四种模式(CPOL和CPHA的组合)必须清楚,I2C的起始条件、停止条件、应答位也得知道。这些内容在实际项目里经常用到,笔试里考到就是送分题。
6. 常见问题与排查技巧实录
6.1 笔试中容易踩的坑
| 问题类型 | 常见错误 | 正确做法 |
|---|---|---|
| 时序计算 | 忘记Tco或搞错Tskew符号 | 画路径图,逐项标注延迟 |
| Verilog综合 | 在时序逻辑里用阻塞赋值 | 时序逻辑一律用非阻塞赋值 |
| 状态机编码 | 默认选二进制编码 | 无资源限制时优先独热码 |
| 跨时钟域 | 多比特信号用两级触发器 | 用格雷码或异步FIFO |
| 毛刺分析 | 认为所有毛刺都必须消除 | 同步电路里毛刺通常可忽略 |
6.2 复习节奏与时间分配
如果你有一个月时间准备,我建议这样分配:第一周把数字电路基础过一遍,重点看组合逻辑、时序逻辑、状态机;第二周集中刷Verilog笔试题,尤其是可综合性和阻塞非阻塞赋值;第三周攻时序分析和跨时钟域;第四周做真题模拟,查漏补缺。
每天至少写两段Verilog代码,不用太复杂,但一定要手写,因为笔试是纸笔作答,不写代码手会生。我见过太多人平时用IDE写代码习惯了,笔试时连always块的敏感列表都写不全。
6.3 面试环节的衔接准备
笔试过了之后通常会有面试,面试里会问项目经历和基础知识。如果你笔试里写了状态机或者跨时钟域的题,面试官可能会让你展开讲。所以笔试里写的答案,自己得能解释清楚。比如你选了独热码,面试官可能会问“如果资源受限怎么办”,你得能说出二进制编码或者格雷码的适用场景。
实操心得:笔试里遇到不确定的题,尽量写出你的分析过程,哪怕最终答案不对,过程分也能拿不少。景嘉微的笔试卷子有简答题,阅卷老师会看你的思路。
7. 从笔试到项目实战的思维转换
7.1 笔试代码和工程代码的差距
笔试里写的Verilog代码,通常只要求功能正确、结构清晰。但实际工程里的代码,还要考虑可综合、可测试、可维护。比如笔试里你可能直接写一个always @(*)组合逻辑输出,工程里可能会打一拍寄存器输出,避免毛刺。笔试里你可能用initial块初始化寄存器,工程里必须用复位信号。
这个差距在面试里经常被问到。面试官会问你“笔试里写的代码如果放到项目里,需要改什么”。你得能说出至少三点:加复位、加时序约束、加testbench验证。
7.2 FPGA项目实战的常见入口
如果你笔试过了,想提前准备面试里的项目环节,可以从这几个方向入手:串口通信、图像处理、频率测量、信号发生器。这些项目在FPGA里很经典,资料也多。比如串口发送ASCII字符串,涉及波特率生成、状态机、移位寄存器,能把数字电路的基础知识串起来。频率测量涉及计数器和时钟域处理,能体现你对时序的理解。
景嘉微做GPU和图形显控,如果你有图像处理相关的FPGA项目经验,面试里会很加分。比如基于FPGA的图像边缘检测,用Verilog实现Sobel算子,涉及行缓存、卷积计算、阈值判断,能展示你对数据流和时序的掌控能力。
7.3 长期学习路径建议
数字电路工程师这条路,笔试只是第一关。后面还有面试、实习、转正。长期来看,你需要掌握的东西包括:Verilog/SystemVerilog、时序约束、脚本语言(Tcl/Python)、FPGA开发工具链、至少一种高速接口协议。如果你对GPU方向感兴趣,还需要了解计算机体系结构、图形管线、并行计算。
我个人的经验是,不要只盯着笔试题目刷,那样就算过了笔试,面试也会露馅。真正把一个小项目从头到尾做一遍,从需求分析到代码实现到上板调试,比刷一百道笔试题收获更大。景嘉微这类公司看重的是工程能力,不是考试能力。
最后再分享一个小技巧:笔试前一天,把建立时间保持时间的公式默写一遍,把阻塞非阻塞赋值的区别默写一遍,把状态机三段式结构默写一遍。这三样东西在景嘉微的笔试里出现频率极高,默写一遍能让你在考场上省下不少时间。