SoC验证工程师面试常见问题(三)
在 SoC 验证工程师的面试中,面试官可能会要求候选人现场编写 SystemVerilog、UVM (Universal Verification Methodology) 或 SystemC 代码,以评估其编程能力、语言掌握程度以及解决实际验证问题的能力。这种随机抽题写代码的环节通常会涵盖基础语法、面向对象编程 (OOP)、约束随机化、UVM 组件设计等核心概念。以下是可能会出现的题目类型、示例题目及其参考答案,覆盖常见的主题如面向对象、约束、内存管理等。
1. SystemVerilog 相关代码题目
SystemVerilog 是验证工程师最常用的语言,面试中可能会要求写代码来验证基本概念和验证技巧。
主题 1:面向对象编程 (OOP)
题目 1:编写一个简单的类,包含属性和方法,并展示继承和多态性。
- 目的:考察 OOP 基础知识,包括类定义、继承、虚方法等。
- 题目描述:定义一个基类
Vehicle
,包含属性speed
和虚方法drive()
。然后定义一个子类Car
,覆盖drive()
方法并添加特有方法honk()
。在initial
块中实例化并调用相关方法。 - 参考答案:
class Vehicle; int speed; function new(int s = 0); speed = s; endfunction virtual function void drive(); $display("Vehicle is driving at speed %0d", speed); endfunction endclass class Car extends Vehicle; function new(int s = 0); super.new(s); endfunction function void drive(); $display("Car is driving at speed %0d", speed); endfunction function void honk(); $display("Car is honking!"); endfunction endclass program main; initial begin Vehicle v; Car c = new(60); v = c; // 向上转换 v.drive(); // 输出: Car is driving at speed 60 if ($cast(c, v)) begin c.honk(); // 输出: Car is honking! end end endprogram
- 关键点:展示
virtual
方法的多态性,$cast()
的向下转换用法。
主题 2:约束随机化
题目 2:编写一个类,包含随机变量和约束,用于生成特定范围的地址。
- 目的:考察随机化和约束的使用,验证工程师常用于生成随机激励。
- 题目描述:定义一个类
MemoryAccess
,包含随机变量addr
(32 位地址)和data
(32 位数据)。添加约束,使addr
限制在 0x1000 到 0x1FFF 范围内,且对齐到 4 字节边界。编写测试代码调用randomize()
。 - 参考答案:
class MemoryAccess; rand bit [31:0] addr; rand bit [31:0] data; constraint addr_range { addr >= 32'h1000; addr <= 32'h1FFF; addr % 4 == 0; // 4 字节对齐 } function void displ