uvm設計分析——reg


項目中的reg_model一般只有一份,set到reg_sequence上,所以多個sequence並行啟動結束的時候,reg model會成為一個共享資源

 

uvm_reg_field中的volatile,主要來設置m_check的變量,

  m_check,主要用在uvm_reg的mirror task,以及read task,(需要map中配置check_on_read)

uvm_reg_field中的desired,mirrored,m_parent,m_access變量都是local的,繼承類中完全看不到,只能

  通過function來得到數據。

  m_access,指定field的access policy。

  m_written,指定是否是只能被寫入一次的。

  reset可以被設置為多種類型的reset的值。

主要function  configure

 

uvm_reg中的主要變量有,m_locked,由頂層的reg_block調用

            m_parent,指向的uvm_reg_block;

            m_is_busy,當該reg正在執行frontdoor的讀寫操作時,該信號置 1,避免此時做predict。

            m_backdoor,外部設置進去的backdoor的方法。

            m_maps[uvm_reg_map],該reg掛載在的map的對象,在default_map,add_reg時,指定。

            hdl_pool,以string為索引,uvm_queue為對象,string方便指定RTL,Gate等不同的hdl。

            coverage收集信息,m_has_cover,m_cover_on。has_cover表示reg new的時候加入的coverage選項,

                                    cover_on表示當前設置的coverage。主要區別在調用時候,需要的是哪一種的coverage。

              reg  new的時候,需要設置的是has_cover,new的時候,直接build_coverage。需要頂層調用include_coverage。

              reg_block在new的時候,可以設置cover_on,通過set_coverage等function。sample的時候get_coverage。

reg的讀寫前后都有pre/post的hook task。

uvm_reg中最重要的三個task:

  read,write,根據path的不同,操作總線或者更新reg_model;內部都是都access control的,只不過backdoor的在自己內部,其他的在predict中

  predict,只是更新reg_model,是一定不會操作總線的對backdoor和kind為predict_direct的,沒有access control

    predict的kind有四種,predict_write,predict_read,predict_direct,predict

  mirror,read操作加一個check函數,所以也會調用predict函數,更新reg model

  path有兩種,frontdoor和backdoor。

  所有的frontdoor的操作,根據map_info中的fd信息,啟動sequence或者調用map的讀寫操作

  

其他控制model值的task調用關系:

  update的時候,write的值是根據regmodel目前的值,來寫進去的,也就是set field的值,write函數其實只是寫入改變了的field

    所有的field都沒有更新時,是不會進行update操作的。

    update直接更新reg model內的值,需要檢測此時沒有reg model的frontdoor操作等,即not_busy

  

在reg_field中的task中,基本都調用uvm_reg的task,但是read、write根據是否支持individual可能會調用map中的task

  

  uvm_reg中還有一些hdl_path的function,add_hdl_path_slice,添加到field的path路徑。這些路徑,之后在map中會被集成起來。

    形成一個full_name。

uvm_reg_frontdoor,從uvm_reg_sequence繼承而來,本身是一個sequence

uvm_reg_backdoor,從uvm_object繼承而來,本身就是一個object,其中定義了read、write的原型函數

 

 

uvm_reg_map,auto-predict的設置,影響所有的讀寫操作,自動更新mirror和desired value。    

          只影響frontdoor,backdoor都是直接調用do_predict函數的。

           m_regs_info,所有add到該map中的寄存器的信息,包括access,offset,addr,

        m_check_read,影響所有的read操作,mirror操作,mirror value和讀到的值做比較

        m_adapter,m_sequencer,做frontdoor的read和write操作。

        m_base_addr,該map的基地址。  

        m_regs_info,每個加到該map中的寄存器,所有的信息保存在該數據結構中,

  在lock或者add_submap的時候,更新map_info中的addr,調用Function Xinit_address_mapX

  定義自己的do_bus_write和do_bus_read,

 

uvm_reg_block,包含類,包含底層的uvm_reg_block,uvm_reg,

       default_path,定義自己的hdl_path,

       lock,表明當前的model是lock住的,調用function lock_model()

       自己的coverage設置,new的時候設置到has_cover,get的時候,得到cover_on。

 

uvm_reg_sequence,只是實現了調用map中的讀寫操作,不支持burst_read,burst_write,

       其中啟動該sequence,需要reg_sequencer,連接一個driver。

        或者在sequence中,直接調用已經存在的read,write task,這樣配置的sequence,可以直接由此繼承。

 

uvm_reg_item,uvm_sequence中的trnasaction類型,定義reg access的方式,包含一個uvm_object類型的extension,可以自定義

      在讀寫時,方式與adapter交互。

 

uvm_reg_adapter,繼承自uvm_object,從其中設置一個uvm_reg_item,需要實現兩個function,bus2reg和reg2bus。

    其中的變量supports_byte_enable, 影響sequence的個數。provides_reponses,影響sequencer和driver之間的交互

 

uvm_reg_predictor,當auto_predict關閉的時候,需要例化的component,連接到寄存器的monitor

      在write函數中顯示調用do_predict函數,更新model中的mirror value,此時do_check函數,會根據read_on_check進行調用。

 

uvm自建的針對reg的sequence,針對普通的reg有:reg_access_seq,reg_bit_bash_seq,reg_hw_reset_seq。

 

uvm_reg model,主要實現了

  1) 增加了對dut的reg進行訪問的方式,可以直接通過reg model進行訪問。傳統的只能是通過sequence,啟動在bus的sequencer上來實現

  2) 方便了對dut reg進行測試的方法,通過build-in sequence來實現。

  3) 方便檢測每次的bus讀寫的正確性,通過reg_predictor的方式來實現。

reg prediction的方式有三種,

  1) auto_predict,直接通過設置map的auto_predict選項,通過reg model的sequence,reg model都被正確的賦值,

  2) explict_predict,即設置map的auto_predict選項,有增加component,reg_predict。這樣不論sequence是由reg model啟動

      還是bus agent啟動,不論front door,還是back door,reg model的值都是正確的。

  3) passive predict,只有一個reg predict,對back door訪問不敏感。

  

reg model的集成:

  1) 每個subenv集成一個predictor,

  2) 每個reg_predictor初始化內部的reg_model,reg_adaptor,analysis port

  3) 每個subenv的sequence中,包括對用的reg_model的指針,

  4) 頂層的reg_map,初始化agent和sequencer,

  

reg model的coverage設置,

  1) include_coverage,是一個全局性的coverage開關的設置,

  2) build_coverage,一般是在configure的時候,初始化model中的變量的函數。

  3) has_coverage,在new covergroup的時候,進行選擇,

  4) set_coverage和get_coverage,是在sample的時候,進行選擇。

  

  sample方法,在reg的front door訪問之后,自動調用。

  sample_values方法,主要實現對field value的采樣,需要自己調用。

 

reg_model中的值的check:

  1) mirror的task,可以直接對一個reg_block或者reg進行檢查。讀DUT的值與當前的mirror值相同,則為uvm_is_ok

  2) read_on_check的檢查,對map進行設置,在讀操作的過程中,檢查desired的值與當前讀到的值相同,則為uvm_is_ok。

reg_model的訪問級別:

  1) randomize與update,mirror,reset,都可以在reg_block的層級直接調用。

    一般可以先對reg_block進行randomize,之后進行update,很多dut的讀寫操作之后,mirror進行檢查。

  


免責聲明!

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



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