文章目录
记录一下《UVM实战(卷I)》学习笔记。
1 验证平台的组成
1.1 简单验证平台

- driver:模拟DUT的真实使用情况,给DUT施加各种激励,包括正常异常激励,不同模式激励。
- scoreboard:也被称为 checker 。根据DUT的输出判断DUT行为是否与预期符合。
- monitor:收集DUT的输出并将它们传递给scoreboard。
- reference model:给出预期的结果。
1.2 典型UVM验证平台

引入 agent 和 sequence 概念。
2 按照书本例程使用 Modelsim 搭建仿真环境
2.1 最简单的验证平台
参考文章:UVM学习-仿真环境的搭建
在上述参考文章的基础上,我们自己要去学习具体的原理,首先要了解Modelsim仿真流程及相关命令。
首先按照课本编写好相关代码:
待测设计DUT:这里按照个人代码风格抄了一遍。
//file name: dut.v
module dut(
input I_sys_clk,
input I_reset_n,
input [7:0] I_rxd ,
input I_rx_dv ,
output reg [7:0] O_txd ,
output reg O_tx_en
);
always @(posedge I_sys_clk or negedge I_reset_n)
begin
if(~I_reset_n)
begin
O_txd <= 8'b0;
O_tx_en <= 1'b0;
end
else
begin
O_txd <= I_rxd;
O_tx_en <= I_rx_dv;
end
end
endmodule
UVM是一个库,库中所有东西都是使用类(class)实现。验证平台中所有组件应该派生自UVM中的类。
类有函数(function)和任务(task),通过函数和任务可以完成driver输出激励,monitor监测,参考模型计算,scoreboard比较功能。
类有成员变量,通过成员变量可以控制类的行为。
添加driver类:
//file name: my_driver.sv
`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;
function new(string name = "my_driver", uvm_component parent = null);
super.new(name, parent);
endfunction //new()
extern virtual task main_phase(uvm_phase phase);
endclass //my_driver extends uvm_driver
task my_driver::main_phase(uvm_phase phase);
top_tb.I_rxd <= 8'd0;
top_tb.I_rx_dv <= 1'b0;
while(!top_tb.I_reset_n)
@(posedge top_tb.I_sys_clk);
for (int i = 0; i < 256; i++) begin
@(posedge top_tb.I_sys_clk)
top_tb.I_rxd <= $urandom_range(0, 255);
top_tb.I_rx_dv <= 1'b1;
`uvm_info("my_driver", "data is drived", UVM_LOW);
end
@(posedge top_tb.I_sys_clk);
top_tb.I_rx_dv <= 1'b0;
endtask
`endif
uvm_info宏的功能与verilog的display类似,但比display更强大。
第一个字符串参数把打印的信息归类,第二个字符串参数是需要打印的信息,第三个参数是冗余级别,有UVM_LOW、UVM_MEDIUM、UVM_HIGH。UVM默认只显示UVM_MEDIUM或者UVM_LOW的信息。
添加testbench的顶层:
//file name:top_tb.sv
`timescale 1ns/1ps
`include "uvm_macros.svh"
import uvm_pkg::*;
`include "my_driver.sv"
module top_tb();
parameter T = 10;
reg I_sys_clk

本文详细介绍了基于《UVM实战(卷I)》的学习笔记,涵盖从简单验证平台到典型UVM验证平台的组成,以及如何使用Modelsim搭建仿真环境。内容包括driver、scoreboard、monitor和referencemodel的角色,以及如何引入agent和sequence概念。接着,逐步展示了如何添加factory机制、objection机制和virtualinterface,以提高验证平台的灵活性和可移植性。最后,通过具体代码示例和仿真结果解释了各机制的作用。
最低0.47元/天 解锁文章
1037





