MCDF实验2(下)
在实验3 tb3.sv 中, 已经把 chnl_initiator 和 chnl_generator 改造为了类 class 改造好的内容chnl_intiator 在模块中和在类中的对比如下:
chnl_generator 在类中和在模块中的对比如下:
新添加的 class chnl_trans 如下:
到了 tb4 把这三个类都封装在一个包 package chnl_pkg 中,
另外还添加了以下的类:
层次关系是:
chnl_agent 类 具体代码如下:
chnl_root_test 具体代码如下:
chnl_basic_test 和 chnl_burst_test 和 chnl_fifo_full_test 如下:
他们的区别在于: idle_cycles 不同
class chnl_basic_test extends chnl_root_test; // 类 chnl_basic_test
function new(int ntrans = 200, string name = "chnl_basic_test");
super.new(ntrans, name);
foreach(agent[i]) begin
this.agent[i].init.set_idle_cycles($urandom_range(1, 3)); //basic的idle_cycles=1或2或3
end
$display("%s configured objects", this.name);
endfunction
endclass: chnl_basic_test
class chnl_burst_test extends chnl_root_test; // 类 chnl_burst_test
function new(int ntrans = 500, string name = "chnl_burst_test");
super.new(ntrans, name);
foreach(agent[i]) begin
this.agent[i].init.set_idle_cycles(0); // burst 的 idle_cycles=0
end
$display("%s configured objects", this.name);
endfunction
endclass: chnl_burst_test
class chnl_fifo_full_test extends chnl_root_test; // 类 chnl_fifo_full_test
function new(int ntrans = 1_000_000, string name = "chnl_fifo_test");
super.new(ntrans, name);
foreach(agent[i]) begin
this.agent[i].init.set_idle_cycles(0); // fifo 的idle_cycles=0
end
$display("%s configured objects", this.name);
endfunction
task run();
$display("%s started testing DUT", this.name);
fork: fork_all_run
agent[0].run();
agent[1].run();
agent[2].run();
join_none
$display("%s: 3 agents running now", this.name);
$display("%s: waiting 3 channel fifos to be full", this.name);
fork
wait(agent[0].vif.ch_margin == 0);
wait(agent[1].vif.ch_margin == 0);
wait(agent[2].vif.ch_margin == 0);
join
$display("%s: 3 channel fifos have reached full", this.name);
$display("%s: stop 3 agents running", this.name);
disable fork_all_run;
$display("%s: set and ensure all agents' initiator are idle state", this.name);
fork
agent[0].init.chnl_idle();
agent[1].init.chnl_idle();
agent[2].init.chnl_idle();
join
$display("%s waiting DUT transfering all of data", this.name);
fork
wait(agent[0].vif.ch_margin == 'h20);
wait(agent[1].vif.ch_margin == 'h20);
wait(agent[2].vif.ch_margin == 'h20);
join
$display("%s: 3 channel fifos have transferred all data", this.name);
$display("%s finished testing DUT", this.name);
endtask
endclass: chnl_fifo_full_test
接口的连接是通过 chnl_initiator, chnl_agent, chnl_root_test 连接的,接口函数如下:
总结:
实例化是从顶层开始,从上到下
整个实验结构是:
IC天然居士: 我这能看到啊
哇哇哇咔咔咔咔: 为什么第一个波形显示不出来啊
太阳0108: chnl_generator搬出 agent 搬到 test 中,更好的实现test中对generator的配置
闰土icer: 为什么没有reg_pkg的?
闰土icer: 我请问一下,就是为什么是fifo的深度余量大于数据包个数,fifo不是有自己的宽度吗?不应该是宽度乘深度大于数据包32位乘数据包个数嘛。