在老的基于存SV 搭建的验证平台中,testbentch 和 RTL 代码是统一包含在同一个顶层之下,这就方便了我们随时随地的可以操作硬件代码中的信号,读取、赋值、force、@等操作。然而,随着UVM的横空问世,基于UVM 的验证平台成为主流。在基于UVM 的验证case 中,我们难免需要用到读取或者监控RTL 信号的行为,此时,我们就要动动脑筋,到底采取哪种方式,来达到目的。道路千万条,根据不同场合,灵活选取适当方式,会提高代码质量,达到验证目的。
UVM提供了一种机制,后门访问。它可以方便我们直接对RTL中的信号进行操作,比如赋值,force,release等操作。
在uvm_hdl.svh文件中提供了相关的操作RTL信号函数:
函数 | 说明 |
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指定的信号,force成value值 返回值 1:force成功 0:force失败 |
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_hdl_force_time,将指定的信号,force一段指定的时间,force完成后,读取信号的值,保存在value中。
通过uvm本身提供的这些DPI,我们就可以在环境中,通过灵活使用这些DPI,从而对RTL中信号的值进行操作。