UVM中的regmodel建模(一)


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更新寄存器模型的一種方式

至此后門訪問已經可以通過


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM