RAL Prediction

在大多数的应用场景,对寄存器的访问完全可以通过write(value) & read()这样的组合来完成,也可以选用set(value)先修改期望值,然后在通过update()函数去做同步。这样的好处是,如果RTL寄存器的值已经是我们的期望值,那么就不会也没有必要再浪费总线资源去重新配置一遍。
Explicit Prediction相对于Implicit Prediction,除了监视通过寄存器模型API对寄存器的访问操作,还可以覆盖到其他测试序列(sequence)通过总线对寄存器的直接访问,这一点会使它更加通用。

prediction的分类

auto prediction

如果在环境中没有集成独立的predictor的情况下,利用寄存器操作来自动记录每一次寄存器的读写值,并在后台自动调用predict()来保持寄存器模型中的值与RTL中的值保持一致。但是如果对于寄存器的操作是直接由总线层面进行的,如跳过寄存器模型的wirte()/read(),自动预测则捕捉不到这些寄存器行为,有可能导致DUT和registermodel两边的值不一致。
前门访问(write()/read()— 针对寄存器的)或者后门访问(peek()/poke())都可以触发隐式预测

register_model_inst.default_map.set_auto_predict(1);

explicit prediction

通过monitor在物理总线上捕捉总线事务,并将bus_transaction 传到外部predictor中,predictor 将transaction传到adapter中,在adapter中总线事务转换成寄存器模型的相关信息更新到map中,因此显示预测的准确性更高。
当显示预测打开时,隐式预测会被关掉,uvm_reg_predictor生成predicted value并update mirrored value

//create a predictor
uvm_reg_predictor #(BUS_TYPE_TRANS) predictor;
predictor = uvm_reg_predictor #(BUS_TYPE_TRANS) ::type_id::create("predictor",this);

//configute
predictor.map = reg_model.default_map //assigning map handle
predictor.adapter = adapter; //assigning adapter handle
//connect
bus_monitor.ap.connect(predictor.bus_in) //monitor analysis port and predictor analysis imp connection

如何实现显式预测

  1. monitor collect bus transaction
  2. predictor collect trans from analysis imp
  3. call function bus2reg in adapter
  4. transfer bus_trans into reg_trans
  5. call write() in uvm_predcitor when get new transaction
  6. update mirrored value and predicted value in reg model
adapter中的write()是如何调用的:

RAL Prediction_第1张图片

在寄存器模型和sequence中transaction的转换:

RAL Prediction_第2张图片

你可能感兴趣的:(寄存器模型,经验分享)