【UVM】ral_model 前门访问和后门访问

参考资料:

(1) uvm中直接操作RTL信号 | 骏的世界 (lujun.org.cn)

(2) 记录一下关于uvm后门(uvm_hdl_read)使用时遇见的问题。 - IC验证讨论 - EETOP 创芯网论坛 (原名:电子顶级开发网) -

注1:在使用uvm后门函数时可能会遇见这个问题:UVM_ERROR: set:unable to write to hdl path(...)  You may not have sufficient PLI/ACC capabilites enabled for that path出现这个问题是可以简单的理解为VCS缺乏权限造成的,需要在编译选项中加上-debug_all或者-debug_pp即可解决这个问题。

1. 前门访问(frontdoor access)

1.1 前门访问的本质

通过寄存器配置总线(如APB协议, I2C协议等)模拟CPU在总线上发出读写指令,对DUT进行寄存器读写操作.

【UVM】ral_model 前门访问和后门访问_第1张图片

1.2 前门访问过程(以write为例)

(1) 当调用寄存器uvm_reg的write task后,产生uvm_reg_item类型的transaction rw,之后调用uvm_reg::do_write(),而uvm_reg::do_write()中会调用uvm_reg_map.do_write()(参考uvm_reg.svh);

(2) 在uvm_reg_map.do_write()中,调用uvm_reg_adapter.reg2bus,将transaction rw转换成bus transaction(参考uvm_reg_map.svh);

(3) bus_sequencer将transaction交给bus driver,最终由bus_driver驱动到对应的bus interface上;

(4) bus monitor在bus interface上检测bus transaction;

(5) uvm_reg_predictor会调用uvm_reg_adapter.bus2reg将bus monitor传递过来的bus transaction转换成uvm_reg_item(参考uvm_reg_predictor.svh);

(6) 寄存器模型根据返回的uvm_reg_item来更新寄存器的value, m_mirrored和m_desired三个值(该步骤在uvm_reg_predictor的write函数内执行);

2. 后门访问(backdoor access)

2.1 back door access概念

(1) 广义上来说,所有不通过DUT总线而对DUT内部的寄存器或存储器进行存取的操作(通常是直接通过层次化的引用来改变寄存器的值);

(2) 后门访问使用仿真器database来直接访问DUT的register信号(write操作将register信号force成指定值,read操作返回register信号的当前值);

2.2 hdl path概念

(1) UVM寄存器库可以为blocks, register files, registers, memories指定任意的层次化路径;

例如,一个层次化路径定义为X的register, 如果其位于一个层次化路径为Y的register block中, 该register block又位于一个层次化路径为Z的register block中,那么该register的完整的层次化路径为Z.Y.X;

2.3 hdl path设置

(1) uvm_reg_block::configure()与uvm_reg_block::add_hdl_path();

(2) uvm_reg_file::configure()与uvm_reg_file::add_hdl_path();

(3) uvm_reg::configure()与uvm_reg::add_hdl_path_slice();

