寄存器模型和vseq
1. 增加vseq;
2. global define/enum
寄存器模型reg_model:
1.寄存器模型的行为仍是由vseq控制的;
2.case test中,寄存器模型需要完成create和connect等操作;
例如,将寄存器模型的rm sequencer设置为env下的bus 寄存器sqr,以及connect env下的rm和外挂的rm;
这里更细致的说法是:
env下的配置寄存器的agent下,也有sqr,这个sqr就和data agent一样,与bus driver相连;
若有事务,则sqr将seq产生的transaction递交给driver再驱动到总线上。
这里的事务也就是transaction由seq产生,而seq由vseq控制;
但实际来说,vseq并没有直接控制操作寄存器模型的seq,
而是对寄存器模型进行直接的控制,并调用其的函数;
这个过程虽然是需要模拟CPU操作总线的UVM_FRONTDOOR,但实际上是被封装好的;
也就是vseq调用寄存器模型的UVM_FRONTDOOR函数,
寄存器模型则将这些操作(uvm_reg_bus_op)映射成bus_sequencer能够处理的信息,
而bus_sequencer将bus seq控制产生的bus transaction交给bus driver,最终将这些信息驱动到总线上。
当然也包括反向的部分:
bus_driver也可以收取信息,将他们汇聚成transaction,这个transaction同样通过my_adapter映射成uvm_reg_bus_op,供寄存器模型处理。
(vseq这里的控制隔了一层,做了一次映射)
流程:
case test调用vseq,vseq调用寄存器模型的函数,
寄存器模型的函数在uvm_reg中被定义,此时uvm_reg会调用uvm_reg_map中的方法,
uvm_reg_map中的方法最终调用的是rw.local_map.do_read(rw);,
do_read(rw)是uvm_reg_map的函数,他会调用:do_bus_read(rw, sequencer, adapter);
do_bus_read最终呈现的是:
do_bus_read(rw, sequencer, adapter);
而adapter是在do_bus_read中被调用:bus_req = adapter.reg2bus(rw_access);
bus_req和bus_rsp(uvm_sequence_item)和与rw_access(uvm_reg_bus_op)的互相转换;
Function: set_auto_predict
自动预测模式
工作原理:当你在测试序列中调用 reg.read() 或 reg.write() 时,在同一个仿真时间点,寄存器模型会立即且自动地更新自己的镜像值,因为它“预测”总线操作一定会成功,并且结果就是它期望的那样。
reg.write(status, 1) → 总线事务发出 → 模型立即将自己的镜像值更新为1。
reg.read(status, value) → 总线事务发出并返回数据 → 模型立即将自己的镜像值更新为返回的数据。

浙公网安备 33010602011771号