首页 > 其他分享 >UVM -11 (练习)

UVM -11 (练习)

时间:2024-03-15 17:24:15浏览次数:12  
标签:11 function sequencer 练习 test UVM env phase uvm

sequencer使用

user sequencer类的创建

class gpio_sequencer extends uvm_sequencer #(gpio_transfer);
  `uvm_component_utils(gpio_sequencer)

  function new (string name,uvm_component parent);
    super,new(name,parent);
  endfunction

endclass

virtual sequencer的使用

// 创建virtual sequencer
class virtual_sequencer extends uvm_sequencer;
  `uvm_component_utils(virtual_sequencer); // 注册
  
  // 三个sequencer的句柄
  gpio_sequencer p_gpio_sqr;
  uart_sequencer p_uart_1_sqr;
  uart_sequencer p_uart_2_sqr;

  function new(stirng name,uvm_component parent);
    super.new(name,parent);
  endfunction
 
endclass
class base_test extends uvm_test;
  // 不同的协议,创建不同的transaction对象
  // 使用不同的sequence产生数据
  // 使用不同sequencer发送数据
  gpio_environment gpio_env;
  uart_environment uart_1_env;
  uart_environment uart_2_env;

  virtual_sequencer v_sqr;
  
  reg_model rn;
  my_adapter reg_sqr_adapter;
  my_scoreboard scb;

  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);
  extern virtual function void report_phase(uvm_phase phase);

  `uvm_component_utils(base_test);
  
endclass

function void base_test::build_phase(uvm_phase phase);
  super.build_phase(phase);
  // 创建对象
  gpio_env = gpio_environment::type_id::create("gpio_env",this);
  uart_1_env = uart_environment::type_id::create("uart_1_env",this);
  uart_2_env = uart_environment::type_id::create("uart_2_env",this);
  v_sqr = my_vsqr::type_id::create("v_sqr",this);
endfunction

function void connect_phase(uvm_phase phase);
  super.connect_phase(phase);
  v_sqr.p_gpio_sqr = gpio_env.agt.sqr;
  v_sqr.p_uart_1_sqr = uart_1_env.agt.sqr;
  v_sqr.p_uart_2_sqr = uart_2_env_agt.sqr;
endfunction

uvm_exercise1

1.添加uvm库到验证环境
2.仿真调用case0
3.打印uvm拓扑结构

import uvm_pkg::*
`include "uvm_macros.svh"

program automatic test;


initial begin
  run_test();
end

endprogram
  
program automatic test;
  import uvm_pkg::*;
  `include "uvm_macros.svh"
  
  class my_test extends uvm_test;
    string name;
    `uvm_component_utils(my_test); // 注册类
    function new(string name,uvm_component parent);
      super.new(name,parent);
    endfunction 

    virtual function build_phase(uvm_phase phase);
      super.build_phase(phase);
      `uvm_info("build_test","Hello uvm",UVM_MEDIUM);
    end function 

    virtual task run_phase(uvm_phase phase);
      `uvm_info("build_test","Hello uvm",UVM_MEDIUM);
    endtask;
  endclass
  
  initial begin
    run_test();
  end
endprogram

打印testbench的结构

test

program automatic test;
  import uvm_pkg::*;
  `include "uvm_macros.svh"
  
  class my_test extends uvm_test;
    string name;
    `uvm_component_utils(my_test); // 注册类
    function new(string name,uvm_component parent);
      super.new(name,parent);
    endfunction 

    virtual function build_phase(uvm_phase phase);
      super.build_phase(phase);
      `uvm_info("build_test","Hello uvm",UVM_MEDIUM);
    end function 

    virtual task run_phase(uvm_phase phase);
      `uvm_info("build_test","Hello uvm",UVM_MEDIUM);
    endtask;
  endclass
  
  initial begin
    run_test();
  end
