大家在为RTL添加UVM存储器模型的时候是否会遇到这样一种情况:这个模块的存储器配置和寄存器配置用的是同一个接口。那么我们对这个模块的寄存器模型和存储器模型该如何实现?
一般情况下因为是只有一个总线接口,所以我们只对它使用一套bus_agent即可。在对这个bus_agent配置一个可以用于寄存器模型和总线协议传输转换的转换器bus_adapter即可。如下图所示:
这么设计是可以的。因为reg_model和mem_model提供给bus_adapter的数据类型没有差异,并且书写语法上不存在冲突。
reg_model_inst.default_map.set_sequencer(my_env.my_agent.my_seqr,bus_adapter_inst);
mem_model_inst.default_map.set_sequencer(my_env.my_agent.my_seqr,bus_adapter_inst);
相当于对reg_model和mem_model同时设置了同一个agent下的同一个sequencer,并且关联了同一个bus_adapter。
可是一旦需要加入显式预测的代码进来就会出现问题。通常情况下我们的UVM环境中进行显式预测时候是这样设计的:
monitor接收到事务之后会把事务转发给predictor。再由predictor通过adapter把信息更新到reg_model的map中去,具体详见刘斌老师的红皮书。
如果要在我们这种一个接口同时对应寄存器模型和存储器模型的设计中使用显示预测,应该如何实现呢?
首先,一个predictor不能关联两个model。因为一个predictor只有一个map变量用于关联model中的map变量。
my_predictor = uvm_predictor #(bus_transaction)::type_id::create("my_predictor",this);
my_predictor.map = reg_model.default_map;
my_predictor.adapter = bus_adapter_inst;
可以发现在一个您的my_predictor实例当中,它的map只能对应一个model的default_map。如果对应了reg_model则不能对应mem_model。如果在上面标红的语句下面再写一句:
my_predictor.map = mem_model.default_map;
那么就会出现下面一句的map句柄覆盖了上面设置的map句柄。
所以加入显式预测的设计就应当设计成这样:
这么设计的问题在于bus_adapter1和bus_adapter2在做的是同一件事情,他们的输入和输出都是处理的同一种格式的事务。为了减少不必要的资源占用,是否能够把两个adaper合并呢?
答案是可以。因为两个predictor能够关联同一个adapter。对两个predictor进行adapter句柄传递的时候可以传递同一个adapter的句柄。
my_predictor1.adapter = bus_adapter_inst;
my_predictor2.adapter = bus_adapter_inst;
所以,可以设计为以下这个结构:
这样就可以对一个模块的同一个接口使用同时寄存器模型和存储器模型。