接口(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 句柄声明才不写括号(因为它是指针,不是实例化)。