使用virtual interface的动态数组
在 SystemVerilog 中,直接声明一个 interface 类型的动态数组 是不允许的,因为 interface 本身是静态的(就像 module 一样)。你需要使用 虚拟接口(virtual interface) 的句柄来动态管理接口实例。
正确做法:声明 virtual interface 的动态数组
// 假设已经定义了接口 my_if
interface my_if;
logic clk;
logic data;
endinterface
// 在类或模块中声明动态数组
module top;
my_if if0(); // 实例化一个具体接口
my_if if1(); // 另一个实例
// 声明虚拟接口的动态数组
virtual my_if vif_array[];
initial begin
// 分配动态数组大小
vif_array = new[2];
// 将数组元素指向具体的接口实例
vif_array[0] = if0;
vif_array[1] = if1;
// 现在可以通过数组访问接口信号
vif_array[0].clk = 1'b0;
$display("%b", vif_array[1].data);
end
endmodule
关键点
- 必须使用
virtual:virtual interface是一个指向实际接口实例的句柄,可以动态分配和赋值。 - 动态数组声明:
virtual my_if array_name[];,然后通过new[size]分配空间。 - 实例化接口:实际接口实例需要像模块一样被例化(如
my_if if0();),然后将其赋值给虚拟句柄。 - 用途:常用于验证环境中,动态管理多个接口连接,或者在运行时刻决定使用哪个接口。
在类中使用动态接口数组
class driver;
virtual my_if vif_list[]; // 动态数组句柄
function new(int num_ports);
vif_list = new[num_ports];
endfunction
task drive_all();
for(int i=0; i<vif_list.size(); i++)
vif_list[i].data = i;
endtask
endclass
注意事项
- 不能直接声明
my_if array[](不写virtual),因为my_if是一个类型,但没有例化,编译器无法确定其大小。 - 动态数组中的每个元素是一个独立的虚拟接口句柄,它们可以指向同一个物理接口,也可以指向不同的接口实例。
- 如果在
module外部(如program或package)使用,也需要virtual。
总结:在 SystemVerilog 中,接口的动态数组是通过 virtual interface 句柄的动态数组来实现的。
浙公网安备 33010602011771号