文章目录

  • 创建一个简单UVM平台:
    • UVM平台的主要组件:
      • 结构组件
      • 组件之间的通信
      • 事务
    • 1. 创建transaction
    • 2. 创建sequence
    • 3. 创建sequencer
    • 4. 创建driver
    • 5. 创建monitor
    • 6. 创建agent
    • 7. 创建environment
    • 8. 创建testcase
    • 8. 测试平台的启动

创建一个简单UVM平台:

UVM平台的主要组件:

结构组件

  • uvm_component

    1. uvm_test;
    2. uvm_env;
    3. uvm_scoreboard;
    4. uvm_agent;
    5. uvm_sequence;
    6. uvm_monitor;
    7. uvm_driver

组件之间的通信

    1. uvm_*_port;
    2. uvm_*_inmport;
    3. uvm_*_export;
    4. uvm_*_fifo_*;
    5. uvm_*_socket;

事务

    1. uvm_sequence_item;
    2. uvm_sequence;

1. 创建transaction

//从uvm_sequence_item库中创建自定义my_transaction类
class my_transaction extends uvm_sequence_item;
//为激励成员指定rand属性,随机化rand bit [3:0] sa;rand bit [3:0] da;rand reg [7:0] payload[$];
//将自定义事务类在uvm中注册`uvm_object_utils_begin(transaction)`uvm_field_int(sa,UVM_ALL_ON);...`uvm_object_utils_end
//约束项,控制随机成员的随机范围constraint Limit{sa inside {[0:15]};da inside {[0:15]};payload.size() inside {[2:4]};}
//构造函数newfunction new (string name = "my_transaction");super.new(name);endfunction
endclass

2. 创建sequence

  • 产生事务对象,并控制;
  • 一般一种sequence 产生一种类型事务,产生多种类型事务很少见;
//使用参数化类扩展uvm_sequence库产生自定义my_sequence类
class my_sequence extends uvm_sequnence #(my_transaction);
//将自定义my_seuence类在uvm库中注册`uvm_object_utils(my_sequence)
//创建构造函数newfunction new(string name = "my_sequence");super.new(name);endfunction
//最重要的的body()函数,产生和控制事务;virtual task body();
//raise标志开始产生事务if (starting_phase != null )starting_phase.raise_pbjection;
//产生事务10次,req是产生事务对象的指针repeat(10)
//uvm库中宏uvm_do,开始产生事务`uvm_do(req)
//drop标志事务产生结束if (starting_phase != null )starting_phase.drop_objection;endtask
endclass

3. 创建sequencer

  • sequence和sequence_item并不属于结构的一部分他们是组件中流动的数据流;
  • sequencer的作用:
    • 启动sequence;
    • 将sequence产生的事务对象item发送到uvm的组件中(也就是driver);
//使用typedef在uvm_sequencer下定义需要传递my_transaction的my_sequencer;
typedef uvm_sequencer #(my_transaction) my_sequencer;

4. 创建driver

  • 从sequencer中获取transaction;
  • 将transaction分解为DUT可以接受的pin级信号;
  • 将转化后的pin级信号按照DUT总线协议的方式驱动给DUT;
    所有的平台组件都使用`uvm_component_utils进行注册,其他的使用uvm_object_utils注册
//创建自定义my_driver
class my_driver entends uvm_driver #(my_transaction);
//注册`uvm_component_utils(my_driver)
//构造new函数,并指定父对象function new(string name = "my_sequence",uvm_component parent);super.new(name,parent);endfunction
//实现driver的功能virtual task run_phase(uvm_phase phase);
//driver是不停工作的forever begin
//从sequencer获取transaction,req指向my_transactionseq_item_port.get_next_item(req);
//执行一个简单的打印操作`uvm_info("DRV_RUN_PHASE",req_sprint(),UVM_MEDIUM)#100;
//通知sequencer事务处理完毕seq_item_port.item_done();endendtask
endclass

5. 创建monitor

  • 监视接口信号,捕获接口上活动的事务,并且将pin级的信号事务转化为事务级的数据包,之后将这些数据包发送的analysis组件(scoreboard,reference model等)进行分析和产生报告。
  • 通过TLM-port机制与其他组件通信。
