数字 IC 验证 手撕代码练习题(SV/UVM 方向,面试高频)
分为 4 个难度梯度:基础逻辑 → 时序电路 → 接口 / 协议 → UVM 验证,全部都是大厂手撕真题,附带考点 + 提示,适合白板 / 纸上手写练习。
手写优先:简洁、可综合 (Design 题) / 行为级 (验证题)、注释清晰、边界考虑、无语法坑
一、基础 SystemVerilog(必练,最常考)
题 1:脉冲展宽(展宽 N 个时钟周期)
题目:输入脉冲信号din(高有效单周期脉冲),输出dout,把脉冲展宽为 4 个时钟周期。同步复位,低电平复位。
考点:时序逻辑、计数器、边沿检测
要求:写 SV 代码 + 简单 testbench
题 2:边沿检测电路
题目:输入信号 sig,时钟 clk,rst_n。产生:上升沿脉冲 pos_pulse,下降沿脉冲 neg_pulse。
考点:打两拍、跨时钟域基础、边沿检测,面试超级高频
题 3:格雷码 ↔ 二进制转换(组合逻辑)
- 二进制转格雷码
- 格雷码转二进制
输入输出位宽:4bit。
考点:组合逻辑、格雷码公式,异步 FIFO 必考基础
题 4:异步 FIFO‑深度 8,写满 / 读空标志
手撕简化版,不需要完整 RTL,重点写空满判断逻辑 (格雷码指针比较)
考点:跨时钟域、格雷码打拍、空满判断,IC 验证最常被追问的电路之一
题 5:1‑to‑4 解串器(串行转并行)
输入:clk,rst_n,data_in (1bit);输出:data_out [3:0], valid。
每连续 4bit 串行输入,输出一次并行数据 + valid 脉冲。
考点:移位寄存器、计数器、valid 控制
题 6:循环移位寄存器
写一个 8bit 寄存器,每个时钟右移 1 位,最低比特移到最高位。
二、FSM 有限状态机(手撕重灾区!必练)
要求:三段式状态机(最推荐面试写法)
题 7:简单 AHB‑Lite Slave 状态机
状态:IDLE, READ, WRITE, WAIT
- HREADY=0 时插入等待周期;
- 完成读写回到 IDLE
考点:三段式 FSM、总线时序、阻塞 / 非阻塞
题 8:UART 接收状态机(简化版,波特率 9600,8N1)
输入 rx,检测起始位,接收 8bit 数据,输出 rx_data & rx_valid。
不用写波特率分频器,状态机主体即可。
三、验证行为级题目(验证岗重点!不用可综合)
这一类验证工程师最爱手撕,不需要综合,面向仿真、数据流处理。
题 9:写一个 SV 队列实现 FIFO 模型(参考模型)
用queue[$]实现一个深度 16 的 FIFO。
任务:
- push (data):写入数据;满时打印报错
- pop ():读出数据;空时打印报错
输出:data, empty, full 信号
考点:SV 队列、动态存储、参考模型建模
题 10:数据包发生器,随机生成以太网帧
定义结构体eth_pkt:
typedef struct{ bit [47:0] dst_mac; bit [47:0] src_mac; bit [15:0] ether_type; byte payload[$]; } eth_pkt;写一个 task,随机生成 eth_pkt,payload 长度 20~100 字节。
考点:随机化、约束、队列,UVM sequence 基础
题 11:比较两个数组,打印出不相等的索引和数值
输入两个bit [31:0] a[0:99],b[0:99];遍历对比,打印所有失配位置。
考点:for 循环、仿真打印,scoreboard 最基础代码
题 12:实现一个简单 scoreboard(mailbox)
- monitor 发包送入 mailbox;
- scoreboard 从 mailbox 收包;
- 和期望数据包对比,打印 pass/fail。
考点:mailbox、进程间通信,验证高频
四、UVM 手撕真题(验证岗核心!大厂必考)
白板手写,不需要编译通过,框架、宏、phase、TLM 写对即可
题 13:最简 uvm_driver
要求:
- 继承 uvm_driver #(trans)
run_phase中调用 seq_item_port.get_next_item (),驱动 dut,item_done ()- field‑macro,new 函数。
高频!几乎每家验证面试都会让你默写 driver 框架
题 14:最简 uvm_monitor + analysis_port
monitor 采集 DUT 信号,打包成 transaction,通过 analysis_port 广播出去。
考点:uvm_analysis_port,TLM 广播
题 15:uvm_scoreboard,实现 analysis_imp 接收数据包
写出 scoreboard,实现 write () 回调函数,收到 transaction 打印信息。
考点:uvm_analysis_imp_decl,TLM imp 回调
题 16:写一个 uvm_sequence,发送 10 个随机 transaction
继承 uvm_sequence #(trans);body () 任务,循环 10 次uvm_do(req)。
题 17:默写 uvm_env 框架
包含 agent,scoreboard;连接 agent.monitor.ap → scb.imp;build_phase,connect_phase。
题 18:uvm_test 示例
在 build_phase 启动 sequence。
💡面试高频追问清单 (写完代码大概率会问)
- build_phase /connect_phase 顺序?为什么 connect 不能放 build?
- seq_item_port.get_next_item 和 try_next_item 区别?
- analysis_port 能不能连接多个 imp?
五、协议类进阶手撕(SOC / 接口验证高频)
题 19:I2C Slave 行为模型(SV task 版)
用 task 模拟 I2C 从设备,接收 7bit 地址 + 读写位,返回 ACK。
题 20:APB Master 激励 task
写 task apb_write (addr,data),产生完整 APB 写时序;task apb_read (addr,output data)。
考点:APB 时序,激励建模,非常高频
题 21:AXI‑Stream,写一个送数据包的 task
输入数据包队列,依次送出,支持 tready 反压。
练习建议(手撕备考策略)
- 优先顺序:边沿检测→格雷码→异步 FIFO 空满→三段式 FSM→APB task→mailbox scoreboard→driver/monitor/sequence/env/test 全套 UVM 框架默写
- 手写要求:纸上写,不要 IDE,分清
=阻塞 /<=非阻塞;UVM 宏不要写错 - 写完自己给自己提问:复位怎么处理?有没有 x 态?反压有没有考虑?边界情况?
如果你需要,我可以把上面任意一题给出一份标准手写参考答案,或者再给你一套「20 道高频手撕题 + 参考答案完整版 PDF 文本」。
推荐一些数字ic验证工程师职位的面试经验
数字ic验证工程师职位的薪资水平如何?
数字ic验证工程师需要掌握哪些技能?