验证平台加入reference model

reference model用于完成和DUT相同的功能,输出被scoreboard接受,用于和DUT的输出比较

代码分析

my_model 代码

`ifndef MY_MODEL__SV
`define MY_MODEL__SVclass my_model extends uvm_component;//声明两个接口,用以和monitor和scoreboard传输数据uvm_blocking_get_port #(my_transaction)  port;uvm_analysis_port #(my_transaction)  ap;extern function new(string name, uvm_component parent);extern function void build_phase(uvm_phase phase);extern virtual  task main_phase(uvm_phase phase);`uvm_component_utils(my_model)
endclass function my_model::new(string name, uvm_component parent);super.new(name, parent);
endfunction function void my_model::build_phase(uvm_phase phase);super.build_phase(phase);//创建两个接口实例port = new("port", this);ap = new("ap", this);
endfunctiontask my_model::main_phase(uvm_phase phase);my_transaction tr;my_transaction new_tr;super.main_phase(phase);while(1) beginport.get(tr);new_tr = new("new_tr");//调用my_transaction的my_copy函数,连续复制DUT传输的TR,并发送出去new_tr.my_copy(tr);`uvm_info("my_model", "get one transaction, copy and print it:", UVM_LOW)new_tr.my_print();ap.write(new_tr);end
endtask
`endif

my_transaction 内新增my_copy函数

`ifndef MY_TRANSACTION__SV
`define MY_TRANSACTION__SVclass my_transaction extends uvm_sequence_item;rand bit[47:0] dmac;rand bit[47:0] smac;rand bit[15:0] ether_type;rand byte      pload[];rand bit[31:0] crc;constraint pload_cons{pload.size >= 46;pload.size <= 1500;}function bit[31:0] calc_crc();return 32'h0;endfunctionfunction void post_randomize();crc = calc_crc;endfunction`uvm_object_utils(my_transaction)function new(string name = "my_transaction");super.new();endfunctionfunction void my_print();$display("dmac = %0h", dmac);$display("smac = %0h", smac);$display("ether_type = %0h", ether_type);for(int i = 0; i < pload.size; i++) begin$display("pload[%0d] = %0h", i, pload[i]);end$display("crc = %0h", crc);endfunctionfunction void my_copy(my_transaction tr);//新增了my_copy函数if(tr == null)`uvm_fatal("my_transaction", "tr is null!!!!")dmac = tr.dmac;smac = tr.smac;ether_type = tr.ether_type;pload = new[tr.pload.size()];for(int i = 0; i < pload.size(); i++) beginpload[i] = tr.pload[i];endcrc = tr.crc;endfunction
endclass
`endif

在my_env中例化my_model

`ifndef MY_ENV__SV
`define MY_ENV__SVclass my_env extends uvm_env;my_agent  i_agt;my_agent  o_agt;my_model  mdl;uvm_tlm_analysis_fifo #(my_transaction) agt_mdl_fifo;//声明一个FIFO,用以连接monitor和model,用作暂存数据function new(string name = "my_env", uvm_component parent);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);i_agt = my_agent::type_id::create("i_agt", this);o_agt = my_agent::type_id::create("o_agt", this);i_agt.is_active = UVM_ACTIVE;o_agt.is_active = UVM_PASSIVE;mdl = my_model::type_id::create("mdl", this); //创建model实例agt_mdl_fifo = new("agt_mdl_fifo", this); //创建连接port和export的FIFOendfunctionextern virtual function void connect_phase(uvm_phase phase);`uvm_component_utils(my_env)
endclassfunction void my_env::connect_phase(uvm_phase phase);super.connect_phase(phase);//port和export连接env中的FIFOi_agt.ap.connect(agt_mdl_fifo.analysis_export);mdl.port.connect(agt_mdl_fifo.blocking_get_export);
endfunction`endif

在agent中声明一个port,连接monitor的port

`ifndef MY_AGENT__SV
`define MY_AGENT__SVclass my_agent extends uvm_agent ;my_driver     drv;my_monitor    mon;//agent中声明一个port,连接monitor和env中的FIFOuvm_analysis_port #(my_transaction)  ap;function new(string name, uvm_component parent);super.new(name, parent);endfunction extern virtual function void build_phase(uvm_phase phase);extern virtual function void connect_phase(uvm_phase phase);`uvm_component_utils(my_agent)
endclass function void my_agent::build_phase(uvm_phase phase);super.build_phase(phase);if (is_active == UVM_ACTIVE) begindrv = my_driver::type_id::create("drv", this);endmon = my_monitor::type_id::create("mon", this);
endfunction
//并不在build_phase中创建port的实例,而是在connect_phase中连接monitor的port
function void my_agent::connect_phase(uvm_phase phase);super.connect_phase(phase);ap = mon.ap;
endfunction`endif

验证平台结构

加入reference model后的验证平台结构

  • 在UVM中,通常使用TLM(Transaction Level Modeling)实现component之间transaction级别的通信
  • 数据的发送使用uvm_analysis_port
  • 数据接收使用uvm_blocking_get_port
  • 这两种端口都是参数化的类,有内建函数write或get
  • 在monitor和model中实现这两种端口后,要在env中创建一个FIFO用以当model暂时无法接受数据时存储monitor发送过来的数据
  • ifo的类型是uvm_tlm_analysis_fifo
  • connect_phase 的执行顺序为从下到上

仿真结果

UVM实战CH2:10 验证平台加入reference model相关推荐

  1. UVM:一个简易验证平台例子

    目录 top_tb.sv my_dut.sv my_if.sv basic_test.sv.my_case0.sv.my_case1.sv my_env.sv my_agent.sv my_seque ...

  2. UVM:模块级 验证平台框架

    目录 1. 验证框架实现方式 1.1. 默写 1.2. 验证平台自动化:Easier UVM Generator 2. aaa验证IP的实现:代码 2.1. aaa_param_def.sv 2.2. ...

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

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

  4. 【UVM实战】第二章:一个简单的UVM验证平台(4)UVM 的终极大作:sequence

    文章目录 2.4.1.在验证平台中加入sequencer 2.4.2.sequence机制 2.4.3.default_sequence的使用 2.4.1.在验证平台中加入sequencer sequ ...

  5. UVM实战 卷I学习笔记2——为验证平台加入各个组件(1)

    目录 1.加入transaction 2.加入env 3.加入monitor 4.封装成agent 开始引入reference model.monitor.scoreboard等验证平台的组件,在这些 ...

  6. UVM实战 卷I学习笔记8——UVM验证平台的运行(2)

    目录 *build阶段出现UVM_ERROR停止仿真 *phase的跳转 phase机制的必要性 phase的调试 超时退出 *build阶段出现UVM_ERROR停止仿真 之前的代码中,如果使用co ...

  7. 【UVM实战】第五章:UVM验证平台的运行(2)objection机制

    文章目录 5.2.1.objection与task phase 5.2.2.参数phase的必要性 5.2.3.控制objection的最佳选择 5.2.4.set_drain_time的使用 5.2 ...

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

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

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

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

最新文章

  1. 日志采集框架Flume以及Flume的安装部署(一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统)...
  2. 【PAT甲级 sc.nextInt()的使用】1008 Elevator (20 分) Java版 9/9通过
  3. Enhancement set functionality missing in some system
  4. [css] position的relative和absolute定位原点是哪里?
  5. 女人选择安逸一点还是拼搏一点
  6. 心情随笔(四):重新审视自我
  7. 《Summer Tree》第八期封面
  8. python是什么 自学-python自学需要什么软件?
  9. JAVA——网络编程
  10. 计算机网络网际协议实验报告,计算机网络网际协议ip实验报告.doc
  11. 内幕:一个由罪犯秘密建立的“加密”手机公司
  12. pdf分解成多个pdf?PDF分割怎么做
  13. linux的cd命名返回上级目录,返回根目录
  14. Java--------面向对象
  15. MySQL 排序规则
  16. 还记得maven使用之令人头疼的.lastUpdated文件吗?
  17. 高性能MMORPG通用服务端引擎设计之-基本概念篇
  18. 一文带你了解python opencv中霍夫变换(Hough transform)的常用操作
  19. php base64互转pdf 将base64解析成pdf
  20. 《城市化》(顾朝林)-1

热门文章

  1. 夏天来啦,用纯CSS实现水果解解馋吧
  2. java中依赖注入_关于Java:什么是依赖注入?
  3. Appimage无法打开的bug
  4. Ubuntu下的docker搭建及基础使用
  5. 买房子需要交哪些费用
  6. kubenetes(五)发布 阿里云仓库的镜像
  7. Android 设置参数至kernel_ois为例
  8. IntelliJ IDEA将界面语言切换成中文
  9. Golang append函数对于空类型的处理
  10. 「推荐」怎么实时接收小程序客服消息通知,并在手机上回复