下面讲一下 vmm_ral_env 中的ral, 以及 vmm_ral_access类的介绍。
先看一下vmm_ral_env的源代码:
class vmm_ral_env extends `VMM_ENV;
vmm_ral_access ral;
extern function new(string name = "RAL-Based Verif Env");
extern virtual task sw_reset(string domain = "");
endclass: vmm_ral_env
function vmm_ral_env::new(string name= "RAL-Based Verif Env");
super.new(name);
this.ral = new;
endfunction: new
task vmm_ral_env::sw_reset(string domain = "");
endtask: sw_reset
以上可以看出 vmm_ral_env自动创建了vmm_ral_access 类型的 ral 实例. 而vmm_ral_access是从vmm_xactor派生出来的,本质上是一个physical access component。
我们看一下ahb subenv的构造函数:
extern function new(string inst = "",
ahb_mst_subenv_cfg cfg = null,
vmm_consensus end_test,
virtual ahb_subenv_if vif,
vmm_ral_access ral=null);
如次,可以将vmm_ral_env中的ral传入subenv中的ral引用。通过 ral.set_model(vmm_ral_block_or_sys model) 函数将 特定的 ral model 和 ral 这个physical access component 关联起来。
其实我们不一定要把 physical access component (ral) 和 特定的ral model (通过ralf 和ralgen 脚本生产)关联起来,也可以用ral的基本read,write函数。但是,synopsy的vmm_ral_access源代码在实现add_xactor时非要检查所谓的ral model 是否为空,否则退出,所以我们要用一个dummy model来骗过vmm。 代码如下:
myenv.sv 文件
// instance of ral dummy model
vmm_ral_sys dummy_model;
.....
function void myenv::build();
super.build();
dummy_model=new(null,"dummy_model", "dummy", 4, vmm_ral::LITTLE_ENDIAN,0,"ahb");
mst_subenv = new("Master Subenv", mst_cfg,end_vote,intf_inst,this.ral);
....
endfunction: build