1、Explicit Register Predictor
- `uvm_reg_predictor` 类定义了一个预测器组件,用于基于在物理总线上显式观察到的事务来更新寄存器模型的镜像值。
2、uvm_reg_predictor
- 根据观察到的总线事务更新寄存器模型的镜像值。
- 该类将观察到的总线事务(类型为BUSTYPE)转换为通用寄存器事务,通过总线地址确定正在访问的寄存器,然后根据寄存器的访问模式使用观察到的总线数据更新寄存器的镜像值。详细信息请见下面附录:uvm_reg::predict。
- 由于存储器可能很大,因此它们的访问不会被预测。
总结:
uvm_reg_predictor:
- 基于观察到的总线事务更新寄存器模型的镜像值
继承关系(class declaration):
变量(variables):
(1)bus_in:
uvm_analysis_imp #(BUSTYPE, uvm_reg_predictor #(BUSTYPE) ) bus_in
- 接收来自该端口的BUSTYPE类型的观察到的总线事务,并进行处理。
- 对于每个传入的事务,预测器(predictor)将尝试获取与观察到的总线地址相对应的寄存器或存储器句柄。
- 如果匹配成功,预测器(predictor)调用寄存器或存储器的predict方法,将观察到的总线数据传递给该方法。寄存器或存储器的镜像将会根据其配置的访问行为(RW、RO、WO等)更新为这些数据。预测器(predictor)还会将总线事务转换为通用的uvm_reg_item,并将其发送到reg_ap分析端口。
- 如果寄存器宽度大于总线宽度,预测器(predictor)将收集多个总线事务,以确定正在读取或写入的值。
(2)reg_ap:
uvm_analysis_port #( uvm_reg_item ) reg_ap
- 分析输出端口,发布从在bus_in上接收到的总线事务转换而来的uvm_reg_item事务。
(3)map:
uvm_reg_map map;
- 用于将总线地址转换为相应的寄存器或存储器句柄的映射。必须在运行阶段之前配置。
(4)adapter:
uvm_reg_adapter adapter;
- 适配器用于以规范的uvm_reg_bus_op数据形式传递总线操作的参数。在运行阶段之前必须配置uvm_reg_adapter。
方法(methods)
(1)new:
function new (
string name,
uvm_component parent
)
- 创建此类型的新实例,可提供可选的名称和父级。
(2)pre_predict:
virtual function void pre_predict(
uvm_reg_item rw
)
- 重写此方法以更改值或重新定向目标寄存器。
(3)check_phase:
virtual function void check_phase(
uvm_phase phase
)
- 检查是否仍有挂起的寄存器事务排队。
附录:
- uvm_reg::predict ( ):
virtual function bit predict ( uvm_reg_data_t value, uvm_reg_byte_en_t be = -1, uvm_predict_e kind = UVM_PREDICT_DIRECT, uvm_path_e path = UVM_FRONTDOOR, uvm_reg_map map = null, string fname = "", int lineno = 0 )
更新此寄存器的镜像值和期望值。
根据指定地址映射上的指定观察到的值或基于计算得出的值,预测寄存器中字段的镜像(和期望)值。有关更多详细信息,请参阅uvm_reg_field::predict()。
如果对寄存器中的每个字段的预测成功,则返回TRUE。
uvm_reg_field::predict ()
function bit predict ( uvm_reg_data_t value, uvm_reg_byte_en_t be = -1, uvm_predict_e kind = UVM_PREDICT_DIRECT, uvm_path_e path = UVM_FRONTDOOR, uvm_reg_map map = null, string fname = "", int lineno = 0 )
更新此字段的镜像值和期望值。
根据在总线上使用指定的地址映射观察到的值,预测字段的镜像值和期望值。
如果指定kind为UVM_PREDICT_READ,则该值是在指定地址映射上的读取事务或后门(如果路径是UVM_BACKDOOR)中观察到的。如果指定kind为UVM_PREDICT_WRITE,则该值是在指定地址映射上的写入事务或后门(如果路径是UVM_BACKDOOR)中观察到的。如果指定kind为UVM_PREDICT_DIRECT,则该值是计算得出的,并且将按原样更新,不考虑任何访问策略。例如,如果指定kind为UVM_PREDICT_DIRECT,则只要是只读字段,该方法都会修改其镜像值。
该方法不允许在包含此字段的寄存器正在执行事务时更新其镜像(或期望),因为结果是不可预测的,并且表明测试台中存在竞态条件。
如果预测成功,则返回TRUE。