(4) uvm_mem::configure()与uvm_mem::add_hdl_path_slice();

 1 class mcdf_rgm extends uvm_reg_block;
 2     ...
 3     virtual function build();
 4         ...
 5         add_hdl_path("top.dut");
 6         chnl0_ctrl_reg.add_hdl_path_slice($sformtf("regs[%0d]",`SLV0_RW_REG),0,32);
 7         chnl1_ctrl_reg.add_hdl_path_slice($sformtf("regs[%0d]",`SLV1_RW_REG),0,32);
 8         chnl2_ctrl_reg.add_hdl_path_slice($sformtf("regs[%0d]",`SLV2_RW_REG),0,32);
 9         ...
10     endfunction
11 
12 endclass

2.4 借助hdl path实现后门访问(原理??uvm中直接操作RTL信号 | 骏的世界 (lujun.org.cn))

2.4.1 uvm中直接操作RTL信号

UVM提供了一种机制,可以直接对RTL中的信号进行操作,比如赋值, force, release, deposit;

2.4.2 uvm_hdl.svh

在uvm_hdl.svh文件中,提供了相关操作RTL信号的函数;如果没有定义UVM_HDL_NO_DPI这个宏,UVM内各个操作RTL信号的函数其实是通过DPI的方式,调用EDA工具提供的操作RTL信号的函数;

(1) uvm_hdl_check_path(string path): 检测path指定的信号是否存在;

(2) int uvm_hdl_deposit(string path, uvm_hdl_data_t value): 将path指定的信号,设定为value值;($deposit函数及其与force的区别见vcs user guide-后续的仿真事件会覆盖掉deposit的值,force则不然);

注1:寄存器模型后门写时,需要注意如果在reset期间后门写一个reg类型变量(尤其是seq内后门写寄存器时,可能不会看reset是否完成,容易出现该问题),可能不会达到预期结果;原因就在于deposit和force不同,当信号值受其他因素影响而改变时,会覆盖deposit值; reset期间, reg类型变量可能会在always块内被赋值为0,进而覆盖deposit值; 

(3) int uvm_hdl_force(string path, uvm_hdl_data_t value): 将path指定的信号,force为value值;

(4) int uvm_hdl_release(string path): 将path指定的信号,release为value值;

(5) uvm_hdl_read

(6) uvm_hdl_force_time

2.4.3 uvm_hdl.c

(1) 与uvm_hdl.svh对应的uvm_hdl.c实现如下,由于每个EDA vendor具体实现方式不同,所以包含到不同文件中;

 1 if defined(VCS) || defined(VCSMX)
 2     include "uvm_hdl_vcs.c"
 3 else 
 4     ifdef QUESTA
 5         include "uvm_hdl_questa.c"
 6     else
 7         if defined(INCA) || defined(NCSC)
 8             include "uvm_hdl_inca.c"
 9         else 
10             error "hdl vendor backend is missing"
11         endif
12     endif
13 endif
14 
15 //uvm_hdl_vcs.c
16 include "uvm_dpi.h"
17 include 
18 include "svdpi.h"
19 include "vcsuser.h"
20 
21 ifdef VCSMX
22 include "mhpi_user.h"
23 include "vhpi_user.h"

2.5 RTL与gate level的后门访问

(1) RTL与gate level的hdl path可能不同;为了解决这个问题,register model需要支持多个hdl path,分别用于不同的环境;

(2) hdl path相关的function/task可以接受不同的字符串参数用于将hdl path归为不同的类别;默认情况下,所有的hdl path定义采用的都是"RTL" hdl path;但是这个默认的"RTL"字符串可以改为"GATES" or anything else,用于定义门级网表下的hdl_path;

function void spi_reg_block::build();
    ctrl_reg=ctrl::type_id::create("ctrl");
    ctrl_reg.build();

    ctrl_reg.configure(this,null,"");
    ctrl_reg.add_hdl_path_slice("ctrl",0,14); //RTL level;
    ctrl_reg.add_hdl_path_slice("ctrl_dff.q",0,14,"GATES"); //Gate level

    add_hdl_path("DUT","RTL");
    add_hdl_path("DUT","GATES");
    lock_model();

endfunction

3. 前门访问与后门访问的区别

(1) 前门访问一般只能按字读写,无法直接读取寄存器域;而后门可以直接对寄存器域进行读写;

(2) 前门访问依靠监测总线对寄存器模型内容做预测,而后门访问依靠auto_prediction方式自动对寄存器内容做预测;

【UVM】ral_model 前门访问和后门访问_第2张图片

4 前门访问与后门访问在寄存器测试中的注意事项

(1) 通过前门访问的方式,先验证寄存器访问的物理通路工作正常,并且有专门的寄存器测试的前门访问用例,来遍历所有的寄存器; 在前门访问被充分验证的前提下,可以在后续测试中使用后门访问来节省访问多个寄存器的时间;

(2) 对于寄存器地址不匹配的情况,比如寄存器A地址为0x10,寄存器B地址为0x20,而在硬件实现中,二者地址弄错了,A的地址为0x20,B的地址为0x10,这种情况下只依赖于前门读写或后门读写无法发现错误,结合使用前门访问和后门访问,比如前门写与后门读,或者后门写与前门读,则会发现问题;

你可能感兴趣的:(uvm,uvm,ral_model)