UVM入門


1 前言

        在基於SystemVerilog的验证方法学中,目前市面上有三种:


2 搭建一个简单的验证平台

2.1 验证平台的组成

        验证用于找出DUT中的bug,这个过程通常是把DUT放入一个验证平台中来实现的。一个验证平台要实现如下基本功能:

        一个简单的验证平台框图如下图:

        在UVM中,引入了agent和sequence概念,因此UVM中验证平台的典型框图如下图:

2.2 只有driver的验证平台

        driver是验证平台最基本的组件,是整个验证平台数据流的源泉。

        假设有以下DUT定义:

module dut(
    input               clk,
    input               rst_n,

    input  [7:0]        rxd,
    input               rx_dv,

    output reg [7:0]    txd,
    output reg          tx_en
);

    always_ff@(posedge clk,negedge rst_n) begin
        if(!rst_n)begin
            txd   <= '0;
            tx_en <= '0;
        end
        else begin
            txd   <= rxd;
            tx_en <= rx_dv;   
        end
    end

endmodule         

        这个DUT的功能非常简单,通过rxd接收数据,再通过txd发送出去。

        UVM是一个库,在这个库中,几乎所有的东西都是使用类(class)来实现的。driver、monitor、reference model、scoreboard等组成部分都是类。类是像SystemVerilog这些面向对象编程语言中最伟大的发明之一,是面向对象的精髓所在。类有函数(function),另外还可以有任务(task),通过这些函数和任务可以完成driver的输出激励功能,完成monitor的监测功能,完成参考模型的计算功能,完成scoreboard的比较功能。类中可以有成员变量,这些成员变量可以控制类的行为,如控制driver的行为等。当要实现一个功能时,首先应该想到的是从UVM的某个类派生出一个新的类,在这个新的类中实现所期望的功能。所以,使用UVM的第一条原则是:**验证平台中所有的组件应该派生自UVM中的类。

        UVM验证平台中的driver应该派生自uvm_driver,一个简单的driver如下例:

class my_driver extends uvm_driver;

    function new(string name = "my_driver",uvm_compoent parent = null);
        super.new(name,parent);
    endfunction

    extern virtual task main_phase(uvm_phase phase);

endclass

task my_driver:main_phase(uvm_phase phase);
    top_tp.rxd   <= '0;
    top_tp.rx_dv <= '0;

    while(!top_tb.td)
        @(posedge top_tb.clk);
    for(int i = 0; i < 256; i++) begin
        @(posedge top_tb.clk);

        top_tb.rxd   <= $urandom_range(0,255);
        top_tb.rx_dv <= '1;
        `uvm_info("my_driver","data is drived",UVM_LOW)
    end

    @(posedge top_tb.clk);
        top_tb.rx_dv <= '0;
        
endtask

        这个driver的功能非常简单,只是像rxd上发送256个随机数据,并将rx_dv信号置为高电平。当数据发送完毕后,将rx_dv信号置为低电平。在这个driver中,有两点应该引起注意:


        告辞

Back to Archive
WeChat QR Code

Scan to connect