《我的第二个 UVM 代码——连接 interface》中直接在 testcase 里驱动 interface,当代码越来越多,需要考虑把环境拆分成多个小的环境,便于修改和维护。
如下图,定义一个 driver,并例化在 testcase 里。把 interface 连接到 driver 里的 virtual interface,在 driver 里 toggle interface,实现协议功能。
第一步,在 build_phase 里连接 virtual interface。分两次,tb 到 testcase,再从 testcase 里取出 interface 转存到 driver。如下图。注意,get 和 set 的路径是由几个参数共同组成的。例如,null、uvm_test_top、u_intf 组成了 uvm_test_top.u_intf。又如,this(uvm_test_top)、my_driver、u_intf 组成了 uvm_test_top.my_driver.u_intf。
在编译时可以加入+UVM_CONFIG_DB_TRACE 来打印 config_db 的 set 和 get 的详细信息。
第二步,在 driver 的 main_phase 里驱动 virtual interface。这一步与
《我的第二个 UVM 代码——连接 interface》没什么区别,只是把代码从 testcase 里移到 driver 里而已。
第三步,编译仿真。仿真命令(以 irun 为例)、波形、环境层次关系(verdi)如下。
实验代码:
https://github.com/chenfengrugao/uvm_lab
总结:在本示例中没有 env、agent、sequencer、sequence 等组件,属于一个简化的验证环境,主要是由于分步演示的需要。侧面也说明 UVM 是一个灵活的验证架构,可以根据自己的需要进行裁剪。