首页 > 其他分享 >【学习记录丨UVM】1.6代理人agent

【学习记录丨UVM】1.6代理人agent

时间:2024-10-12 10:20:58浏览次数:8  
标签:1.6 agent active UVM phase my uvm

《UVM白皮书》关于agent的介绍

driver和monitor处理同一协议,uvm中通常将二者封装在一起,成为一个agent。

一、一个agent示例

class my_agent extends uvm_agent;
  my_driver  drv;
  my-monitor mon;

  `uvm_component_utils(my_agent)

  function new(string name="my_agent",uvm_component parent);//书上这里没有写name=“xx”
    super.new(name,parent);
  endfunction

  extern virtual function void build_phase(uvm_phase phase);
  extern virtual function void connect_phase(uvm_phase phase);
endclass
      
function void my_agent::build_phase(uvm_phase phase);
  super.build_phase(phase);

  if(is_active == UVM_ACTIVE)begin//is_active是uvm_agent的一个成员变量
    drv = my_driver::type_id::create("drv",this);
  end

  mon = my_monitor::type_id::create("mon",this);
endfunction

function void my_agent::connect_phase(uvm_phase phase);
  super.connect_phase(phase);
endfunction
  1. my_agent派生自uvm_agent,是uvm_component.所以用uvm_component_utils进行factory机制注册。;
  2. function new函数书上这里没有加上name=“my_agent”,跟前边一致可以加上;
  3. 组件的实例化是在build_phase中完成的。
  4. 这里出现了is_active,接下来将对其进行简单介绍:

二、uvm_agent的成员变量is_active

上边my_agent示例中driver的实例化出现了if条件判断。 

  if(is_active == UVM_ACTIVE)begin//is_active是uvm_agent的一个成员变量
    drv = my_driver::type_id::create("drv",this);
  end

1. is_active是哪里来的?

is_active是在UVM库中uvm_agent源文件中声明的一个成员变量。所有派生自uvm_agent的agent组件都自动继承了这个成员变量,无需再声明,可以直接使用。

2. is_active怎么使用?

UVM中is_active的值有两个,一个是UVM_ACTIVE(该值=1),另一个是UVM_PASSIVE(该值=0)。 is_active在UVM中的默认值是UVM_ACTIVE也就是1。我们在使用的时候,可以改变is_active的值进行期望的操作。

3.is_active的值在哪里修改?

is_active的值在实例化agent组件的时候可以进行修改。 一般会在env的build_phase中进行agent的实例化,也在这里进行is_active值的修改,后文将会进行介绍。

4.is_active在本文例子中是什么作用?

agent一般封装了driver和monitor组件,因为二者一般是“成对”的,“有一致性”,方便我们后续验证平台的搭建,也会使得UVM树形组织结构更加清晰。

但是有时候我们并不需要都把driver实例化,比如说agent只用于检测DUT输出端口,这并不需要我们为DUT提供激励,那也就没必要实例化driver。

那我们就可以根据成员变量is_active的值,加入条件判断,通过改变is_active的值来根据需要选择是否在实例化当前agent时用driver组件。

三、实例化agent

在加入容器类env时,我们直接在env中实例化了driver和monitor;但是现在我们已经用agent对driver和monitor进行了封装。那我们直接实例化agent就行了。

这里怎么理解呢? 我们可以想成:env是一个菜篮子,driver和monitor是一对物品1和2,我们现在把这对物品装在袋子agent里。 现在我们把袋子agent放在篮子env中就大功告成了。————(比喻可能不恰当。。能理解就好,别再被我的比喻绕晕了。。。)

1. 在env中例化agent的示例

class my_env extends uvm_env;
  my_agent  i_agt;//新增
  my_agent  o_agt;//例化两个agent

  ·uvm_component_utils(my_env)
  function new(string name="my_env",uvm_component parent);
    super.new(name,parent);
  endfunction

 virtual function void build_phase(uvm_phase phase);//在build_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);//实例化agent
    i_agt.is_active = UVM_ACTIVE;
    o_agt.is_active = UVM_PASSIVE;//指定实例化的agent的成员变量is_active的值
  endfunction
endclass

示例中o_agt.is_active = UVM_PASSIVE;结合my_agent说明在组件o_agt中不用实例化driver了。

2. 此时的UVM树形结构 

agent内封装driver和monitor之后,验证平台的层次结构更加清晰了。如下所示。

3. top_tb中config_db#set路径索引 

随着验证平台层次结构的变化,组件的路径索引也将发生变化。通过config_db机制连接top_tb和driver/monitor的interface的set函数也需要改变其第2个参数(路径索引)。

应该改为:

initial begin
 uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.i_agt.drv", "vif", input_if);
 uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.i_agt.mon", "vif", input_if);
 uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.o_agt.mon", "vif", output_if);
end

注意!!!

这里我们用到了两个接口,一个是i_agt和DUT之间的input_if,另外一个是o_agt和DUT之间的output_if。要注意路径索引的对应关系。 

标签:1.6,agent,active,UVM,phase,my,uvm
From: https://blog.csdn.net/yanwenyu123/article/details/142821314

相关文章

  • Idea android应用kotlin-stdlib-1.8.20 kotlin-stdlib-jdk81.6.21冲突
    Ideaandroid应用kotlin-stdlib-1.8.20kotlin-stdlib-jdk81.6.21冲突idea中开发android应用,安装android插件后,新建项目,然后各种包更新,最后运行时提示kotlin-stdlib-1.8.20kotlin-stdlib-jdk8:1.6.21冲突错误如下:FAILURE:Buildfailedwithanexception.Whatwentwrong:......
  • 大模型agent开发之文本向量化
    文本向量化实现方式 在复杂的大模型中文本向量化有很多好处,比如提高检索速度,在大规模数据集上向量通过相似表示可以快速找到相似文本,在处理长文本和跨语言对齐等任务上也可以减少很多开销。在langchain中可以从包langchain.embeddings.openai中可以引入方法OpenAIEmbeddings定义......
  • 2024 最新 IntelliJ IDEA 2024.1.6 激活(亲测可用)
    注意:接下来本文分享免费激活 IDEA 等Jetbrains全家桶工具,一直支持到最新版本2024.1.6。 1.下载安装IDEA (mac、window、linux都支持)大家直接在官网下载最新版本,登陆官网,下载最新版本2024.1.4。一步一步确定安装,然后打开这里提示输入激活码,先关闭应用!!!2.下载激活工具打......
  • 从0手搓4种Agentic模式,主打去框架化!
    AgenticPatterns项目:包含AndrewNg在其DeepLearning.AI博客文章系列中定义的4种Agentic模式的从头实现,主打去框架化:没有LangChain,没有LangGraph,没有LlamaIndex,没有CrewAI。对LLMAPI调用纯粹而简单。反思模式:ReflectionPattern这是一个非常基本的模式,但尽管它很简......
  • Unity ML-Agents: 革新游戏AI开发的开源工具包
    ml-agentsUnityML-Agents:革新游戏AI开发的开源工具包UnityML-Agents(MachineLearningAgents)是UnityTechnologies推出的一个开源项目,旨在将游戏和模拟环境转变为训练智能代理的平台。这个工具包为游戏开发者和AI研究人员提供了一个强大而灵活的框架,使他们能够轻松地在Un......
  • 一文彻底搞懂大模型 - Dify(Agent + RAG)
    **Dify是一个用于构建AI应用程序的开源平台。****Dify融合了后端即服务(BackendasService)和LLMOps理念。它支持多种大型语言模型,如Claude3、OpenAI等,并与多个模型供应商合作,确保开发者能根据需求选择最适合的模型。**Dify通过提供强大的数据集管理功能、可视化的Prompt......
  • 对UVM添加超时前的打印信息+AXI低功耗接口+process的await语句+对象当成参数+sv的单例
    对UVM添加超时前的打印信息首先获取到UVM的超时值,然后手动设定\$time的比较和while延时循环,当超出时间后,打印特殊的debug信息。$time<set_time,则进行循环。uvm_cmdline_processorclp;clp=uvm_cmdline_processor::get_inst();stringtimeout_settings[$];stringtimeout......
  • 大模型应用开发初探 : 基于Coze创建Agent
    大家好,我是Edison。最近学习了一门课程《AIAgent入门实战》,了解了如何在Coze平台上创建AIAgent,发现它对我们个人(C端用户)而言十分有用,分享给你一下。Coze是什么?Coze(扣子)是字节跳动公司开发的新一代AI应用开发平台,使用这个AI应用开发平台,无论你是否有编码基础,都可以快速搭建基......
  • 用Python实现AI生成音乐:通过Magenta与MIDIUtil开启音乐与AI的创作之旅
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界引言随着人工智能(AI)的快速发展,机器学习在诸多领域得到了广泛应用,其中之一便是音乐生成。通过结合AI技术,计算机不仅能够分析和识别音乐,还能够自动创作音乐。无论是简单的旋律生成,还是复杂的音乐作品,都可以通过AI......
  • 【学习记录丨UVM】1.2驱动器driver(1)——最简单的driver及其实例化
    《UVM白皮书》关于driver的介绍一、只有driver——最简单的验证平台UVM是一个库,其中的driver等组件都是派生(extends)自UVM库中的类(class)。类中通过function和task实现组件功能。UVM常用类及树形结构_uvm树-CSDN博客 下边这张图展示了UVM常用的类之间的派生关系。可......