-
不能放在这,因为会提早结束,join_any,发送完一次数据就会结束仿真,后面数据没办法继续跑。数据产生完就结束仿真。
1.先打印随机化后的req对象
2.generator把req的数据通过信箱发给initiator里
3.initiator拿到req后进行写数据传输并打印要写的数据,再把rsp.rsp置位1。
4.并行执行三个agent的run,每个run里包含了generator和initiator的run,因此是并行同时随机化先产生并打印了三个channel的req。
打印输出完req的数据,再排队执行写入数据,每写一个就打印发送的数据是什么。
一次只能发送一个通道的数据。
答案:①restart后,随机化后的数据是一样的。
②vsim -novopt -solvefaildebug -sv_seed 0 work.tb1
添加了随机种子sv_seed 0之后,数据与之前相同。
③vsim -novopt -solvefaildebug -sv_seed random work.tb1
sv_seed random会让数据不同
答:会有1200个对象是因为,basic_test中ntrans=200,因此三个channel,每个channel要执行200次send_trans,那么就req=new()了200次建立了200个对象,而每次mailbox握手之后,在initiator里都要clone原本的req对象给rsp,因此一个channel就要创建400次对象,那么一共1200个对象。
同一时刻存在的chnl_trans的对象个数有多种情况。4-6个,最终会维持在6个。
generator被从agent里拿出来了。
通过mailbox握手进行传递req对象中trans类的成员变量,因为initiator里定义的chnl_trans类型的mailbox没有例化,二者要握手建立连接指向同一个对象,因此要让句柄一起指向generator里创建例化的对象。
随机化的过程在tb1中,是在generator里的send_trans()任务中,现在在tb2中是单独放在root_test中的do_config函数中,更方便产生随机数据。
继承父类方法,super.do_config()。
使用了gen_stop_e标志位,比如产生了十多个数据后,停止了generator,导致gen[i]没有跑完,就取不会三把钥匙,不能在run_stop_callback()任务中停止仿真,因此只要等待fifo把数据排空,即余量ch_margin为32那么就可以停止仿真了。
-
vsim -novopt -solvefaildebug -sv_seed random +TESTNAME=chnl_root_test work.tb2
-
vsim -novopt -solvefaildebug -sv_seed random +TESTNAME=chnl_basic_test work.tb2
-
vsim -novopt -solvefaildebug -sv_seed random +TESTNAME=chnl_fifo_full_test work.tb2
比较mcdt输出的数据和channel输入fifo的数据,将二者分别通过mailbox传给chnl_checker()。