推荐答案
测试一下
题目
DUT中有一个寄存器"DJI_ID_HEAD",该DUT通过APB总线端口与SoC互联,
参考答案与知识点
参考答案
我们分析题目:DUT中有一个寄存器DJI_ID_HEAD,通过APB总线与SoC互联。给出了寄存器模型的一系列操作。需要判断在APB总线端口上能看到多少笔有效的数据传输。注意:APB总线端口上的数据传输指的是实际的总线读写操作(有效传输)。我们需要逐一分析每个操作是否会产生实际的总线事务。
操作序列:
1. RGM.DJI_ID_HEAD.read(status, rvalue, UVM_FRONTDOOR); // 前门读,产生一次APB读传输。
2. RGM.DJI_ID_HEAD.write(status, 16'hFFAA, UVM_FRONTDOOR); // 前门写,产生一次APB写传输。
3. RGM.DJI_ID_HEAD.data.get(); // 只是获取寄存器模型中的期望值,没有总线操作。
4. RGM.DJI_ID_HEAD.data.set(16'hFFAA); // 设置期望值,没有总线操作。
5. RGM.DJI_ID_HEAD.update(status); // update操作:如果寄存器的期望值与当前镜像值不一致,则执行前门写,否则不操作。注意:之前有write(16'hFFAA)且没有改变,镜像值可能被write更新?需要理解寄存器模型的行为:write会更新镜像值和期望值。write(16'hFFAA)之后,期望值和镜像值都是16'hFFAA。然后data.set(16'hFFAA)设置期望值为16'hFFAA,没变化。接着update(status):期望值与镜像值比较,相等,所以不产生总线操作。但注意:在write之后,镜像值已经被更新了?实际上,前门write会更新镜像值(因为实际写了DUT)。所以镜像值是16'hFFAA,期望值也是16'hFFAA,所以update不产生操作。
6. RGM.DJI_ID_HEAD.data.set(16'hAAFF); // 设置期望值为16'hAAFF,未产生总线操作。
7. RGM.DJI_ID_HEAD.update(status); // 此时期望值16'hAAFF,镜像值(上次write后)16'hFFAA,不一致,所以会产生一次前门写,将16'hAAFF写入DUT。注意:update默认是前门操作?UVM中update方法默认使用UVM_FRONTDOOR,除非在调用时指定。所以产生一次写传输。
8. RGM.DJI_ID_HEAD.reset(); // reset方法:通常重置模型状态,但不产生总线操作(除非有特殊配置)。reset只会重置寄存器模型中的镜像值和期望值,不会实际对DUT进行复位。所以不产生总线传输。
9. RGM.DJI_ID_HEAD.data.set(16'hAAFF); // 再次设置期望值为16'hAAFF,无总线操作。
10. RGM.DJI_ID_HEAD.update(status); // 此时期望值16'hAAFF,镜像值是多少?reset之后,镜像值会被重置为寄存器的复位值(题目未给出,但通常模型会重置为复位值)。假设复位值为0?但这里未指定,通常寄存器模型的reset方法会将mirror和desired设置为寄存器的复位值(在build时从寄存器文件中获取)。这里我们不知道复位值,但假设复位值与之前的镜像值不同。但需要注意的是,第8步reset之后,镜像值被设置为复位值。然后第9步设置期望值为16'hAAFF,第10步update:期望值16'hAAFF,镜像值(复位值)如果是0,则不一致,产生一次写传输。但如果复位值恰好是16'hAAFF,则不产生。但通常复位值不是这个,所以很可能产生一次写。但题目没有给出复位值,需要根据常识判断。通常寄存器复位值为0。所以可能产生一次写。但是注意:reset()只是模型复位,不写硬件,所以镜像值变为复位值。然后update会尝试将期望值写入硬件,如果与镜像值不同则写。所以这次update会产生一次写传输。
11. RGM.DJI_ID_HEAD.read(status, rvalue, UVM_FRONTDOOR); // 前门读,产生一次读传输。
12. RGM.DJI_ID_HEAD.mirror(status); // mirror方法:默认执行前门读,读取实际值并更新镜像值。所以产生一次读传输。注意:mirror也可以使用后门或前门,默认前门。所以产生一次读。
那么总共的事务:第1次读,第2次写,第7次写,第10次写(如产生),第11次读,第12次读。一共6笔?但需要确认第5次update不产生,第3、4、6、8、9不产生。所以如果第10次产生,则是6笔。如果不产生,则是5笔。
但是,需要仔细分析第5次update:之前有write(16'hFFAA)之后,期望和镜像都是16'hFFAA,然后data.set(16'hFFAA)没有改变,所以update不产生。
第7次update:期望16'hAAFF,镜像16'hFFAA,不一致,产生一次写。
第8次reset:复位模型,镜像值变为复位值,期望值保持不变?还是也复位?通常reset方法会将desired也复位?UVM寄存器模型中的reset函数默认将mirror和desired都设置为复位值。具体参考UVM源码:`reset`方法会调用`set_reset()`将desired和mirror都设置为复位值。所以reset之后,期望值和镜像值都变成复位值。假设复位值为0(常见),则期望值从16'hAAFF变为0,镜像值变为0。然后第9步data.set(16'hAAFF)将期望值设为16'hAAFF。第10步update:期望值16'hAAFF,镜像值0,不一致,产生写。所以需要写一次。
但是需要注意:第1次read后,镜像值被更新为读取的实际值。但read操作是在最开始,之后有write改变了DUT值,但没有后续的read更新镜像,所以镜像值一直保持为write后的值(16'hFFAA)?实际上,前门write之后,模型的镜像值会被更新为所写的值(因为write方法会调用predict或直接设置),所以write(16'hFFAA)后,镜像值为16'hFFAA。后续没有读或预测,因此镜像一直保持16'hFFAA直到reset。所以第7次update时镜像16'hFFAA,期望16'hAAFF,写。
reset后,镜像变为复位值0,期望
涉及知识点
- sta
- UVM
- 复位