Modelsim搭建只有driver的UVM验证平台

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

记录一下《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
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChipWeaver

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值