UVM中的regmodel繼承自VMM的RAL(Register Abstract Layer),現在可以先將寄存器模型進行XML建模,再通過Synopsys
家的工具ralgen來直接生成regmodel,提供后門訪問,十分方便。
寄存器模型建模:
1)定義一個寄存器,如下;也可以在該class中定義covergroup,sample的function等。在以后的component中在采樣。
class reg_invert extends uvm_reg;
rand uvm_reg_field reg_data; //uvm_reg_field是寄存器模型中最小的單元,相當於一個bit
//可以定義多個uvm_reg_field;
covergroup cg_vars(); //定義covergroup
option.per_instance = 1; //按intance來采集覆蓋率
xxxxxxx;
endgroup
virtual function void build(); //與build phase不同,這僅僅是一個建立函數
reg_data = uvm_reg_field::type_id::creat("reg_data"); //new reg_field
reg_data.configure(); //可以定義該field在這個reg中的具體位置,操作方式,是否有復位值
endfunction //是否可以隨機化等。
function void sample_values();
super.sample_values();
if(get_coverage(UVM_CVR_FIELD_VALS)) begin //get_coverage()返回coverage是否使能
if(cg_vals != null) cg_vals.sample();
endfunction
configure(this, 1, 0, "RW", 1, 0, 1, 1, 0); this表示parent class,"1"表示此域的寬度,“0”表示最低位的位置,“RW”表示可讀可寫,“1”是否volatile
“0”上電后的復位值,“1”此域是否有復位,“1”是否可以隨機化,“0”此域是否可單獨存取
UVM_CVR_FIELD_VALS定義於uvm_coverage_model_e聯合體中,還有定義UVM_NO_COVERAGE, UVM_CVR_REG_BITS,
UVM_CVR_ADDR_MAP, UVM_CVR_ALL。
2)定義一組寄存器,如下:
class block_reg extends uvm_reg_block;
rand reg_gpr0 gpr0; //定義一個寄存器
rand uvm_reg_field ctrl_en; //也可定義一個寄存器部分
virtual function void build(); //同樣與build phase不同,僅僅一個建立函數
this.default_map = creat_map(); //先建立一個addr_map
this.gpr0 = reg_gpr0::type_id::create("gpr0",get_full_name() );
this.gpr0.configure(this, null, "");
this.gpr0.build();
this.gpr0.add_hdl_path(); //后門訪問的路徑
this.default_map.add_reg(); //前門訪問的地址
endfunction
begin
reg_gpr0_bkdr bkdr = new(this.gpr0.get_full_name() );
this.gpr0.set_backdoor(bkdr); //設置該寄存器對應的后門操作
end
create_map("", 0, 4, UVM_LITTLE_ENDIAN, 0); 參數名為空, 基地址為0, 系統總線的寬度是4*8,小端格式,不能按byte來尋址。
add_hdl_path(‘{‘{“REG1”, -1, -1}}); 表示作為一個整體來尋址。
add_hdl_path(‘{‘{“A_REG”, 15, 1}, '{"B_REG", 10, 2}}); 表示兩部分第15位的為A_REG,第10-11位是B_REG。
add_reg(this.gpr0, 'h0, "RW"); 表示寄存器gpr0,地址是0, 讀寫方式訪問。
class reg_gpr0_bkdr extends uvm_reg_backdoor;
virtual task read(uvm_reg_item rw);
do_pre_read(rw); //callback函數
rw.value[0] = `REG_TOP_PATH.A_REG; //路徑+已經定義過的A_REG,在add_hdl_path,PATH的定義可以放在命令行
rw.status = UVM_IS_OK; //返回的狀態值定義在uvm_state_e聯合體中,還有UVM_HAS_X, UVM_ERROR
do_post_read(rw);
endtask
virtual task write(uvm_reg_item rw);
//與read類似
endtask
endclass
uvm_reg_item派生自uvm_sequence_item,表示一個寄存器的Transaction。
uvm_reg_bus_op表示一個對register/memory的bus Transction,主要用在前門訪問中
最后子頂層env build_phase中定義如下:
uvm_reg::include_coverage("*", UVM_CVR_FIELD_VALS);
regmodel = block_reg::type_id::create("block", this);
regmodel.build();
regmodel.set_coverage(UVM_CVR_FIELD_VALS);
regmodel.lock_model();
regmodel.default_map.set_auto_predict(0); //從DUT更新寄存器模型的一種方式
至此后門訪問已經可以通過
