尧图精选

直接上手 UVM 例子

🕒 发布时间:2026/9/14 23:20:02 📁 来源:尧图网络
情况1.没学过 SystemVerilog2.有Questa仿真工具3.工作中项目适合走边用边学的路线 —— 不先啃 SystemVerilog 语法书而是直接上手 UVM 例子遇到不懂的语法现学现用。因为你有Questa工具能随时跑起来看波形这是最好的学习方式。给你的定制学习计划4 周每天 1 小时周目标产出第1周跑通加法器 UVM 平台能跑出波形 打印第2周搞懂 sequence / driver / monitor会改数据、看结果第3周加 scoreboard coverage能自动比对第4周套用到你的工作项目能自己搭第 1 课今天先跑起来再理解我给你的第一个任务不是背语法而是把下面 6 个文件复制到 Questa 里跑通。跑通了你就有感觉了。文件清单6 个textCopyDownloadadder_if.sv ← 接口连接 DUT 和验证平台 adder.sv ← DUT被验证的加法器 adder_transaction.sv ← 事务数据包 adder_driver.sv ← 驱动器 adder_monitor.sv ← 监视器 adder_test.sv ← 顶层测试 tb_top.sv ← 仿真顶层连 DUT 启动 UVM① adder_if.svsystemverilogCopyDownloadinterface adder_if (input logic clk, input logic rst_n); logic [7:0] a; logic [7:0] b; logic [8:0] sum; endinterface说明interface 就是一组信号的打包把 a、b、sum 装在一起方便传递。② adder.svDUTsystemverilogCopyDownloadmodule adder ( input logic clk, input logic rst_n, input logic [7:0] a, input logic [7:0] b, output logic [8:0] sum ); always_ff (posedge clk or negedge rst_n) begin if (!rst_n) sum 9d0; else sum a b; end endmodule③ adder_transaction.svsystemverilogCopyDownloadclass adder_transaction extends uvm_sequence_item; rand bit [7:0] a; rand bit [7:0] b; bit [8:0] sum; uvm_object_utils(adder_transaction) function new(string name adder_transaction); super.new(name); endfunction endclass④ adder_driver.svsystemverilogCopyDownloadclass adder_driver extends uvm_driver #(adder_transaction); uvm_component_utils(adder_driver) virtual adder_if vif; function new(string name, uvm_component parent); super.new(name, parent); endfunction 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 task run_phase(uvm_phase phase); adder_transaction tr; forever begin seq_item_port.get_next_item(tr); vif.a tr.a; vif.b tr.b; (posedge vif.clk); seq_item_port.item_done(); end endtask endclass⑤ adder_monitor.svsystemverilogCopyDownloadclass adder_monitor extends uvm_monitor; uvm_component_utils(adder_monitor) virtual adder_if vif; uvm_analysis_port #(adder_transaction) ap; // 分析端口往外发数据 function new(string name, uvm_component parent); super.new(name, parent); ap new(ap, this); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); if (!uvm_config_db#(virtual adder_if)::get(this, , vif, vif)) uvm_fatal(MON, vif 没拿到) endfunction task run_phase(uvm_phase phase); forever begin adder_transaction tr; (posedge vif.clk); tr adder_transaction::type_id::create(tr); tr.a vif.a; tr.b vif.b; tr.sum vif.sum; uvm_info(MON, $sformatf(采样: a%0d b%0d sum%0d, tr.a, tr.b, tr.sum), UVM_LOW) ap.write(tr); end endtask endclass⑥ adder_test.sv顶层systemverilogCopyDownloadclass adder_test extends uvm_test; uvm_component_utils(adder_test) adder_driver drv; adder_monitor mon; uvm_sequencer #(adder_transaction) sqr; function new(string name, uvm_component parent); super.new(name, parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); drv adder_driver::type_id::create(drv, this); mon adder_monitor::type_id::create(mon, this); sqr uvm_sequencer#(adder_transaction)::type_id::create(sqr, this); // 连接 driver 和 sequencer drv.seq_item_port.connect(sqr.seq_item_export); endfunction task run_phase(uvm_phase phase); // 简单的 sequence直接手写 adder_transaction tr; phase.raise_objection(this); repeat (5) begin tr adder_transaction::type_id::create(tr); tr.randomize(); // 随机 a、b sqr.execute_item(tr); // 发给 sequencer → driver end #50; phase.drop_objection(this); endtask endclass注意sqr.execute_item(tr)是简化写法正式写法用 sequence 类。第 2 课我们改正式写法。⑦ tb_top.sv仿真入口systemverilogCopyDownloadtimescale 1ns/1ps module tb_top; import uvm_pkg::*; include uvm_macros.svh logic clk 0; logic rst_n; // 时钟 always #5 clk ~clk; // 接口 adder_if intf(.clk(clk), .rst_n(rst_n)); // DUT adder dut ( .clk(clk), .rst_n(rst_n), .a(intf.a), .b(intf.b), .sum(intf.sum) ); // 把接口注册到 config_db initial begin uvm_config_db#(virtual adder_if)::set(null, *, vif, intf); run_test(adder_test); end // 复位 initial begin rst_n 0; #20 rst_n 1; end // 把之前几个文件 include 进来也可以分文件编译 include adder_transaction.sv include adder_driver.sv include adder_monitor.sv include adder_test.sv endmodule怎么在 Questa 里跑步骤 1建工程textCopyDownloadvlib work vmap work work步骤 2编译注意顺序先接口再 DUT最后 toptextCopyDownloadvlog adder_if.sv adder.sv tb_top.sv步骤 3仿真textCopyDownloadvsim -c work.tb_top -do run -all; quit或者用 GUItextCopyDownloadvsim work.tb_top # 在 GUI 里 run -all预期输出你会看到textCopyDownloadUVM_INFO ... [MON] 采样: a42 b17 sum59 UVM_INFO ... [MON] 采样: a133 b201 sum334 UVM_INFO ... [MON] 采样: a7 b250 sum257 ...共 5 条左右 UVM_INFO ... TEST_DONE如果看到[MON] 采样打印 → 恭喜你第一个 UVM 平台跑通了现在轮到你了 ✋请你按下面步骤做然后告诉我结果建一个文件夹uvm_adder把 7 个文件复制进去我可以再拆开发给你或你按上面直接建执行 3 条命令vlib / vlog / vsim把屏幕输出贴给我可能遇到的坑提前预警报错原因解决uvm_pkg not found没 import检查import uvm_pkg::*;vif 没拿到config_db set/get 名字不一致检查vif字符串是否一样run_test 找不到类名写错run_test(adder_test)编译报 include 错文件顺序先 interface 再 module 再 top一句话总结今天不要试图先懂所有语法先把平台跑通看到现象再回来理解每一行。这是工程师学习 UVM 最快的方式。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →