rgm的常规方法

  • 关于reg的三个值

    • mirrored value镜像值:由模型预测给出,即在前门访问时通过观察总线、在后门访问时通过自动预测等方式给出
    • desired value期望值:先利用rgm修改软件对象值,然后利用该值更新硬件值,mv是表示当前硬件的已知状态值
    • actual value硬件的真实值:
  • uvm两种跟踪寄存器值的方式
    • 自动预测auto prediction:调用uvm_reg_map::set_auto_predict()

      • 具体地,user没有在env中集成独立的predictor,而是利用reg的操作来自动记录每一次reg的读写数值,并在后台自动调用predict()方法,此为ap
      • 缺点:若seq直接在总线层面对reg进行操作,跳过了reg级别的读写,或者通过其他总线来访问reg,ap就无法获得mv和dv
    • 显式预测explicit:预测的更准确,具体地,这是在物理总线上通过monitor来捕捉总线事务,然后传递给外部例化的predictor(由uvm参数化类uvm_reg_predictor例化并集成在顶层环境)
      • 集成时需要将adapter与map的句柄一起传递给predictor,同时将monitor采集到的事务通过analysis port接入到predictor。
      • monitor拿到trans→adapter转换→更新到map
      • 默认情况采用显式预测
class mcdf_bus_env extends uvm_env;mcdf_bus_agent agent;mcdf_rgm rgm;reg2mcdf_adapter reg2mcdf;uvm_reg_predictor #(mcdf_bus_trans) mcdf2reg_predictor;...//注册+例化function void build_phase(u p);agent=mcdf_bus_agent::type_id::create("agent", this);if(!uvm_config_db#(mcdf_rgm)::get(this, "", "rgm", rgm)) begin`uvm_info()rgm=mcdf_rgm::type_id::create("", this);`uvm_info() endrgm.build();reg2mcdf=reg2mcdf_adapter::type_id::create("");mcdf2reg_predictor=uvm_reg_predictor#(mcdf_bus_trans)::type_id::create("", this);mcdf2reg_predictor.map=rgm.map;mcdf2reg_predictor.adapter=reg2mcdf;endfunctionfunction void connect_phase(u p);rgm.map.set_sequencer(agent.sequencer, reg2mcdf);agent.monitor.ap.conncet(mcdf2reg_predictor.bus_in);endfunction
endclass

uvm_reg的访问方法

uvm_reg_sequence提供的方法

针对reg对象,而不是reg block或者field

  • 前门访问的read()和write,在总线事务完成时,mv和dv才会更新为和总线上相同的值→显式预测
  • peek()、poke()、后门访问模式下的read()write(),在零时刻方法调用返回后mv和dv也相应修改,不通过总线
  • reset()和get_reset():硬件在复位触发后,会将内部reg复位;而rgm在捕捉到复位事件后也会复位,复位的对象时rgm,不是硬件,保持和硬件行为一致
@(negedge p_sequencer.vif.rstn);
rgm.reset();//reg块的mv和dv复位
rgm.chnl-_ctrl_reg.reset();//reg级别复位
rgm.chnl0_ctrl_reg.pkt_len.reset();//reg域的复位
  • 复位后user可以通过读取rgm的复位值,与前门访问获取的reg复位值比较,以此判断硬件各个reg的复位值是否按照reg描述去实现
rstval=rgm.chnl0_ctrl_reg.get_reset();//rgm的复位值,不是硬件的
rgm.chnl0_ctrl_reg.read(status, data, UVM_BACKDOOR, .parent(this));
if(rstval !=data) `uvm_error()
  • mirror()不会返回读回的数值,会修改对应的mv;在修改前user可以选择是否将读回的值与模型中的原mv进行比较,如下
rgm.chnl0_ctrl_reg.mirror(status, UVM_CHECK, UVM_FRONTDOOR, .parent(this));
  • 用set()和updata()对reg做批量修改

    • set()的对象时rgm本身,修改dv
    • 当reg的dv与mv不相同时,可以通过updata()来将不同reg通过前后门访问做全部修改
    • 主要与write()和poke()相比
void'(rgm.chnl0_ctrl_reg.randomize());
rgm.chnl0_ctrl_reg.pkt_len.set('h3);
rgm.chnl0_ctrl_reg.updata(statusm, UVM_FRONTDOOR, .parent(this));
void'(rgm.chnl1_ctrl_reg.randomize());
rgm.chnl0_ctrl_reg.set('h22);//1 or 0 ?
rgm.updata(statusm, UVM_FRONTDOOR, .parent(this));

mem与reg的比较

  • uvm的rgm也可以用来对存储建模,uvm_mem类可以模拟RW、RO、WO类型的存储且可以配置存储模型的数据宽度和地址范围
  • 考虑到物理存储映射到uvm_mem会带来更大的资源消耗,uvm_mem不支持预测和影子存储shadow storage,没有镜像值和期望值
  • uvm_mem可以利用自带的方法去访问硬件存储,利用存储模型访问硬件存储便于维护和复用;访问过程中可以利用模型的资质范围来测试硬件的地址范围是否全覆盖;
  • uvm_mem提供前后门访问,存储测试可以考虑先后门访问预先加在存储内容,然后前门访问读取存储内容,进而做数据对比(传统的测试方式是利用系统函数或者仿真器实现存储加载)
  • uvm_mem也有uvm_reg常规的访问方法,还有burst_read()和burst_write(),目的是更高速通过总线burst方式连续存储,贴合实际访问存储中的场景,对burst访问需要考虑:
    • 目前挂载的总线UVC是否支持burst形式访问
    • 这两个方法的参数列表中uvm_reg_data_t value[]采用的是数组形式,可以传递多个数据;在后台,这些数据首先需要装载到uvm_reg_item对象中,value数组可以直接写入,另外两个成员需要分别制定为element_kind=UVM_MEM,kind=UVM_BURST_READ

寄存器内建序列built_in sequence

uvm针对寄存器模型内建的seq,建议在验证项目一开始先做检查

class mcdf_example_seq extends uvm_reg_sequence;mcdf_rgm rgm;`uvm_object_utils()`uvm_declare_p_sequencer()...task body();uvm_status_e status;uvm_reg_data_t data;uvm_reg_hw_reset_seq reg_rst_seq=new();uvm_reg_bit_bash_seq reg_bit_bas_seq=new();uvm_reg_access_seq reg_acc_seq=new();if(!uvm_config_db#(mcdf_rgm)::get(null, get_full_name(), "rgm", rgm)) begin`uvm_error() end@(negedge p_sequencer.vif.rstn);@(posedge p_sequencer.vif.rstn);`uvm_info()reg_rst_seq.model=rgm;reg_rst_seq.start(m_sequencer);`uvm_info()`uvm_info()reg_bit_bash_seq.model=rgm;reg_bit_bash_seq.start(m_sequencer);`uvm_info()`uvm_info()reg_acc_seq.model=rgm;reg_acc_seq.start(m_sequencer);`uvm_info()endtask
endclass

应用场景

  • 检查寄存器的方式

    • 前门写,前门读。无法检查地址是否正确映射
    • 前门写,后门读。前门write(),后门read()或peek()
    • 后门写,前门读。后门write()或poke(),前门read()或peek()
    • 对状态寄存器,peek()获取,再用mirror()方法从前门访问且与之前更新的镜像值比较
    • 以上都已经在rgm的内建序列中实现

