SystemVerilog interface 与 clocking block:消除竞争、统一接线
更新时间:2026-10-01。Verilog 时代几十个信号在 DUT 和 TB 之间重复连线,极易错。interface 把这组信号打包,clocking block 再解决“同一时钟沿又采又驱”的竞争问题。
本文要回答的问题
- interface 怎么把一坨连线收口,modport 有什么用?
- 为什么总出现“这一拍采到的是新值还是旧值”的竞争?
- clocking block 的 skew 怎么彻底消除竞争?
- class 在仿真世界里怎么碰到物理引脚——virtual interface?
一、interface:把信号打包
interface axi_if(input logic clk, input logic rst_n);
logic [31:0] awaddr;
logic awvalid, awready;
logic [31:0] wdata;
logic wvalid, wready;
endinterface顶层只连一次,DUT 和 TB 都从这个“插座”取信号,新增信号只改 interface,不用改一长串端口。
modport 限定视角,防止 monitor 误驱动:
modport dut (input clk, rst_n, awaddr, awvalid, output awready);
modport drv (output awaddr, awvalid, input awready);
modport mon (input awaddr, awvalid, awready);二、竞争冒险:同一沿的采样与驱动
如果驱动在时钟沿用 NBA(<=)赋值,而测试平台在沿上用阻塞读,谁先谁后取决于调度,可能采到刚写入的新值,也可能是旧值——这种“时好时坏”的竞争极难调试。
三、clocking block:统一采样/驱动时机
clocking cb @(posedge clk);
default input #1step output #2ns;
input awready;
output awaddr, awvalid;
endclockinginput #1step:在时钟沿前一个时间步采样,保证采到的是沿之前稳定的旧值。output #2ns:驱动在沿之后 2ns 生效,避开与 DUT 在沿上抢信号。default统一设置所有成员的 skew,个别成员可单独覆盖。
同步访问写作 cb.awaddr <= ...; 驱动、cb.awready 采样,平台与 DUT 之间不再有零时刻竞争。default clocking cb; 后还可省略 cb.。
四、virtual interface:把静态接口送进动态 class
interface 是静态的(在 module 层级例化),class 是动态对象,class 不能直接例化 interface,于是用 virtual interface 这个“句柄”:
// 顶层
initial begin
uvm_config_db#(virtual axi_if)::set(uvm_root::get(), "*", "vif", if0);
end
// driver
class axi_driver extends uvm_driver;
virtual axi_if vif;
task drive(); vif.cb.awaddr <= tr.addr; endtask
endclass通过 config_db 把物理接口的引用下发,driver/monitor 只认 virtual axi_if,不关心它在层级里的具体路径——这是平台可复用的关键一环。
五、连接关系图

六、常见坑
- 不用 clocking,driver 和 DUT 都在沿上抢,出现随机性竞争失败。
- modport 方向写反,monitor 意外驱动或 driver 编译报错。
- 忘了 config_db 下发 vif,
vif为 null,run 阶段崩溃。 - clocking 里用阻塞/非阻塞与平台其他部分混用,时序语义混乱。
- 复位信号也放进带 skew 的 clocking,导致复位释放晚一拍。
小结
总结
interface 把 DUT 与 TB 间的一组信号打包、用 modport 限定 dut/drv/mon 各自方向,取代 Verilog 满屏易错的重复连线;clocking block 用 input #1step(沿前采旧值)/output #skew(沿后驱动)彻底消除"同一时钟沿又采又驱"的零时刻竞争;interface 是静态、class 是动态,靠 virtual interface 句柄经 config_db 把物理接口下发给 driver/monitor,是验证平台可复用的关键。