参考资料:
(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进行寄存器读写操作.
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 <math.h> 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方式自动对寄存器内容做预测;
4 前门访问与后门访问在寄存器测试中的注意事项
(1) 通过前门访问的方式,先验证寄存器访问的物理通路工作正常,并且有专门的寄存器测试的前门访问用例,来遍历所有的寄存器; 在前门访问被充分验证的前提下,可以在后续测试中使用后门访问来节省访问多个寄存器的时间;
(2) 对于寄存器地址不匹配的情况,比如寄存器A地址为0x10,寄存器B地址为0x20,而在硬件实现中,二者地址弄错了,A的地址为0x20,B的地址为0x10,这种情况下只依赖于前门读写或后门读写无法发现错误,结合使用前门访问和后门访问,比如前门写与后门读,或者后门写与前门读,则会发现问题;