UVM后门访问HDL access
UVM 中后门操作访问的实现:DPI+VPI
Verilog提供VPI接口,可以将DUT的层次结构开放给外部C/C++代码,通过C/C++代码可对DUT中的寄存器进行读写操作。 常用VPI接口如下:
vpi_get_value(obj, p_value);
vpi_put_value(obj, p_value, p_time, flags);
同时为了方便System verilog 和C/C++传递参数,SystemVerilog提供了一种更好的接口:DPI。如果使用DPI, 以读操作为例, 在C/C++中定义如下一个函数:
int uvm_hdl_read(char *path, p_vpi_vecval value);
在这个函数中通过最终调用vpi_get_value得到寄存器的值。 在SystemVerilog中首先需要使用如下的方式将在C/C++中定义的函数导入:
import "DPI-C" context function int uvm_hdl_read(
string path,
output uvm_hdl_data_t value
)
然后就可以在SystemVerilog中像普通函数一样调用uvm_hdl_read函数了。
HDL后门访问方法
- uvm_hdl_read()
读取指定路径的值,读取成功返回1。
function int uvm_hdl_read(
string path,
output uvm_hdl_data_t value
)
- uvm_hdl_check()
check给定的路径是否存在,不存在返回0。
function int uvm_hdl_check_path(
string path
)
- uvm_hdl_deposit()
将给定HDL路的寄存器设定为指定值,成功返回1。
function int uvm_hdl_deposit(
string path,
uvm_hdl_data_t value
)
- uvm_hdl_force()
将给定HDL路径force为指定值,成功返回1。
function int uvm_hdl_force(
string path,
uvm_hdl_data_t value
)
- uvm_hdl_force_time()
在指定时间,为给定路径赋值。需要注意的是这里提到的其他方法都是function,而uvm_hdl_force_time()是一个task。另外当force_time为0时,默认调用的是uvm_hdl_deposit()。
task uvm_hdl_force_time(
string path,
uvm_hdl_data_t value,
time force_time = 0
)
- uvm_hdl_release()
释放通过uvm_hdl_force()设置的值,成功返回1。
function int uvm_hdl_release(
string path
)
- uvm_hdl_release_and_read()
释放通过uvm_hdl_force()设置的值,并设置新的值。释放通过uvm_hdl_force()设置的值,成功返回1。value的内容release后新设置的HDL值。
function int uvm_hdl_release_and_read(
string path,
inout uvm_hdl_data_t value
)
参考: [1]: 《UVM 实战》 [2]: https://verificationacademy.com/verification-methodology-reference/uvm/docs_1.2/html/
|