电力电子转战数字IC20220727day57——寄存器模型(续)相关推荐

  1. 电力电子转战数字IC——路科MCDF全览(持续更新)

    经过两次面试后,对MCDF做一次全面的深入总结. 目前进度:硬件部分的node,fifo,寄存器,formatter,MCDF顶层,APB接口,TB接口 软件部分的chnl_pkg,fmt_pkg,a ...

  2. 电力电子转战数字IC——我的IC笔试(2022.10.14更新)

    IC笔试有:JL科技.TR半导体.HZW.MX半导体.RSKX.TCL 部分题目暂时还是做不出来,先好好复习一遍,会有柳暗花明的时候的. 目录 RY10.11 TCL10.9 位宽定义正确的是 逻辑与 ...

  3. 电力电子转战数字IC——我的IC面试(2022.10.14更新)

    目录 感谢信 HKWS10.14面试 25mins JXC10.13面试 30mins JDSK9.23面试 42mins 快速的自我介绍 介绍一下这个MCDF的项目 你这里写SV搭建的验证环境,和U ...

  4. 电力电子转战数字IC20220629day35——路科实验2b

    目录 tb3代码改造 tb3代码 tb4改造思路: tb4结构示意图 tb4代码 basic_test burst_test full_test 首先复习一下类的知识点 CSDNhttps://mp. ...

  5. 电力电子转战数字IC20220613day23——江哥nb!

    江哥nb! 今天的头版必须给到江哥,华为树枝江哥,FPGA设计岗,两年工资翻倍,年薪突破50,月薪突破30,向江哥学习! 想做江哥的水花兄弟,差个11号球衣  -------------------- ...

  6. 电力电子转战数字IC20220819day64——uvm实战1A

    目录 MCDF改造 APB接口 验证环境的改造 实战任务 apb_config apb_master_agent apb_master_driver 1.1实现apb_master_driver的dr ...

  7. 电力电子转战数字IC20220711day45——SV终章

    至此,SV的学习结束,实验4和实验5等回头过来重做,一定要到完全理解为止.SV DAY30 类型转换 分类:静态转换,动态转换 静态转换:在需要转换的表达式前面加上单引号,不会对转换值检查,如果转换失 ...

  8. 电力电子变流器和永磁同步电机模型预测控制方式实现

    笔者发现csdn上几乎没有关于电力电子变流器和永磁同步电机模型预测控制方式实现的文章,所以决定写一写自己的理解.在看本文章之前,建议把具体的模型预测控制基本原理看一遍,可以看我写的这篇文章: 对MPC ...

  9. 电力电子变压器matlab模型,用Matlab建PET控制模型研究电力电子变压器并联运行仿真...

    描述 电力电子变压器并联运行有利于进一步提高电力系统的供电可靠性和供电容量,具有重要的研究价值.为了实现并联运行电力电子变压器之间负荷的稳定合理分配,并具有良好的动态响应特性,基于有功和无功调差特性方 ...

最新文章

  1. TensorRT 数据和表格示例
  2. Dynamic Web Module 3.0 requires Java 1.6 or newer.
  3. Win谷歌插件加载失效
  4. 随机生成10元素数组并找出最大元素(Java)
  5. java epoll select_字节跳动高频面试题,操作系统/算法/Java等。
  6. 移动标准差以及移动平均值(movstd、movmean)
  7. RSS 之父炮轰 Google 强推 HTTPS
  8. centos6.5和centos7如何搭建php环境(包括php7)
  9. maxscale mysql5.7_Centos7安装maxscale 实现mysql的读写分离
  10. qt获取本机IP地址
  11. mac使用vscode
  12. 怎么搜索代码里的所有中文汉字
  13. 宋体小四在手机上是几号_word文档4号宋体 word宋体小四是几号字
  14. THINKPHP网站漏洞怎么修复解决
  15. vue-cli2.x旧版本卸载不掉的问题解决方案(亲测+踩坑)附Vue脚手架安装教程
  16. android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!
  17. 十六.Elasticsearch Adjacency Matrix Aggregation
  18. 简单理解操作系统之存储器管理
  19. WebStorm2016.2 注册码及激活,2018.6.14亲测有效
  20. 2016年下半年总结(连载)!

热门文章

  1. gdb打印errno显示cant find thread-local storage xxxx
  2. fffffffffffff
  3. 轩辕实验室 | 车载以太网CNN入侵检测算法
  4. Pulmonary--Detection2
  5. IOT(物联网)的七大通信协议
  6. Nginx 反向代理的知识再温习一下
  7. 《Android源码设计模式解析与实战》读书笔记(十)
  8. Spring Boot教程十六:SpringBoot注入类实现多线程
  9. discuz x3.1 整站搬家换域名攻略
  10. 空降了位领导,三个月后我被离职了!