准备秋招笔试,刷题时发现很多经验贴都提到 FIFO 和时钟分频。想了解除了这些经典题,近一两年芯片公司(尤其是大厂和 AI 芯片公司)的数字 IC/FPGA 笔试中,还经常出现哪些需要手写代码的题目?比如状态机设计、仲裁器、异步处理、或者一些结合特定应用场景的模块?求分享高频题型和解题思路。
芯片公司笔试中的“手撕代码”环节,除了 FIFO 和分频器,还常考哪些 Verilog/SystemVerilog 题目?
提问
回答 11

秋招刚上岸的来答一下。除了FIFO和分频,状态机绝对是必考,尤其是米勒和摩尔型的区别,以及三段式写法。题目可能是序列检测(比如检测1011),或者简单交通灯控制。手写时一定注意状态编码(二进制、独热码选择)、现态次态逻辑分开。建议直接默写三段式模板,不容易出错。
另外异步处理常考,单比特信号跨时钟域打两拍,多比特用异步FIFO或握手。笔试可能让你写个打两拍的代码,或者分析为什么不能直接打两拍。

从面试官角度说几句。我们确实爱考仲裁器(Round Robin、Fixed Priority),尤其是带请求、授权信号的。让你写一个固定优先级的仲裁,或者轮询仲裁。关键点是处理好请求撤销和授权切换,代码要简洁。
还会考一些基础运算单元,比如无符号乘法器(写个简单booth或Wallace树思路)、加法器(超前进位)。不一定写全,但结构要清楚。

去年面了七八家,手撕代码除了经典题,出现过高频的有:
1. 脉冲检测与同步:检测输入脉冲,在另一个时钟域产生同步脉冲。考跨时钟域和边沿检测结合。
2. 序列发生器:比如用移位寄存器或状态机产生特定序列。
3. 数据位宽转换:如8位转32位,带valid信号握手。考查对数据流和握手协议的理解。
思路都是先画时序图,再写代码,valid/ready信号不能漏。

AI芯片公司可能会考一些矩阵操作相关的小模块,比如简单的累加器(accumulator)、定点数乘法加法(涉及溢出处理)。或者数据流控制,比如实现一个带反压的简单流水线。
建议复习一下AXI Stream接口的基本握手代码(tvalid/tready),笔试可能让你写个A Stream到B Stream的转换桥接。

补充几个常考题:
1. 边沿检测:上升沿、下降沿、双边沿,同步和异步的写法都要会。
2. 按键消抖:虽然简单,但有时会考,用计数器实现。
3. 奇偶校验:计算数据奇偶校验位。
这些题目短小,适合笔试限时。写的时候注意代码风格,用assign和always块合理分配。

我遇到过一个题:设计一个参数化的时钟门控单元。考查对低功耗设计和同步电路的理解。代码不长,但要注意避免毛刺。
还有一次考了异步FIFO的指针比较和空满判断(格雷码转换、同步)。不一定要写完整FIFO,但关键部分要熟练。
建议把《Verilog编程艺术》里的小例子过一遍,很多笔试原题。

除了模块设计,有时会出一些代码改错或分析题。比如给一段有综合问题的代码(锁存器、异步复位问题、敏感列表不全),让你指出错误并改正。或者分析电路面积、时序。
所以手写代码不仅要会写,还要懂背后电路。平时练习用Vivado或Quartus综合一下,看RTL图。

分享我的刷题列表:
1. 仲裁器(固定优先级、轮询)
2. 跨时钟域同步(单比特、多比特、脉冲同步)
3. 状态机(三段式序列检测)
4. 数据对齐与打包(如字节对齐)
5. 简单计数器与分频(奇数分频、小数分频)
6. 乘法器与加法器(结构描述)
7. FIFO(同步、异步)
8. 时钟切换与门控每个类型自己手写一遍,记关键点。

大厂笔试可能结合应用场景,比如:
“设计一个模块,从接口接收不定长数据包,提取包头中的长度字段,然后根据长度接收数据体,并输出。” 这综合了状态机、计数器、数据流控制。
解题思路:定义状态(IDLE、HEAD、BODY),用计数器控制接收长度,注意边界条件。代码模块化,写好注释。

近两年一些公司考SystemVerilog的比例增加了。可能会考:
1. 用SV写一个简单的类(class)或者随机化测试。
2. interface的使用,简化连接。
3. 断言(assertion)写个简单的时序检查。虽然手撕代码可能还是Verilog为主,但SV的特性最好了解,尤其是interface和package,写起来更简洁。
发表回答
登录后可在本页底部提交回答
