| ||
学习到一篇有趣的接口interface介绍
interface是用来连接DUT和验证环境的端口。
1. 定义了interface之后,在top_tb中(是个module)就可以连接dut使用:
2. 但是在driver中声明interface用上述方式的话,是会报错的,只有在module块里才可以。
在driver这种class类里使用的是virtual interface
在声明了vif之后,就可以在main_phase等中驱动其中的信号了。
这样做可以消除代码中的绝对路径,大大提高了代码的可移植性。
但是怎么把top_tb中的u_avs_bus_if与driver中的vif连接起来呢?
这就要用到config_db机制了。
在config_db机制中,分为set“寄信”和get“收信”两步操作。
1. 在top_tb中进行set操作:
2. 在my_driver中进行get操作:
这里引入了build_phase,它是UVM_phase机制中的一个,在new函数之后main_phase之前执行。
build_phase 主要用来通过config_db机制的set,get来传递一些数据,以及实例化成员变量等。
它是一个function phase函数phase,是不消耗仿真时间的,总是在仿真时间0执行;而其他main/ run_phase是task phase,是任务phase,需要消耗时间。
在build_phase出现了uvm_fatal宏,倘若被打印,完成打印后会直接调用Verilog的finish函数结束仿真。
config_db的set和get函数都有4个参数。它们的第3个参数必须完全一致,第4个参数,set的表示要传递给driver的interface是哪个,get的表示把接收到的interface传递给自己的哪个变量。set的第2个参数表示路径索引,也即uvm_test_top(top_tb中UVM-run_test创建的固定名实例)
set和get函数都是静态函数,所以使用双冒号::。
uvm_condig_db#(virtual avsbus_interface)是一个参数化的类,其参数(括号里的)就是要寄信的类型。
向my_driver的var变量传递一个int类型的数据
END.