//创建自定义my_monitor
class my_monitor entends uvm_monitor;
//注册`uvm_component_utils(my_monitor)
//构造new函数,并指定父对象function new(string name = "",uvm_component parent);super.new(name,parent);endfunction
//完成monitor操作virtual task run_phase(uvm_phase phase);
//driver是不停工作的forever begin
//执行一个简单的打印操作`uvm_info("MON_RUN_PHASE","MONITOR RUN!",UVM_MEDIUM)#100;endendtask
endclass

6. 创建agent

  • agent封装了sequenncer、driver、monitor;
  • agent需要实例化封装对象并将其连接起来;
  • agent有passive(只包含monitor,而没有driver 和 sequencer,没有驱动DUT的能力)和active;
//创建自定义master_agent
class master_agent entends uvm_agent;
//注册`uvm_component_utils(master_agent)
//例化封装对象,产生句柄my_sequencer    m_seqr;my_driver     m_driv;my_monitor        m_moni
//构造new函数,并指定父对象function new(string name = "",uvm_component parent);super.new(name,parent);endfunction
//完成monitor操作virtual function void build_phase(uvm_phase phase);
//进入buildphasesuper.build_phase(phase);
//当为active模式才创建sequencer和driver的对象,is_active默认为UVM_ACTIVEif(is_active == UVM_ACTIVE) begin
//使用uvm的工厂机制创建对象,类型名::类型名的静态成员::类型名静态成员的静态函数my_seqr = my_sequencer::type_id::create("m_seqr",this);my_driv = my_driver :: type_id::create("m_driv",this);end
//不管是不是active模式,monitor的对象都应该被创建m_moni = monitor::type_id::create("m_moni",this);
//重载connect_phasevirtual function void connect_phase(uvm_phase phase);if(is_active == UVM_ACTIVE)
//使用TLM机制,连接sequencer与driverm_driv.seq_item_port.connect.(m_seqr.seq_item_export);endfunctionendtask

7. 创建environment

  • environment封装、例化agent、reference module、scoreboard,并将其连接;
  • 监视接口信号,捕获接口上活动的事务,并且将pin级的信号事务转化为事务级的数据包,之后将这些数据包发送的analysis组件(scoreboard,reference model等)进行分析和产生报告。
  • 通过TLM-port机制与其他组件通信。
//创建自定义my_env
class my_env entends uvm_environment;
//注册`uvm_component_utils(my_env)
//实例化master_agentmaster_agent my_agent;
//构造new函数,并指定父对象function new(string name = "",uvm_component parent);super.new(name,parent);endfunction
//重载build_phasevirtual function void build_phase(uvm_phase phase);super.build_phase(phase);
//使用工厂机制创建agent对象m_agent = master_agent::type_id::create("m_agent",this);endfunction
endclass
//只例化了agent,monitor,reference module没有被例化

8. 创建testcase

  • 实例化和配置env;
  • 需要指定要启动的sequence;
//创建自定义my_test
class my_test entends uvm_test;
//注册`uvm_component_utils(my_test)
//实例化my_testmy_test m_test;
//构造new函数,并指定父对象function new(string name = "",uvm_component parent);super.new(name,parent);endfunction
//重载build_phasevirtual function void build_phase(uvm_phase phase);super.build_phase(phase);
//使用工厂机制创建env对象m_env = my_env::type_id::create("m_env",this);
//为sequencer指定一个需要启动的sequence,uvm_config_db#(uvm_object_wrapper)::set(this, "*.m_seqr.run_phase","default_sequence",my_sequence::get_type());endfunction
//打印测试平台的组件的层次结构topologyvirtual function void start_of_simulation_phase(uvm_phase phase);super.start_of_simulation_phase(phase);
//树形结构uvm_top.print_topology(uvm_default_tree_printer);
//表格结构//uvm_top.print_topology(uvm_default_table_printer);endfunction
endclass

8. 测试平台的启动

program automatic test;import uvm_pkt.sv::*;`include "uvm_macros.svh"//包含以上所有创建文件`include "..."initial beginrun_test();end
endmodule