endprogram
  • 在program定义一个test类,就是testcase对应的类,一个testcase对应一个类,可以定义一个test_base类,将其包含进来
  • 在initial begin中使用run_test()启动testbench

test_base

`ifndef TEST_BASE__SV
`define TEST_BASE__SV

// test中要例化env,所以将env.sv文件包含在test_base中
`include "router_env.sv"

class test_base extends uvm_test;
  // 注册组件
  `uvm_component_utils(test_base);
  
  // 创建env
  router_env env;
  
  // 构造函数
  function new(string name,uvn_component parent);
    super.new(name,parent);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);
  endfunction
  
  // phase函数

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);
    env = router_env::type_id::create("env",this);
  endfunction

  virtual function void start_of_simulation_phase(uvm_phase phase);
    super.start_of_simulation(phase);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);
    
    // 打印uvm tb结构信息
    uvm_top.print_topology();   
    // 打印factory当中registry相关的信息
    factory.print();  
  endfunction
  
endclass


test

program automatic test;
  import uvm_pkgs::*;
  `include "uvm_maros.svh"
  `include "test_base.sv"

  initial begin
    run_test();
  end
endprogram

router_env

  • env环境当中例化agent,scoreboard等
`include "input_agent.sv"

class router_env extends uvm_env;
  input_agent i_agent;
  `uvm_component_utils(router_env);
  
  function new(string name,uvm_component parent);
    super.new(name,parent);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);

    // 通过工厂创建对象
    i_agent = input_agent::type_id::create("i_agent",this);

    // 设置input squencer执行packet squence作为默认的sequence
    uvm_config_db #(uvm_object_wrapper)::set(this,"i_agent.seqr.main_phase","default_sequence",packet_sequence::get_type());
  endfunction
endclass

input agent

  • agent当中会例化driver,squenecer,monitor
`include "packet_squence.sv"
`include "driver.sv"
`include "monitor.sv"

// 这里直接使用uvm_sequencer做为sequencer
// 实际应该写一个sequencer继承uvm_sequencer
typedef uvm_sequencer #(packet) packet_sequencer;

class input agent extends uvm_agent;
  packet_sequencer seqr;  
  driver drv;

  `uvm_component_utils(input_agent)

  function new(string name,uvm_component parent);
    super.new(name,parent);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);
  endfunction

  virtual function void build_phase(uvm_phase phase) ;
    super.build_function(phase);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);
    seqr = packet_squencer::type_id::create("seqr",this);
    drv = driver::type_id::create("drv",this);
  endfunction

  virtual function void connect_phase(uvm_phase phase);
    super.connect_phase(phase);
    `uvm_info("TRACE",$sformat("%m"),UVM_HIGH);
    
    // 连接sequencer和driver
    drv.seq_item_port.connect(seqr.seq_item_export);
  endfunction

endclass

driver

class driver extends uvm_driver;
  `uvm_component_utils(driver);

  function new(string name,uvm_component parent);
    super.new(name,parent);
  endfunction

  virtual task run_phase(uvm_phase phase);
    // 获取数据发送数据
    forever begin
      seq_item_port.get_next_item(req);
      req.print();    
      seq_item_port.item_done();
    end
  endtask
endclass

packet_sequence

class packet_sequence extends uvm_sequence #(packet);
   `uvm_object_utils(packet_sequence)

    function new(string name);
      super.new(name);
    endfunction
    
    // 设置默认squence的时候,会自动调用body()
    virtual task body();
      if(starting phase != null)
        starting_phase.raise_objection(this);  
        repeat(10) begin
          `uvm_do(req);
        end

      if(starting_phase !=null);
        starting_phase.drop_objection(this);
    endtask
endclass

标签:11,function,sequencer,练习,test,UVM,env,phase,uvm
From: https://www.cnblogs.com/Icer-newer/p/18075331

