UVM寄存器模型和存储器模型同时作用于一个接口

在为RTL添加UVM存储器模型时,如果模块的存储器和寄存器共用同一接口,通常通过bus_agent和bus_adapter进行处理。但当涉及显式预测时,问题出现,因为一个predictor不能关联两个model。解决方法是创建两个predictor,各自关联一个model,并共享同一个adapter,从而避免资源浪费。
摘要由CSDN通过智能技术生成

大家在为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;

所以,可以设计为以下这个结构:

 这样就可以对一个模块的同一个接口使用同时寄存器模型和存储器模型。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常大胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值