1. UVM环境搭建的起点:信号级连接
刚接触UVM验证时,我们往往从最基础的信号级连接开始。这种连接方式简单直接,适合快速验证DUT的基本功能。在信号级连接中,我们通过uvm_config_db将DUT的信号直接传递给验证组件。
1.1 信号级连接的基本实现
信号级连接的核心是在testbench顶层将DUT的信号通过uvm_config_db传递给driver和monitor。以下是一个典型实现:
systemverilog复制// 在testbench顶层
initial begin
uvm_config_db#(virtual dut_if)::set(null, "uvm_test_top.env.agent.driver", "vif", dut_if_inst);
uvm_config_db#(virtual dut_if)::set(null, "uvm_test_top.env.agent.monitor", "vif", dut_if_inst);
end
// 在driver中获取接口
virtual dut_if vif;
function void build_phase(uvm_phase phase);
if(!uvm_config_db#(virtual dut_if)::get(this, "", "vif", vif))
`uvm_fatal("NOVIF", "virtual interface must be set for driver!")
endfunction
这种方式的优点是直观易懂,特别适合初学者理解UVM的基本工作机制。但我在实际项目中发现,当DUT接口信号较多时,这种连接方式会变得难以维护。
1.2 信号级连接的局限性
经过几个项目的实践,我总结了信号级连接的几个主要问题:
-
可维护性差:当接口信号变更时,需要修改多处代码。我曾遇到一个案例,DUT增加了一个控制信号,结果需要在5个不同的地方修改连接代码。
-
复用困难:信号级连接将验证组件与特定DUT绑定,难以在不同项目间复用验证组件。
-
调试复杂:当信号连接出现问题时,需要在多个层次追踪信号流向,增加了调试难度。
提
