下述纯属个人笔记;具体还需要验证思想。
interface个人推荐写法
interface ubus_if(input clk,input rstn);
logic [31:0] data;
logic valid;
logic write;
logic read;
logic [31:0] addr;
logic ready;
.....
//driver、monitor、sequencer里都会用到这组interface;
//所以推荐使用三个时钟块和三个modport划分。
//这样,就可以区分input/output端口方向;同样可以定义相关功能的测试时钟域。
clocking
endclocking
endinterface
问题1:为什么clk和rstn要写在括号里?
个人理解:
1. clk和rstn,一般只在testbench里定义驱动。所以不需要写在interface代码段里,可以减少不必要的接口层次。
2. clk和rstn,一般只在testbench里定义驱动。interface的clk和rstn,只会做input,很固定。
问题2:如果clk和rstn写在括号里,那么在driver、monitor里,怎样使用这两个变量?
个人理解:
1. clk和rstn,虽然跟interface的其它端口,定义的位置不一样。但是在仿真环境里,同样具有interface实例化.clk和interface实例化.rstn的信号。
2. interface实例化.clk不建议使用,要用时钟块的名称替换。这样的好处,是避免发生仿真的竞争冒险现象。这样,就不需要写#0.01这样的小延迟在驱动代码里了。
3. rstn一般在testbench里驱动,为什么不是rstn释放后,再调用run_test()
?回答:run_test()
是按照phase执行的,有严格的顺序;rstn一般在driver的main_phase
里做判断。rstn释放,一般在testbench里驱动。