ee_king的个人空间 https://blog.eetop.cn/1494617 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Configuring a Test Environment(从Configuration_Configuration Objects开始

已有 508 次阅读| 2018-12-17 09:06 |系统分类:芯片设计

   Configuration Objects  

       配置对象是用于组织配置变量的有效的可重用的机制。在典型的测试平台中,通常会有几个配置对象,每个配置对象都绑定到一个组件。它们被创建为uvm_object的子类,并将整个测试结构层次的给定分支的所有相关配置参数组合在一起。还可以有一个附加的单个的配置对象来单独保存全局配置参数。
       UVM配置数据库负责处理object的范围和存储。以下是agent的典型配置对象的代码。它有一个虚拟接口,用于指向代理连接的接口,且还拥有用于描述和控制该接口的许多变量。

       // configuration class
       class wb_config extends uvm_object;
         `uvm_object_utils( wb_config );

       // Configuration Parameters
         virtual wishbone_bus_syscon_if v_wb_bus_if; // virtual wb_bus_if
         int m_wb_id; // Wishbone bus ID
         int m_wb_master_id; // Wishbone bus master id for wishone agent
         int m_mac_id; // id of MAC WB master
         int unsigned m_mac_wb_base_addr; // Wishbone base address of MAC
         bit [47:0] m_mac_eth_addr; // Ethernet address of MAC
         bit [47:0] m_tb_eth_addr; // Ethernet address of testbench for sends/receives
         int m_mem_slave_size; // Size of slave memory in bytes
         int unsigned m_s_mem_wb_base_addr; // base address of wb memory for MAC frame. buffers
         int m_mem_slave_wb_id; // Wishbone ID of slave memory
         int m_wb_verbosity; // verbosity level for wishbone messages

         function new( string name = "" );
            super.new( name );
         endfunction

       endclass

    Using a Configuration Object

       任何需要配置的组件都应执行以下步骤:

  • 得到自己的配置;
  • 根据其配置创建自己的内部结构和行为;
  • 配置它的子类。

        作为顶层组件的测试组件从测试参数包或UVM配置数据库(例如虚拟接口句柄)获取其配置值。然后,它为环境中的组件设置特定的测试配置参数。

       class test_mac_simple_duplex extends uvm_test;
       ...

           wb_config wb_config_0; // config object for WISHBONE BUS
            ...

           function void set_wishbone_config_params();
                //set configuration info
                // NOTE The MAC is WISHBONE slave 0, mem_slave_0 is WISHBONE slave 1
                // MAC is WISHBONE master 0, wb_master is WISHBONE master 1
                wb_config_0 = new();

                if( !uvm_config_db #(virtual wishbone_bus_syscon_if)::get( this , "" , "WB_BUS_IF" , wb_config_0.v_wb_bus_if ) ) begin
                     `uvm_error(...)
                end

                wb_config_0.m_wb_id = 0; // WISHBONE 0
                wb_config_0.m_mac_id = 0; // the ID of the MAC master
                wb_config_0.m_mac_eth_addr = 48'h000BC0D0EF00;
                wb_config_0.m_mac_wb_base_addr = 32'h00100000;
                wb_config_0.m_wb_master_id = 1; // the ID of the wb master
                wb_config_0.m_tb_eth_addr = 48'h000203040506;
                wb_config_0.m_s_mem_wb_base_addr = 32'h00000000;
                wb_config_0.m_mem_slave_size = 32'h00100000; // 1 Mbyte
                wb_config_0.m_mem_slave_wb_id = 0; // the ID of slave mem
                wb_config_0.m_wb_verbosity = 350;

                uvm_config_db #( wb_config )::set( this , "*" , "wb_config" , wb_config_0 );
           endfunction

           ...
       

           function void build_phase( uvm_phase );
              super.build_phase( phase );

              set_wishbone_config_params();
              ...
           endfunction

           ...

       endclass

       使用配置对象的组件通过使用uvm_config_db :: get来获取它。在此示例中,driver从object获取虚拟接口句柄,ID和verbosity。

       class wb_m_bus_driver extends uvm_driver #(wb_txn, wb_txn);
       ...

          virtual wishbone_bus_syscon_if m_v_wb_bus_if;
          bit [2:0] m_id; // Wishbone bus master ID
          wb_config m_config;
          ...

          function void build_phase( uvm_phase phase );
             super.build_phase( phase );

             if( !uvm_config_db #( wb_config )::get( this , "" , "wb_config" , m_config ) ) begin
                `uvm_error(...)
             end
             m_id = m_config.m_wb_master_id;
             ...
          endfunction

          function void connect_phase( uvm_phase phase );
             super.connect_phase( phase );
             m_v_wb_bus_if = m_config.v_wb_bus_if; // set local virtual if property
          endfunction

          function void end_of_elaboration();
             set_report_verbosity_level_hier(m_config.m_wb_wb_verbosity);
          endfunction
          ...

       endclass

    Configuring sequences

        这里有一篇关于配置sequence的文章。

    Configuring DUT connections

        设置DUT-to-Testbench连接是一种始终需要的配置活动。SV模块(通常是顶层模块,但有时是ProtocolModules)必须在配置空间中添加虚拟接口。在测试平台上,测试组件从UVM config database获取虚拟接口句柄,并将其应用于适当的配置对象。

       class test_mac_simple_duplex extends uvm_test;
          ...

          function void set_wishbone_config_params();
             wb_config_0 = new();
             // Get the virtual interface handle that was set in the top module or protocol module
             if( !uvm_config_db #( virtual wishbone_bus_syscon_if )::get( this , "" , "WB_BUS_IF" , wb_config_0.v_wb_bus_if ) ) begin
                `uvm_error(...)
             end
             ...  

             uvm_config_db #( wb_config )::set( this , "*","wb_config",wb_config_0, 0); // put in config           endfunction

           ...

       endclass
             
       Example source code

       (在http://verificationacademy.com/uvm-ovm上在线下载源代码示例)。


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 6

    评论
  • 访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-22 15:13 , Processed in 0.016544 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部