☰
SV/UVM 练习
2026/10/28 11:01:14 网站建设 项目流程

数字 IC 验证 手撕代码练习题(SV/UVM 方向,面试高频)

分为 4 个难度梯度:基础逻辑 → 时序电路 → 接口 / 协议 → UVM 验证,全部都是大厂手撕真题,附带考点 + 提示,适合白板 / 纸上手写练习。
手写优先:简洁、可综合 (Design 题) / 行为级 (验证题)、注释清晰、边界考虑、无语法坑

一、基础 SystemVerilog(必练,最常考)

题 1:脉冲展宽(展宽 N 个时钟周期)

题目:输入脉冲信号din(高有效单周期脉冲),输出dout,把脉冲展宽为 4 个时钟周期。同步复位,低电平复位。
考点:时序逻辑、计数器、边沿检测

要求:写 SV 代码 + 简单 testbench

题 2:边沿检测电路

题目:输入信号 sig,时钟 clk,rst_n。产生:上升沿脉冲 pos_pulse,下降沿脉冲 neg_pulse。
考点:打两拍、跨时钟域基础、边沿检测,面试超级高频

题 3:格雷码 ↔ 二进制转换(组合逻辑)

  1. 二进制转格雷码
  2. 格雷码转二进制
    输入输出位宽: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

要求:

  1. 继承 uvm_driver #(trans)
  2. run_phase中调用 seq_item_port.get_next_item (),驱动 dut,item_done ()
  3. 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。

💡面试高频追问清单 (写完代码大概率会问)

  1. build_phase /connect_phase 顺序?为什么 connect 不能放 build?
  2. seq_item_port.get_next_item 和 try_next_item 区别?
  3. 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 反压。


练习建议(手撕备考策略)

  1. 优先顺序:边沿检测→格雷码→异步 FIFO 空满→三段式 FSM→APB task→mailbox scoreboard→driver/monitor/sequence/env/test 全套 UVM 框架默写
  2. 手写要求:纸上写,不要 IDE,分清=阻塞 /<=非阻塞;UVM 宏不要写错
  3. 写完自己给自己提问:复位怎么处理?有没有 x 态?反压有没有考虑?边界情况?

如果你需要,我可以把上面任意一题给出一份标准手写参考答案,或者再给你一套「20 道高频手撕题 + 参考答案完整版 PDF 文本」。

推荐一些数字ic验证工程师职位的面试经验

数字ic验证工程师职位的薪资水平如何?

数字ic验证工程师需要掌握哪些技能?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询