相关文章

  • 1192362-32-5,DOTA-LM3是一种反应活性的化合物
    英文名称:DOTA-LM3CAS:1192362-32-51.分子式:C69H93ClN16O19S22.分子量:1550.163.包装规格:1g、2g、5g4.形状:固体粉末5.存储:冷藏保存,对光和温度敏感,为了试剂使用效果,材料应始终保持在低温干燥条件下,避光,避免频繁解冻和冷冻。结构式【描述】DOTA-LM3,其CAS号为1192362-32-5......
  • Linux 安装IntelAx211无线网卡
    https://blog.csdn.net/shikaiaixuexi/article/details/131565396sudoaptinstallgitmakesudoaptinstallflexbisongitclonehttps://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.gitcdbackport-iwlwifisudomakedefconfig-iwlwifi-......
  • 无线电模块ODIN-W263-06B专为物联网网关应用而设计,QN9080-001-M17Y支持蓝牙和NFC的模
    本篇文章主要介绍三款无线模块:无线电模块ODIN-W263-06B专为物联网网关应用而设计,QN9080-001-M17Y支持蓝牙和NFC的模块,RS9116W-DB00-AB1多协议无线模块——明佳达1、ODIN-W2系列:具有Wi-Fi和蓝牙双模式(蓝牙BR/EDR和蓝牙低能耗v4.2)描述:ODIN-W2是一款紧凑而强大的独立多无线电模块......
  • LY1168 [ 20230325 CQYC省选模拟赛 T3 ] 游戏
    题意给定\(n\)个区间\(l_i,r_i,k_i\)。\(k_i\)表示解锁当前点当且仅当\(l_i\tor_i\)的区间内至少有\(k_i\)个点被解锁。问一共能解锁多少点。Sol直接暴力跑是\(n^2\)的。不难想到优化建图,复杂度:\(O(nk\log)\)这样明显是过不去的。集中注意力。注意到操......
  • UVM - 10 (Sequence机制-2)
    配置sequence:基于instance基于instance配置的好处基于sequencer配置sequence基于sequencer配置的好处基于agent配置sequence在phase中隐式执行sequence显式执行sequencesequence的优先级和权重weightsequencer-driver响应端口(reportport)sequencer-driver......
  • UVM - 7 (Sequence机制)
    内容sequence概述uvm_sequence_item-数据建模uvm_sequence-产生数据uvm_squencer-将产生的数据给到driveruvm_driver-数据驱动给dutsequencer是uvm组件,一个sequencer可以调用多个sequenceuvm_squenceclass普通成员sequence执行流程sequencer和driver是......
  • Android11 FallbackHome启动和关闭流程分析
    Android7.0引入了新特性:DirectBootMode,设备启动后进入的一个新模式,直到用户解锁(unlock)设备此阶段结束。在这个模式下,系统调用resolveHomeActivity找到的是FallbackHome,而不是我们的桌面应用。所以系统开始启动的是FallbackHome这个"桌面"。03-1316:58:41.35943......
  • Android 11 SystemServer启动流程
    在Android11Zygote启动流程有提到,Zygote通过forkSystemServer,fork出SystemServer进程,并在SystemServer进程中调用handleSystemServerProcess返回一个Runnable //...... /*Forchildprocess*/if(pid==0){if(hasSecondZygote(abiList))......
  • Android 11 Zygote启动流程
    Zygote进程由init进程启动,是systemserver进程和APP进程的父进程先看一下rc文件,以init.zygote32.rc为例servicezygote/system/bin/app_process-Xzygote/system/bin--zygote--start-system-serverclassmainpriority-20userrootgrouprootr......
  • 浮木云学习日志(11)---表格设计(一)
    ​表格作为展现数据最为清晰、高效的形式之一,同时又具有复用度高,拓展性强优势,是最常见的信息展示形式,也是对数据进行浏览和操作最便捷的设计方式,合理的表格设计能给用户带来高效的信息获取率。今天我就利用浮木云软件设计开发平台https://www.fumucloud.com/设计一款简洁美观的......