uvm_analysis通信端口学习

news/2024/5/19 18:54:00 标签: 学习, systemverilog, 开发语言

文章目录

    • 前言
    • 与blocking_port 和blocking_export区别
    • 使用实例
    • uvm_analysis_imp_decl宏的用法
    • 利用fifo通信

前言

UVM实现通信的TLM机制中通常有put,get等术语,put操作是指通信的发起者A把一个transaction发送给B,而get操作指A向B索取一个transaction。同样,存在port与export,imp三种端口,代表了控制流的方向,port的优先级最高。除了这几种端口外,UVM中还有两种
特殊的端口:analysis_port和analysis_export。这两者其实与put和get系列端口类似,都用于传递transaction。

与blocking_port 和blocking_export区别

  1. 一个analysis_port(analysis_export)可以连接多个IMP,也就是说,analysis_port(analysis_export)与IMP之间的通信是一对多的通信,而put和get系列端口与相应IMP的通信是一对一的通信(除非在实例化时指定可以连接的数量,analysis_port(analysis_export)更像是一个广播。
  2. put与get系列端口都有阻塞和非阻塞的区分。但是对于analysis_port和analysis_export来说,没有阻塞和非阻塞的概念。因为它本身就是广播,不必等待与其相连的其他端口的响应,所以不存在阻塞和非阻塞。
  3. 与put系列端口的PORT和EXPORT直接相连会出错的情况一样,analysis_port如果和一个analysis_export直接相连也会出错。只有在analysis_export后面再连接一级uvm_analysis_imp,才不会出错。

使用实例

使用方法如下:(以白皮书中代码为例)

为了将monitor中监视到的数据发送到scoreboard中,需要首先在声明一个uvm_analysis_port端口。

class monitor extends uvm_monitor;
uvm_analysis_port#(my_transaction) ap;
task main_phase(uvm_phase phase);
super.main_phase(phase);
my_transaction tr;
…
ap.write(tr);
…
endtask
endclass

同时,由于monitor与scoreboard在UVM树中并不是平等的兄妹关系,其中间还间隔了o_agt,所以可以在o_agent中再例化一个analysis_port端口,并例化它,并将其与monitor中的端口连接即可。

class my_agent extends uvm_agent ;
uvm_analysis_port #(my_transaction) ap;
…
function void build_phase(uvm_phase phase);
super.build_phase(phase);
ap = new("ap", this);
…
endfunction

function void my_agent::connect_phase(uvm_phase phase);
mon.ap.connect(this.ap);
…
endfunction
endclass

function void my_env::connect_phase(uvm_phase phase);
o_agt.ap.connect(scb.scb_imp);
…
endfunction

当然,我们也可以使agent中的端口指针ap指向monitor中的ap,这样就可以直接把agent中的ap与scoreboard中的imp端口连接。

class my_agent extends uvm_agent ;
uvm_analysis_port #(my_transaction) ap;
…
function void my_agent::connect_phase(uvm_phase phase);
ap = mon.ap;
…
endfunction
endclass
function void my_env::connect_phase(uvm_phase phase);
o_agt.ap.connect(scb.scb_imp);
…
endfunction

uvm_analysis_imp_decl宏的用法

当scoreboard需要接受多路数据时,一个imp端口是不足够的,如scoreboard除了接收monitor的数据之外,还要接收reference model的数据。相应的scoreboard就要再添加一个
uvm_analysis_imp的IMP,如model_imp,那么monitor中的write任务如何区分写到scoreboard中的数据应该做何种处理呢,此时我们就需要uvm_analysis_imp_decl宏的帮助。

 `uvm_analysis_imp_decl(_monitor)
 `uvm_analysis_imp_decl(_model)
 class my_scoreboard extends uvm_scoreboard;
 my_transaction expect_queue[$];

 uvm_analysis_imp_monitor#(my_transaction, my_scoreboard) monitor_imp;
 uvm_analysis_imp_model#(my_transaction, my_scoreboard) model_imp;//如上,分别声明了两个imp。分别指monitor_imp,model_imp
 extern function void write_monitor(my_transaction tr);
 extern function void write_model(my_transaction tr);
 extern virtual task main_phase(uvm_phase phase);

当与monitor_imp相连接的analysis_port执行write函数时,会自动调用write_monitor函数,而与model_imp相连接的analysis_port执行write函数时,会自动调用write_model函数。

function void my_scoreboard::write_model(my_transaction tr);
 expect_queue.push_back(tr);
 endfunction

 function void my_scoreboard::write_monitor(my_transaction tr);
 my_transaction tmp_tran;
 bit result;
 if(expect_queue.size() > 0) begin
…
 end
 endfunction

利用fifo通信

通过ap与imp方式相连的monitor和scoreboard之间的通信,monitor占据主动地位,而scoreboard只能被动地接收,若想使scoreboard也实现主动的接收,则可利用fifo机制。在agent和scoreboard之间添加一个uvm_tlm_analysis_fifo。在monitor与FIFO的连接关系中,monitor中依然是analysis_port,FIFO中是uvm_analysis_imp,数据流和控制流的方向相同。在scoreboard与FIFO的连接关系中,scoreboard中使用blocking_get_port端口。
示意图如下:
在这里插入图片描述

class my_env extends uvm_env;

 my_agent i_agt;
 my_agent o_agt;
 my_model mdl;
 my_scoreboard scb;

 uvm_tlm_analysis_fifo #(my_transaction) agt_scb_fifo;
 uvm_tlm_analysis_fifo #(my_transaction) agt_mdl_fifo;
 uvm_tlm_analysis_fifo #(my_transaction) mdl_scb_fifo;
…
 endclass

 function void my_env::connect_phase(uvm_phase phase);
 super.connect_phase(phase);
 i_agt.ap.connect(agt_mdl_fifo.analysis_export);
 mdl.port.connect(agt_mdl_fifo.blocking_get_export);
 mdl.ap.connect(mdl_scb_fifo.analysis_export);
 scb.exp_port.connect(mdl_scb_fifo.blocking_get_export);
 o_agt.ap.connect(agt_scb_fifo.analysis_export);
 scb.act_port.connect(agt_scb_fifo.blocking_get_export);
 endfunction

注意:FIFO中有两个IMP,但是在上面的连接关系中,FIFO中却是EXPORT,这是为什么呢?实际上,FIFO中的analysis_export和blocking_get_export虽然名字中有关键字export,但是其类型却是IMP。UVM为了掩饰IMP的存在,在它们的命名中加入了export关键字


http://www.niftyadmin.cn/n/1788012.html

相关文章

学习排序算法,结合这个方法太容易理解了

排序是一个经典的问题,它以一定的顺序对一个数组或列表中的元素进行重新排序。而排序算法也是各有千秋,每个都有自身的优点和局限性。虽然这些算法平常根本就不用自己去编写,但作为一个有追求的程序员,还是要了解它们从不同角度解…

raise_objection和drop_objection的学习

UVM中通过objection 机制来控制phase的执行,通过raise or drop objection来决定phase中事件的开始和停止。在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被撤销了,当发现所有都已经…

PHP照片拖拽上传

HTML页面 <div id"drop_area" style"border: 1px solid red;height: 100px;width: 100px"> <img src"" style"height: 100%;width: 100%"> </div> <button οnclick"zphxhrupload(photo)">上传<…

奇数分频电路—5分频(verilog实现)

文章目录前言占空比不为50%的奇数分频占空比为50%的5分频电路扩展前言 前文我们讲到&#xff0c;可以通过计数器的方法实现偶数分频&#xff0c;实现方式可以参考4分频电路实现 那么对于奇数分频电路应该如何实现呢&#xff1f;是否也可以通过计数器实现呢&#xff1f;答案是肯…

Java double转long方法

Java double转long方法 double random Math.round(Math.random()*10000); long l new Double(random).longValue()转载于:https://www.cnblogs.com/mark5/p/10968349.html

【sv中枚举类型与字符串语法学习】

文章目录枚举基本语法类型转换枚举类型内置方法字符串内置方法枚举 基本语法 枚举类型可以用来声明一组整型的命名常量&#xff0c;定义具有强类型的枚举变量。枚举类型还可以使用枚举名字而不是枚举值来方便地引用或显示。当没有指定数据类型的时候&#xff0c;缺省的数据类…

20189221 2018-2019-2 《密码与安全新技术专题》第七周作业

20189221 2018-2019-2 《密码与安全新技术专题》第七周作业 课程&#xff1a;《密码与安全新技术专题》 班级&#xff1a; 201892 姓名&#xff1a; 郭开世 学号&#xff1a;20189221 上课教师&#xff1a;谢四江 上课日期&#xff1a;2019年5月21日 必修/选修&#xff1a; 选修…

模块(module), 程序块(program)的区别

文章目录moduleprogram注意点区别module 在verilog中&#xff0c;模块可以用来描述从简单的门元件到复杂的系统 &#xff08;例如一个微处理器&#xff09;的任何一种硬件电路。模块除了可以为硬件建模外&#xff0c;也可以用来封装验证平台&#xff0c;在模块内部&#xff0c…