1-UVM简单平台的构成与搭建相关推荐

  1. 从零开始,搭建一个简单的UVM验证平台(一)

    前言: 这篇系列将从0开始搭建一个UVM验证平台,来帮助一些学习了SV和UVM知识,但对搭建完整的验证环境没有概念的朋友. UVM前置基础: 1.UVM基础-factory机制.phase机制 2.U ...

  2. 诙谐有趣的《UVM实战》笔记——第二章 一个简单的UVM验证平台

    前言 某天白天在地铁上听鬼故事,结果晚上要睡觉时,故事里的情节都历历在目,给我鸡皮疙瘩起的~ 不过我倒是没有吓得睡不着,而是转念一想,为啥我学知识忘得很快,随便听的鬼故事却记得这么清楚咧? 那如果能像 ...

  3. UVM简单验证平台从0到1

    前序 本篇文章主要参考<UVM实战:第二章>,虽说只是搭建了一个简单的验证平台,但从书本的零星知识到makefile成功并且dump到正确的波形,还是费了周折,有一定的参考意义.现将过程与 ...

  4. UVM验证平台搭建三:spi_mst_agent-spi_slv_agent

    UVM验证平台搭建三:spi_mst_agent/spi_slv_agent 一.概述 二.spi mst transaction 三.spi mst sequencer 四.spi mst driv ...

  5. 一个简单的UVM验证平台

    2.1 验证平台的组成 2.1.1. 何谓验证平台 何谓验证平台?验证最基本的目的在于测试 DUT 的正确性,其最常使用的方法就是给 DUT 施加不同的输入(激励),所以一个验证平台最重要的的功能在于 ...

  6. UVM验证平台搭建一:reg model 生成

    UVM验证平台搭建一:reg model 生成 一.概述 二.寄存器描述表格 三.生成.ralf寄存器文件 四.ralgen生成寄存器模型 一.概述 在做验证时,寄存器模型是验证平台中必不可少的,而且 ...

  7. (3)UVM验证平台搭建之介绍

    年轻人的第一个UVM验证平台搭建之介绍 验证平台的组成 UVM验证平台的框图 验证平台介绍 目录 验证平台的组成 验证用于找出DUT中的bug,这个过程通常是把DUT放入一个验证平台中来实现的.一个验 ...

  8. UART UVM验证平台平台搭建总结

    UART UVM验证平台平台搭建总结 tb_top是整个UVM验证平台的最顶层:tb_top中例化dut,提供时钟和复位信号,定义接口以及设置driver和monitor的virual interfa ...

  9. 从VHDL到UVM验证平台转变的优点评估

    路科验证官网:路科验证 - 专注于数字芯片验证的系统思想和前沿工程领域 EETOP路科首页: EETOP - 路科验证 - IC验证培训 CSDN路科首页:CSDN - 路科验证 - IC验证培训 由 ...

最新文章

  1. 设置程序无label
  2. 文本编辑器中菜单栏删除功能的实现
  3. python查询数据库带逗号_浅谈pymysql查询语句中带有in时传递参数的问题
  4. Android HelloWorld 例子
  5. 生产环境中on yarn模式是否采用yarn session
  6. categories php,manage-categories.php
  7. Spark精华问答 | RDD的核心概念是什么?
  8. ASP.NET教程5
  9. 字符串转内存c语言,【一起学C】C语言面试题必考:字符串操作函数,内存操作函数实现...
  10. python prt_Python中的self
  11. python面试题(6)--- read、readline和readlines的区别
  12. java web启动socket_javaweb启动时启动socket服务端代码实现
  13. 平面图判连通 蓝桥杯模拟赛题
  14. MySQL数据库优化的八种方式(经典必看)
  15. 【JS】Unicode编码
  16. 一分钟解决微信小程序截图(截屏问题)
  17. oracle 将钱转换万元单位,oracle中单位换算。
  18. 计算机资源管理窗口,资源管理器怎么打开,教您打开电脑资源管理器
  19. U盘插入后只显示安全删除硬件问题
  20. Python实现人脸识别,一行代码,多种功能,易上手又好操作

热门文章

  1. python 断点续传
  2. 【考研】栈和栈的应用
  3. Knowledge-based Collaborative Deep Learning for Benign-Malignant Lung Nodule Classification论文阅读
  4. 关于CKCsec安全研究院
  5. 摄影笔记之数码单反介绍与选择
  6. 00.Sublime汉化、默认代码块、代码提示教程
  7. WAV音频数组提取器【单片机音频处理】
  8. 依靠国家资源,发展人工智能
  9. 数据库 for update的作用
  10. 《公司战略与风险管理》