UVM实战CH2:10 验证平台加入reference model
验证平台加入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相关推荐
- 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 ...
- UVM:模块级 验证平台框架
目录 1. 验证框架实现方式 1.1. 默写 1.2. 验证平台自动化:Easier UVM Generator 2. aaa验证IP的实现:代码 2.1. aaa_param_def.sv 2.2. ...
- 诙谐有趣的《UVM实战》笔记——第二章 一个简单的UVM验证平台
前言 某天白天在地铁上听鬼故事,结果晚上要睡觉时,故事里的情节都历历在目,给我鸡皮疙瘩起的~ 不过我倒是没有吓得睡不着,而是转念一想,为啥我学知识忘得很快,随便听的鬼故事却记得这么清楚咧? 那如果能像 ...
- 【UVM实战】第二章:一个简单的UVM验证平台(4)UVM 的终极大作:sequence
文章目录 2.4.1.在验证平台中加入sequencer 2.4.2.sequence机制 2.4.3.default_sequence的使用 2.4.1.在验证平台中加入sequencer sequ ...
- UVM实战 卷I学习笔记2——为验证平台加入各个组件(1)
目录 1.加入transaction 2.加入env 3.加入monitor 4.封装成agent 开始引入reference model.monitor.scoreboard等验证平台的组件,在这些 ...
- UVM实战 卷I学习笔记8——UVM验证平台的运行(2)
目录 *build阶段出现UVM_ERROR停止仿真 *phase的跳转 phase机制的必要性 phase的调试 超时退出 *build阶段出现UVM_ERROR停止仿真 之前的代码中,如果使用co ...
- 【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 ...
- UVM简单验证平台从0到1
前序 本篇文章主要参考<UVM实战:第二章>,虽说只是搭建了一个简单的验证平台,但从书本的零星知识到makefile成功并且dump到正确的波形,还是费了周折,有一定的参考意义.现将过程与 ...
- (3)UVM验证平台搭建之介绍
年轻人的第一个UVM验证平台搭建之介绍 验证平台的组成 UVM验证平台的框图 验证平台介绍 目录 验证平台的组成 验证用于找出DUT中的bug,这个过程通常是把DUT放入一个验证平台中来实现的.一个验 ...
最新文章
- 日志采集框架Flume以及Flume的安装部署(一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统)...
- 【PAT甲级 sc.nextInt()的使用】1008 Elevator (20 分) Java版 9/9通过
- Enhancement set functionality missing in some system
- [css] position的relative和absolute定位原点是哪里?
- 女人选择安逸一点还是拼搏一点
- 心情随笔(四):重新审视自我
- 《Summer Tree》第八期封面
- python是什么 自学-python自学需要什么软件?
- JAVA——网络编程
- 计算机网络网际协议实验报告,计算机网络网际协议ip实验报告.doc
- 内幕:一个由罪犯秘密建立的“加密”手机公司
- pdf分解成多个pdf?PDF分割怎么做
- linux的cd命名返回上级目录,返回根目录
- Java--------面向对象
- MySQL 排序规则
- 还记得maven使用之令人头疼的.lastUpdated文件吗?
- 高性能MMORPG通用服务端引擎设计之-基本概念篇
- 一文带你了解python opencv中霍夫变换(Hough transform)的常用操作
- php base64互转pdf 将base64解析成pdf
- 《城市化》(顾朝林)-1