首页 > 其他分享 >UVM中的TLM(事务级建模)通信(2)

UVM中的TLM(事务级建模)通信(2)

时间:2024-08-26 15:50:48浏览次数:12  
标签:UVM 建模 analysis imp fifo phase my TLM uvm

上一篇介绍了UVM中利用TLM进行的一对一通信:UVM中的TLM(事务级建模)通信(1)-CSDN博客,除此之外,UVM还有两种特殊的端口:analysis_portanalysis_export,用于完成一对多的通信。

1.analysis端口

        这两种端口同样也是用于传递transaction,他们与put,get的区别是:

        (1)一个analysis_port(analysis_export)可以连接多个IMP,也就是完成一对多的通信,而put、get与相应的imp之间只能实现一对一的通信;与此相比,analysis端口的功能类似于一个广播。

        (2)analysis端口不像put、get一样具有阻塞和非阻塞的概念,它本身作为广播,不必等待相连的其他端口的响应。对于analysis_port和analysis_export来说,只有一种操作:wirte。因此在analysis_imp所在的component,需要定义一个write函数(不耗时的funciton)。

        env中的连接关系为:

function void my_env::connect_phase(uvm_phase phase);
    super.connect(phase);
    A.ap.connect(B.B_imp);
    B.ap.connect(C.C_imp);
endfunction

2.monitor与scoreboard的连接举例

        考虑out_agent中的monitor与scoreboard之间通信,在monitor中:

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

在scb中:

class scoreboard extends uvm_scoreboard;
    uvm_analysis_imp#(my_transaction,scoreboard) scb_imp;
    task write(my_transaction tr);
    ...
    endtask
endclass

连接方式:

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);
    out_agent.ap.connect(scb.scb_imp);
    ...
endfunction

        现实情况中,scoreboard除了接受monitor的数据之外,还要接受ref model的数据,那么对应ref model这一路数据的imp也要有自己的write函数,该怎么区分呢?

        UVM给出的方法是定义了一个宏uvm_analysis_imp_decl,通过在后面声明的后缀来进行区分。当调用时,系统自然会根据后缀的不同调用对应的imp和其write函数。

class scoreboard extends uvm_scoreboard; 
    `uvm_analysis_imp_decl(_monitor)
    `uvm_analysis_imp_decl(_model)
    uvm_analysis_imp_monitor#(my_transaction,scoreboard) monitor_imp;
    uvm_analysis_imp_model#(my_transaction,scoreboard) 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);
endclass

3.使用fifo的通信

        上文使用的方法对于初学者来说有些繁琐,我们还可以通过添加一个uvm_analysis_fifo的方法实现相同功能。

        fifo的本质是一块缓存加上两个imp,在加入了fifo之后数据收发的两端都可以作为port端口,这有助于scoreborad实现主动的接收。

scoreboard中的声明:

class scoreboard extends uvm_scoreboard;
    my transaction expect_queue[$];
    uvm_blocking_get_port #(my_transaction) exp_port;
    uvm_blocking_get_port #(my_transaction) act_port;
...
endclass

task scoreboard::main_phase(uvm_phase phase);
    fork
        while(1) begin
        exp_port.get(get_expect);
        expect_queue.push_back(get_expect);
        end
        while(1) begin
        act_port.get(get_actual);
        end
    join
endtask

env中连接:

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;

function void 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.agt_port.connect(agt_scb_fifo.blocking_get_export);
endfunction

        需要注意的是fifo的两头都要连接不要遗漏,因此当声明了n个analysis fifo时,需要connect的次数就是2n。

        还有一个疑问是fifo中有IMP,为什么连接时用的是export呢?因为fifo中的analysis_export和blocking_get_export虽然关键词是export,其类型还是IMP。UVM这样的声明方法隐藏了IMP,对于初学者来说更易理解(或许吧)。

        重要的是,使用了fifo之后,不必再在component中自己手写一个write的函数,可以直接调用。而且,当ref model和monitor同时连接到scb时,我们也可以轻易地解决连接问题。

