数字电路学习者
总结一下:
高频题型:状态机、跨时钟域同步、仲裁器、序列检测/发生、数据流控制(带握手)、简单运算单元。
准备方法:每个类型找2-3道经典题,在纸上或纯文本编辑器手写,计时。写完对比标准答案,注意细节(复位、默认赋值、信号命名)。
笔试时先理清题意,画框图或时序图,再写代码。时间紧的话写核心逻辑,注释补全。
总结一下:
高频题型:状态机、跨时钟域同步、仲裁器、序列检测/发生、数据流控制(带握手)、简单运算单元。
准备方法:每个类型找2-3道经典题,在纸上或纯文本编辑器手写,计时。写完对比标准答案,注意细节(复位、默认赋值、信号命名)。
笔试时先理清题意,画框图或时序图,再写代码。时间紧的话写核心逻辑,注释补全。
近两年一些公司考SystemVerilog的比例增加了。可能会考:
1. 用SV写一个简单的类(class)或者随机化测试。
2. interface的使用,简化连接。
3. 断言(assertion)写个简单的时序检查。
虽然手撕代码可能还是Verilog为主,但SV的特性最好了解,尤其是interface和package,写起来更简洁。
大厂笔试可能结合应用场景,比如:
“设计一个模块,从接口接收不定长数据包,提取包头中的长度字段,然后根据长度接收数据体,并输出。” 这综合了状态机、计数器、数据流控制。
解题思路:定义状态(IDLE、HEAD、BODY),用计数器控制接收长度,注意边界条件。代码模块化,写好注释。
分享我的刷题列表:
1. 仲裁器(固定优先级、轮询)
2. 跨时钟域同步(单比特、多比特、脉冲同步)
3. 状态机(三段式序列检测)
4. 数据对齐与打包(如字节对齐)
5. 简单计数器与分频(奇数分频、小数分频)
6. 乘法器与加法器(结构描述)
7. FIFO(同步、异步)
8. 时钟切换与门控
每个类型自己手写一遍,记关键点。
除了模块设计,有时会出一些代码改错或分析题。比如给一段有综合问题的代码(锁存器、异步复位问题、敏感列表不全),让你指出错误并改正。或者分析电路面积、时序。
所以手写代码不仅要会写,还要懂背后电路。平时练习用Vivado或Quartus综合一下,看RTL图。
我遇到过一个题:设计一个参数化的时钟门控单元。考查对低功耗设计和同步电路的理解。代码不长,但要注意避免毛刺。
还有一次考了异步FIFO的指针比较和空满判断(格雷码转换、同步)。不一定要写完整FIFO,但关键部分要熟练。
建议把《Verilog编程艺术》里的小例子过一遍,很多笔试原题。
补充几个常考题:
1. 边沿检测:上升沿、下降沿、双边沿,同步和异步的写法都要会。
2. 按键消抖:虽然简单,但有时会考,用计数器实现。
3. 奇偶校验:计算数据奇偶校验位。
这些题目短小,适合笔试限时。写的时候注意代码风格,用assign和always块合理分配。
AI芯片公司可能会考一些矩阵操作相关的小模块,比如简单的累加器(accumulator)、定点数乘法加法(涉及溢出处理)。或者数据流控制,比如实现一个带反压的简单流水线。
建议复习一下AXI Stream接口的基本握手代码(tvalid/tready),笔试可能让你写个A Stream到B Stream的转换桥接。
去年面了七八家,手撕代码除了经典题,出现过高频的有:
1. 脉冲检测与同步:检测输入脉冲,在另一个时钟域产生同步脉冲。考跨时钟域和边沿检测结合。
2. 序列发生器:比如用移位寄存器或状态机产生特定序列。
3. 数据位宽转换:如8位转32位,带valid信号握手。考查对数据流和握手协议的理解。
思路都是先画时序图,再写代码,valid/ready信号不能漏。
从面试官角度说几句。我们确实爱考仲裁器(Round Robin、Fixed Priority),尤其是带请求、授权信号的。让你写一个固定优先级的仲裁,或者轮询仲裁。关键点是处理好请求撤销和授权切换,代码要简洁。
还会考一些基础运算单元,比如无符号乘法器(写个简单booth或Wallace树思路)、加法器(超前进位)。不一定写全,但结构要清楚。
秋招刚上岸的来答一下。除了FIFO和分频,状态机绝对是必考,尤其是米勒和摩尔型的区别,以及三段式写法。题目可能是序列检测(比如检测1011),或者简单交通灯控制。手写时一定注意状态编码(二进制、独热码选择)、现态次态逻辑分开。建议直接默写三段式模板,不容易出错。
另外异步处理常考,单比特信号跨时钟域打两拍,多比特用异步FIFO或握手。笔试可能让你写个打两拍的代码,或者分析为什么不能直接打两拍。