【发布时间】:2021-08-27 13:13:40
【问题描述】:
我在设计文件中声明了以下接口:
interface t_clocks;
ckrs_t ClkRs125MHz_ix;
ckrs_t ClkRs160MHz_ix;
ckrs_t [3:0] ClkRsLink_ixb;
ckrs_t ClkRsLinkx2_ixb;
logic tdclk_sampling;
modport producer(output ClkRs125MHz_ix,
output ClkRs160MHz_ix,
output ClkRsLink_ixb,
output tdclk_sampling);
modport consumer(input ClkRs125MHz_ix,
input ClkRs160MHz_ix,
input ClkRsLink_ixb,
input tdclk_sampling);
endinterface // clocks
interface t_bst(input ckrs_t ClkRs_ix);
tb_t mark;
modport consumer(input ClkRs_ix, input mark);
modport producer(output ClkRs_ix, output mark);
endinterface // t_bst
在使用这些接口的包类中:
package clspkg;
import DefinitionsPkg::*;
class bst_generator;
virtual t_bst.producer bst_master;
....
endclass // bst_generator
class clock_generator;
virtual t_clocks.producer clk_tree;
....
endclass // clock_generator
endpackage // clspkg
我在测试台中将所有内容粘合在一起,仅使用包中的 clock_generator 类:
module tb_turn_emulator;
import clspkg::*;
t_clocks clk_tree();
clock_generator cgen;
// ???????????????
//t_bst blast_radius(clk_tree.ClkRs160MHz_ix);
default clocking cb @(posedge clk_tree.ClkRs160MHz_ix.clk); endclocking
`TEST_SUITE begin
`TEST_SUITE_SETUP begin
cgen = new;
cgen.clk_tree = clk_tree;
cgen.run();
##10;
end
....
endmodule
现在,当我尝试编译这样的示例时,它以Virtual interface resolution cannot find a matching instance for 'virtual t_bst.producer' 失败
我花了很长时间才发现,如果我在 testbench 模块中也实例化了 t_bst 接口(取消注释上面代码中的 t_bst 行),一切顺利,没有编译错误,并且测试台照常通过.
我不明白为什么必须实例化 t_bst 接口,因为它根本没有在代码中使用。确实,我正在导入整个 clspkg 包,但是当我通过import clspkg::clock_generator 仅导入clock_generator 进行挑选时,没有任何变化。
怎么了?我正在使用 Mentor Modelsim
【问题讨论】:
-
只是附加信息:我正在使用 ModelSim SE-64 2021.1。
标签: class interface virtual system-verilog