4.fifo的调试

        uvm提供了几个函数用以fifo的调试:

        used可以用来查询fifo缓存的transaction;

        is_empty可以用来判断fifo缓存是否为空;

        is_full可以用来判断fifo缓存是否已满;

        flush函数可以用来清除缓存所有数据,一般用于复位。

        此外,fifo本质上是一个component,它的new函数原型为:

function new(string name, uvm_component parent = null, int size = 1);

        前两个参数为uvm_component的new函数前两个参数,第三个参数设定fifo上限,默认为1,若设定为0,则是无上限。

标签:UVM,建模,analysis,imp,fifo,phase,my,TLM,uvm
From: https://blog.csdn.net/zangzangbupei/article/details/141502265

相关文章

  • 【数学建模】层次分析法
    在数学建模问题求解中什么时候用到层次分析法在数学建模问题求解中,层次分析法(AnalyticHierarchyProcess,AHP)通常用于解决评价类问题,特别是在需要从多个备选方案中选择最佳方案时。以下是一些典型的应用场景:方案选择:当需要从多个备选方案中选择最佳方案时,可以使用层次分......
  • 2024数学建模国赛准备中!!!(2——非线性规划)
    第三章 非线性规划§1非线性规划非线性规划的实例与定义如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般说来,解非线性规划要比解线性规划问题困难得多。而且,也不象线性规划有单纯形法这一通用方法,非线性规划目前还没有适于各种问题的一......
  • 数学建模之Matlab快速入门--全
    前言:本文是之前学Matlab时候做的笔记,很适合快速入门数学建模中matlab和python是最常用的两个软件,现在本人更喜欢python去做数学建模文章目录界面介绍与操作快捷操作数据类型数值型整型浮点型复型逻辑型字符型struct数组cell数组函数句柄日期和时间型数据标准变量储存......
  • 【国赛速成系列】建模手三天速成计划
    内容来自https://www.bilibili.com/video/BV14M4m1y77t目录一、第一天1、常见模型分类2、两大学习神器(1)SPSSPRO (2)ChatGPT二、第二天三、第三天一、第一天建模手在最开始需要了解模型分类及国赛常见模型的用法1、常见模型分类(1)机理分析类     来源于实......
  • 数学建模比赛(国赛)水奖攻略
        之前很多同学私聊问我,学校要求参加数模比赛,但是不擅长建模编程,但又不想浪费这个时间该怎么办呢,今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧    有一句话说选择大于努力。所以选......
  • 家访(图论建模)
    第1题   家访 查看测评数据信息小明的老师应为小明平时的表现,要去小明家家访,小明所住的城市可看做一个二维网格,其中字符#表示障碍,‘.’表示空地。小明的老师住在左上角(1,1),小明住在右下角(n,m)。小明的老师要去小明家玩。小明的老师如果走到空地侧不需要任何代价,但是如果......
  • 最小步数(图论建模)
    第2题   最小步数 查看测评数据信息小明来到了一个矩形迷官,每个房间写着一个数字。小明初始在左上角的房间,她准备前往该迷言的右下角房间,每次小明可以向右或者向下行走一步。另外,小明可以进行若干次传送,每次可以花费1的步数,前往和当前房间不互素的任意一个房间。现在,小明......
  • 【保奖资料】2024年数学建模国赛B题保奖思路获取入口(后续会更新)
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!现分享2022年数学建模国赛B题资料分享,供大家学习:B题公式和算法文档解释第一问根据题目可知以下几点无人机被动测距只能测得两个发射机的夹角,但是不能知道发射机位于接收机的绝对方位,因此......
  • 【保奖资料】2024年数学建模国赛B题保奖思路获取入口(后续会更新)
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!现分享2022年数学建模国赛B题资料分享,供大家学习:B题公式和算法文档解释第一问根据题目可知以下几点无人机被动测距只能测得两个发射机的夹角,但是不能知道发射机位于接收机的绝对方位,因此......
  • UVM中的TLM(事务级建模)通信(1)
    1.验证平台内部的通信    我们希望在验证平台内部找到两个component之间适合通信的方法,在接触TLM之前,想到的方法无非有采用全局变量、通过config_db传输等等。然而全局变量因为安全性不高,是我们长期以来竭力避免使用的方法;config_db虽然相对安全,但需要拉入basetest的......