马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 jjxgh 于 2019-5-9 01:00 编辑
1、interface的主要目的就是将DUT和tb隔离开来,我是把interface理解成一个插座,这个插座上边连接着dut,和tb,也就是driver,mon等等的组建,所以可以根据需要,定义多个interface,比如driver定义一个interface,mon对应一个interface,dut定义一个interface。也可以只定义一个interface。
那么对于modport这个如何理解,modport可不可以认为,不想定义很多interface,我就用一个interface来取代所有的Interface,每个Interface实际就对应一个modport,所以在例化interface的时候,是例化interface.modport???而不是总的interface??
2、比如下边这个例子是视频中的例子,Modport的使用就不是很理解,例子中的interface定义的modport是TB,也就是说是连接testbench部分的接口,那为什么class driver对接上了呢??(是不是这里的tb的interface就是指的tb里边的driver组建的接口呢??所以这个TB其实就是dirver的接口),那么对于driver来说,例化的虚接口,如我第一点提出的,例化的是router_io.TB,而不是router_io?而在driver中调用的是用的例化后的router.cb???
3、第三个问题,下边例子中的class driver,它的虚接口是通过new的时候传递进来的,我感觉这样很麻烦啊,要把定义的变量都指定一下嘛?不能在tb里边例化了interface之后,直接把Interface给赋值给driver.router嘛??这样的话driver的类不就不用写new函数了嘛,直接用系统自带的new函数不久可以了嘛???
interface router_io(input bit clock);r
xxxxxx
clocking cb@(posedge clock);
output din,frame_n,valid_n;
input dout, frameo_n, valido_n;1
endclocking
modport TB(clocking cb,output reset_n);
endinterface
module router_test_top;
router_io io_0(systemclock);
router_io io_1(systemclock);
test t(io_0,io_1,reset_n);
router dut (
.clock(systemclock),
.reset_n(reset_n),
.din0(io_0.din),
.frame_n0(io_0.valid_n)
...
);
endmodule
class driver;
string name;
virtual router_io.TB router;
function new(string name = "driver", virtual router_io.TB router);
this.name = name;
this.router = router;
endfunction
virtual task send_addrs();
router.cb.frame_n[sa] <= 1'b0;
.......
endtask
endclass
|