SV接口(interface)实例化时必须加小括号 ()

接口(interface)实例化时必须加小括号 (),即使没有端口连接也要保留空括号。

为什么必须加

接口和模块(module)的实例化语法是一样的,SystemVerilog 语法规定实例化的格式为:

复制代码
接口名/模块名  实例名 ( [端口连接列表] );

其中 ( ... )实例化语法的固定组成部分 ,括号本身不能省略,只是括号里的内容可以为空

复制代码
uvm_config_if if0();   // ✅ 正确:实例化接口,无端口连接,空括号必须保留
uvm_config_if if0;     // ❌ 错误:没有括号,不构成实例化

关键区分:实例化 vs 句柄声明

这里最容易混淆的是**"实例化接口""声明虚接口句柄"**------它们语法不同:

复制代码
// ① 实例化真实接口(在 module/tb 里)------ 必须有括号
uvm_config_if if0();

// ② 声明虚接口句柄(在 class 里,指向已存在的接口)------ 没有括号
virtual uvm_config_if vif;   // 这是变量/句柄,不是实例化,不能加 ()
  • if0():真正创建了一个接口实体,占用硬件资源、承载 DUT 信号
  • virtual ... vif:只是一个"指针/句柄",指向某个已经实例化的接口,本身不实例化任何东西

有端口的接口

如果接口定义时带了端口(比如传入时钟、复位),就在括号里连接:

复制代码
// 接口定义带端口
interface uvm_config_if(input clk, input rstn);
  logic [31:0] data;
  ...
endinterface

// 实例化时连接端口
uvm_config_if if0(clk, rstn);         // 按顺序连接
uvm_config_if if0(.clk(clk), .rstn(rstn));  // 按名字连接(推荐)

如果接口没有端口,就用空括号:

复制代码
uvm_config_if if0();

一句话总结

接口/模块实例化时括号是语法必需的,空端口就写 ();只有 virtual interface 句柄声明才不写括号(因为它是指针,不是实例化)。