slave_sequence
模块A与模块B是有来有回的两个模块,典型的场景是调度场景,可能一个request需要多个rsp,可能还有不同通道之间的交织场景等;
需要采样模块A的request,发送给与B_agent.seqr挂载的sequence,让它决定发生什么rsp给回模块A;所以需要在B_agent.seqr里面声明一个port,以便sequence能通过这个port得到采样道德request包;
对于一些一拍req,一拍rsp,的类型,可以直接agent里面实现,不需要通过slave_sequence这种方式;
对于那些不需要request信息的场景,可以直接在driver里面编写一些simulation_task去发送激励就可以了;
可以在env或tc_base层:通过set_sequencer去设置seqr;
比如:mo_xx_seq.set_sequencer(env.xx_agt.sqr);
当然也可以在具体的用例里面通过start去指定哪个seqr去发送激励;
mo_xx_seq.start(env.xx_agt.sqr);
sequence中实现发包速率的控制:
body :和之前一样,就是在repeat(tr_num)循环体里面多了一个get_bucket的阻塞task,本质是通过令牌桶机制实现一种速率控制,桶深大于0就发包,否则等到桶深大于0,发包减,一定时间后加,从而实现速率发包;
driver中:把与seq握手和驱动接口进行分离;
如构造task:get_stim和driver_if两个方法;
get_stim里面实现与seq的交互:seq_item_port.get_next_item(tr)---处理数据---tr放到一个tr_que里---seq_item_port.item_done(tr);(可以在这里控制获取tr的速率)
driver_if:forever :如果tr_que深度大于1,就执行接口驱动;