资讯动态

SystemVerilog UVM 手把手教学 - 第 1 课

发布时间:2026/9/15 7:40:30 来源:尧图企业网站定制
SystemVerilog UVM 手把手教学 - 第 1 课你好呀欢迎来到 UVM 的世界 我会用最通俗的方式带你从零开始不用担心我们一步一步来。一、先搞懂UVM 到底是什么一句话解释UVMUniversal Verification Methodology是一套用 SystemVerilog 写好的验证框架库帮我们规范地验证芯片设计是否正确。打个比方你设计了一个电路DUT待测设计比如一个加法器。你要验证它给它各种输入看输出对不对。如果只写initial块手动喂数据太乱、太累、不好复用。UVM 就是一套标准化的测试流水线谁来产生数据、谁来驱动、谁来收结果、谁来比对都分工明确。二、UVM 的核心思想分三层textCopyDownload┌─────────────────────────────────────┐ │ Test测试用例 │ ← 决定这次测什么 ├─────────────────────────────────────┤ │ Environment环境 │ ← 搭好整套流水线 │ ├── Agent代理 │ │ │ ├── Sequencer序列器 │ ← 发数据 │ │ ├── Driver驱动器 │ ← 把数据变成信号 │ │ └── Monitor监视器 │ ← 采集信号 │ └── Scoreboard记分板 │ ← 比对结果 ├─────────────────────────────────────┤ │ DUT你设计的电路 │ ← 被验证的对象 └─────────────────────────────────────┘记住这个口诀Sequence产生事务transaction一个数据包Sequencer把事务发给 DriverDriver把事务翻译成引脚信号打给 DUTMonitor从 DUT 引脚采集信号还原成事务Scoreboard拿 Monitor 采的数据和期望值比对三、第一个例子验证一个简单加法器3.1 DUT先有被验证的东西systemverilogCopyDownload// adder.sv module adder ( input logic clk, input logic rst_n, input logic [7:0] a, input logic [7:0] b, output logic [8:0] sum // 9位防止溢出 ); always_ff (posedge clk or negedge rst_n) begin if (!rst_n) sum 9d0; else sum a b; end endmodule3.2 Transaction事务—— 描述要传什么数据systemverilogCopyDownload// adder_transaction.sv class adder_transaction extends uvm_sequence_item; rand bit [7:0] a; rand bit [7:0] b; bit [8:0] sum; // UVM 工厂注册固定写法先照抄 uvm_object_utils(adder_transaction) function new(string name adder_transaction); super.new(name); endfunction endclass小白注意\uvm_object_utils 这行是注册这个类让 UVM 能自动创建它。rand表示这个字段可以随机化。四、UVM 的骨架四大组件UVM 里有 4 个常用的基础类记住它们的用途类名用途有无引脚uvm_component所有组件的父类—uvm_driver驱动信号到 DUT有virtual interfaceuvm_monitor采集 DUT 信号有uvm_sequencer管理 sequence无uvm_scoreboard比对结果无uvm_env容器装上面这些无uvm_test顶层测试无记忆法uvm_component是所有组件的祖宗它们都有build_phase搭结构和run_phase跑仿真。五、一个组件长什么样Driver 为例systemverilogCopyDownload// adder_driver.sv class adder_driver extends uvm_driver #(adder_transaction); uvm_component_utils(adder_driver) virtual adder_if vif; // 虚拟接口用来连 DUT 引脚 function new(string name, uvm_component parent); super.new(name, parent); endfunction // build_phase拿接口 function void build_phase(uvm_phase phase); super.build_phase(phase); if (!uvm_config_db#(virtual adder_if)::get(this, , vif, vif)) uvm_fatal(DRV, 没拿到 vif) endfunction // run_phase主循环 task run_phase(uvm_phase phase); forever begin adder_transaction tr; seq_item_port.get_next_item(tr); // 从 sequencer 拿事务 // 把事务变成信号 vif.a tr.a; vif.b tr.b; (posedge vif.clk); seq_item_port.item_done(); // 告诉 sequencer 干完了 end endtask endclass小白提示现在看不懂没关系先记住Driver 的套路build_phase拿接口run_phase里forever循环get_next_item→ 驱动信号 →item_done六、学习路线图建议按顺序textCopyDownload第1步SystemVerilog 基础 ├── class / 继承 / 多态 ├── randomize / constraint ├── interface / virtual interface └── mailbox / event / fork-join 第2步UVM 基础组件 ├── transaction / sequence ├── driver / sequencer / monitor ├── agent / env / test └── config_db / factory 第3步跑通第一个例子 └── 加法器 UVM 验证平台完整版 第4步进阶 ├── scoreboard / coverage ├── virtual sequence └── register model (RAL)

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价