UVM中一些自带的DPI方法(主要是与后门访问有关)

本文介绍了UVM中与后门访问相关的DPI方法,包括uvm_hdl_check_path、uvm_hdl_deposit、uvm_hdl_force、uvm_hdl_release、uvm_hdl_read和uvm_hdl_release_and_read。这些方法用于检查信号是否存在、设置或强制信号值、释放信号以及读取信号值。同时,提到了uvm_hdl_force_time任务,用于在指定时间内强制信号并读取其值。使用这些功能时,需注意避免定义UVM_HDL_NO_DPI参数以防止错误。
AI助手已提取文章相关产品:

uvm-hdl.c(包括了所要用到的.c文件,主要是uvm_hdl_vcs.c(VCS),uvm_hdl_inca.c(C),uvm_hdl_questa.c(M)),很久不同 的define来选择不同 的EDA vendor。我们以S家为例子进行简单介绍一下。在uvm-hdl.svh文件中,有下面的方法(DPI)

int uvm_hdl_check_path(string path)    path指定的信号,是否存在 返回值:

0:不存在       1:存在

int uvm_hdl_deposit(string path,  uvm_hdl_data_t value) path指定的信号,设置为value   返回值

1:设置成功      0:设置失败

int uvm_hdl_force(string path,  uvm_hdl_data_t value) path指定的信号,forcevalue 返回值

1force成功     0force失败

int uvm_hdl_release(string path) path指定的信号,release 返回值

1 release成功 0 release失败

int uvm_hdl_read(string path,  output uvm_hdl_data_t value) 读取path指定的信号值,保存在value 返回值

1 读取成功  0 读取失败

int uvm_hdl_release_and_read(string path, inout uvm_hdl_data_t value)

path指定的信号,release掉,并且读取release之后的值,保存在value

返回值 1 成功 0 失败

如果信号是reg,那么读取的值是之前force的值,如果信号是wire,那么读取的值是当前被驱动的值

还有一个task(UVM自带的,非DPI)

另外,还有一个taskuvm_hdl_force_time,将指定的信号,force一段指定的时间,force完成后,读取信号的值,保存在value中。

关于上面的DPI方法,其实在uvm-hdl.svhUVM也自己实现了,只是里面全是fatal答应,有一个参数,当定义了UVM_HDL_NO_DPI,而用户由调用了HDL DPI相关的函数,这时会报错,因此要使用这些个方法,不可以定义参数UVM_HDL_NO_DPI

我们在平常的使用uvm寄存器自带的后门访问后者想自己实现后门,都可以使用这几个DPI方法

您可能感兴趣的与本文相关内容

UVM(Universal Verification Methodology)是一种基于SystemVerilog的验证方法学,广泛应用于芯片设计的功能验证领域。后门访问通常指直接对寄存器模型或硬件模块进行读写操作,而不需要通过实际的DUT(Design Under Test)接口。这种方式主要用于调试目的,在正式测试过程中一般不推荐使用。 ### UVM后门访问的概念 1. **后门访问的作用** - 在功能验证环境中,有时需要绕过正常的总线事务流程快速设置某些寄存器状态、检查特定变量等。这种需求可以通过后门访问实现。 2. **后门访问的方式** - 直接修改仿真数据库中的信号值; - 利用寄存器模型提供的API完成对寄存器实例的数据更新而不触发对应的frontdoor sequence; #### 示例代码展示 假设存在一个寄存器名为 `STATUS_REG`, 可以采用如下方式进行后门写入及读取: ```systemverilog class my_test extends uvm_test; // 假设已构建好环境 env 包含 reg_model 等成员 task run_phase(uvm_phase phase); status_reg_t status_reg_val; // 定义寄存器类型句柄 // 写后门示例: status_reg_val = 'hDEADBEEF; // 给本地副本赋新值 STATUS_REG.write(status_reg_val, .parent(this), .path(UVM_BACKDOOR)); //读后门示例: STATUS_REG.read(status_reg_val, .parent(this), .path(UVM_BACKDOOR)); `uvm_info("TEST", $sformatf("Read back value from register: %p", status_reg_val), UVM_LOW) endtask : run_phase endclass : my_test ``` 上述例子展示了如何利用 `.write()` 和 `.read()` 函数配合路径选择参数指定为 `UVM_BACKDOOR` 来达成后门访问的效果。注意这里的操作不会激活任何关联到该寄存器上的sequence机制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值