UVM核心服务类宏定义UVM_CORESERVICE_TYPE和核心服务类class uvm_coreservice_t代码解析

// 定义一个宏,用于指定 UVM 核心服务类的类型
ifndef UVM_CORESERVICE_TYPE
  `define UVM_CORESERVICE_TYPE uvm_default_coreservice_t
endif

// 定义一个类型别名,用于简化对 UVM 核心服务类的引用
typedef class `UVM_CORESERVICE_TYPE;

// 定义一个虚类 `uvm_coreservice_t`,它是 UVM 核心服务的基类
virtual class uvm_coreservice_t;
  // 定义一个静态变量 `inst`,用于存储 UVM 核心服务对象的实例
  local static `UVM_CORESERVICE_TYPE inst;

  // 定义一个静态函数 `get`,用于获取 UVM 核心服务对象的实例
  static function uvm_coreservice_t get();
    // 如果 `inst` 为空,则创建一个新的 UVM 核心服务对象
    if (inst == null)
      inst = new;
    // 返回 `inst` 对象
    return inst;
  endfunction // get

endclass

// 定义一个类 `uvm_default_coreservice_t`,它是 UVM 核心服务的默认实现
class uvm_default_coreservice_t extends uvm_coreservice_t;
  // 定义三个私有成员变量,分别用于存储 UVM 工厂、事务数据库和报告服务器对象
  local uvm_factory factory;
  local uvm_tr_database tr_database;
  local uvm_report_server report_server;

  // 定义一个虚函数 `get_factory`,用于获取 UVM 工厂对象
  virtual function uvm_factory get_factory();
    // 如果 `factory` 为空,则创建一个新的 UVM 工厂对象
    if (factory == null) begin
      // 创建一个新的 UVM 默认工厂对象
      uvm_default_factory f;
      f = new;
      // 将 `f` 对象赋值给 `factory`
      factory = f;
    end
    // 返回 `factory` 对象
    return factory;
  endfunction

endclass

代码功能解析:

这段代码定义了 UVM 核心服务的实现,包括基类 uvm_coreservice_t 和默认实现类 uvm_default_coreservice_t。

  1. uvm_coreservice_t 类:

它是 UVM 核心服务的基类,定义了获取 UVM 核心服务对象的静态函数 get。

使用 UVM_CORESERVICE_TYPE 宏来定义核心服务类的类型,默认情况下使用 uvm_default_coreservice_t。

使用静态变量 inst 来存储核心服务对象的实例,并使用 get 函数来获取该实例。

  1. uvm_default_coreservice_t 类:

它是 UVM 核心服务的默认实现,继承自 uvm_coreservice_t。

定义了三个成员变量:factory、tr_database 和 report_server,分别用于存储 UVM 工厂、事务数据库和报告服务器对象。

定义了 get_factory 函数,用于获取 UVM 工厂对象。如果 factory 为空,则创建一个新的 UVM 默认工厂对象,并将其赋值给 factory。

工作原理:

UVM 核心服务类提供了一组核心服务,例如工厂、事务数据库和报告服务器,用于管理 UVM 组件和对象。

uvm_coreservice_t 类是一个虚类,它定义了获取 UVM 核心服务对象的接口。

uvm_default_coreservice_t 类是 UVM 核心服务的默认实现,它提供了 UVM 工厂、事务数据库和报告服务器的默认实现。

UVM 使用 uvm_coreservice_t 类来管理 UVM 核心服务,并使用 uvm_default_coreservice_t 类来提供 UVM 核心服务的默认实现。

使用场景:

UVM 组件和对象可以使用 uvm_coreservice_t::get() 函数来获取 UVM 核心服务对象,然后使用该对象来访问 UVM 核心服务,例如创建组件、注册对象、记录事务和报告错误。

总结:

这段代码定义了 UVM 核心服务的实现,包括基类 uvm_coreservice_t 和默认实现类 uvm_default_coreservice_t。UVM 核心服务类提供了一组核心服务,用于管理 UVM 组件和对象。

请逐行注释下面的代码class riscv_instr_base_test extends uvm_test; riscv_instr_gen_config cfg; string test_opts; string asm_file_name = "riscv_asm_test"; riscv_asm_program_gen asm_gen; string instr_seq; int start_idx; uvm_coreservice_t coreservice; uvm_factory factory; uvm_component_utils(riscv_instr_base_test) function new(string name="", uvm_component parent=null); super.new(name, parent); void'($value$plusargs("asm_file_name=%0s", asm_file_name)); void'($value$plusargs("start_idx=%0d", start_idx)); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); coreservice = uvm_coreservice_t::get(); factory = coreservice.get_factory(); uvm_info(gfn, "Create configuration instance", UVM_LOW) cfg = riscv_instr_gen_config::type_id::create("cfg"); uvm_info(gfn, "Create configuration instance...done", UVM_LOW) uvm_config_db#(riscv_instr_gen_config)::set(null, "*", "instr_cfg", cfg); if(cfg.asm_test_suffix != "") asm_file_name = {asm_file_name, ".", cfg.asm_test_suffix}; // Override the default riscv instruction sequence if($value$plusargs("instr_seq=%0s", instr_seq)) begin factory.set_type_override_by_name("riscv_instr_sequence", instr_seq); end if (riscv_instr_pkg::support_debug_mode) begin factory.set_inst_override_by_name("riscv_asm_program_gen", "riscv_debug_rom_gen", {gfn, ".asm_gen.debug_rom"}); end endfunction function void report_phase(uvm_phase phase); uvm_report_server rs; int error_count; rs = uvm_report_server::get_server(); error_count = rs.get_severity_count(UVM_WARNING) + rs.get_severity_count(UVM_ERROR) + rs.get_severity_count(UVM_FATAL); if (error_count == 0) begin uvm_info("", "TEST PASSED", UVM_NONE); end else begin uvm_info("", "TEST FAILED", UVM_NONE); end uvm_info("", "TEST GENERATION DONE", UVM_NONE); super.report_phase(phase); endfunction virtual function void apply_directed_instr(); endfunction task run_phase(uvm_phase phase); int fd; for(int i = 0; i < cfg.num_of_tests; i++) begin string test_name; randomize_cfg(); riscv_instr::create_instr_list(cfg); riscv_csr_instr::create_csr_filter(cfg); asm_gen = riscv_asm_program_gen::type_id::create("asm_gen", , gfn); asm_gen.cfg = cfg; asm_gen.get_directed_instr_stream(); test_name = $sformatf("%0s_%0d.S", asm_file_name, i+start_idx); apply_directed_instr(); uvm_info(gfn, "All directed instruction is applied", UVM_LOW) asm_gen.gen_program(); asm_gen.gen_test_file(test_name); end endtask virtual function void randomize_cfg(); DV_CHECK_RANDOMIZE_FATAL(cfg); uvm_info(`gfn, $sformatf("riscv_instr_gen_config is randomized:\n%0s", cfg.sprint()), UVM_LOW) endfunction endclass
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值