文章目录
- 镜像值与期望值
- predication的分类
- 自动预测
- 显示预测
- uvm_reg的访问方法
- 寄存器健康检查![在这里插入图片描述](https://img-blog.csdnimg.cn/8b1832ab43854068970bb5a66d851d06.png)
镜像值与期望值
寄存器模型中的每一个寄存器,都应该有两个值,一个是镜像值(mirrored value) ,一个是期望值(desired value) :
- 期望值是先利用寄存器模型修改软件对象值,而后利用该值更新硬件值;镜像值是表示当前硬件的已知状态值。
- 镜像值往往由模型预测给出,即在前门访问时通过观察总线或者在后门访问时通过自动预测等方式来给出镜像值。
predication的分类
UVM提供了两种用来跟踪寄存器值的方式,我们将其分为自动预测(auto prediction)和显式预测(explicit) 。
- 如果用户想使用自动预测的方式,还需要调用函数uvm_reg _map::set_auto_predict()。
- 两种预测方式的显著差别在于,显式预测对寄存器数值预测更为准确,我们可以通过下面对两种模式的分析得出具体原因。
自动预测
- 如果用户没有在环境中集成独立的predictor,而是利用寄存器的操作来自动记录每一次寄存器的读写数值,并在后台自动调用predict()方法的话,这种方式被称之为自动预测。
- 这种方式简单有效,然而需要注意,如果出现了其它一些sequence直接在总线层面上对寄存器进行操作(跳过寄存器级别的write()/read()操作,或者通过其它总线来访问寄存器等这些额外的情况,都无法自动得到寄存器的镜像值和预期值。
显示预测
- 更为可靠的一种方式是在物理总线上通过监视器来捕捉总线事务,并将捕捉到的事务传递给外部例化的predictor,该predictor由UVM参数化类uvm_reg _predictor例化并集成在顶层环境中。
- 在集成的过程中需要将adapter与map的句柄也一并传递给predicttor一侧,同时将monitor采集的事务通过analysis port接入到predictor—侧。
- 这种集成关系可以使得,monitor一旦捕捉到有效事务,会发送给predictor,再由其利用adapter的桥接方法,实现事务信息转换,并将转化后的寄存器模型有关信息更新到map中。
- 默认情况下,系统将采用显式预测的方式,这就要求集成到环境中的总线UVC monitor需要具备捕捉事务的功能和对应的analysis port,以便于同predictor连接。
prediction在环境中的使用:
class mcdf_ bus_env extends uvm _env;
mcdf_ bus_agent agent;
mcdf_rgm rgm;
reg2mcdf _adapter reg2mcdf ;
uvm _reg predictor # (mcdf_bus_trans) mcdf2reg_predictor;
`uvm_component _utils (mcdf bus_env)
function void build phase (uvm phase phase) ;
agent = mcdf bus_agent: :type_id: : create ( "agent" , this);
if ( !uvm_config_db#(mcdf_rgm) : :get(this, "","rgm" , rgm)) begin
uvm_info ( "GETRGM","no top-down RGM handle is assigned",UVM_LOW)
rgm = mcdf_rgm : : type_id: :create ("rgm" , this) ;
'uvm_info("NEWRGM" , "created rgm instance locally",UVM_LOW)
end
rgm. build() ;
reg2mcdf = reg2mcdf_adapter: :type_id: :create("reg2mcdf" );
mcdf2reg predictor = uvm_reg_predictor# (mcdf_bus_trans) : :type_id::create("mcdf2reg _predcitor" ,this) ;
mcdf2reg predictor.map = rgm.map;
mcdf2reg predictor.adapter = reg2mcdf ;
endfunqtion
function void connect _phase (uvm _phase phase) ;
rgm. map.set_sequencer(agent.sequencer,reg2mcdf);
agent.monitor.ap. connect(mcdf2reg_predictor.bus_in) ;
endfunction
endclass
uvm_reg的访问方法
uvm_reg_sequence提供的方法