学习sequence需要有耐心,也需要有技巧,到目前为止其背后的原理性的东西我并没有掌握,先学会用它,等到之后实践中,再慢慢弄清楚其背后的实现机制,感谢开源,至少可以trace源代码来挖掘其实现机制。目前我需要吃快餐,快点掌握它。
sequence真的有点像VMM中的scenario. VMM中也提供了这种方式,不过没有OVM中的sequence更加平易近人,我还是更喜欢OVM的机制。sequence_item作为最简单的原子单元, sequence可以看作sequence_item的人为排列组合控制。sequencer作为 sequence_item/sequence和driver之间的中介桥梁。 sequence的核心在于body()函数, 当执行seq.start(sqr)的时候,相当于sequence"seq"给sequencer"sqr"提出一个请求,请求sequencer通过seqence_pull_port将seqence"seq"中的sequence_item发送到driver端。
对比之前的ovm_transaction, 通过简单的tlm_
fifo或者tlm_transport就可以搞定,现在多了一个中介,那就是sequencer. sequencer用来对不同的sequence请求进行仲裁,排序。再交给driver.
08-01的例子介绍了一种最简单的request机制:
wait_for_grant() -> create seq_item -> randomize -> send_request
08-02的例子介绍了新的request机制,同时response的简单产生机制:
seq.body(): create_item() -> start_item(seq) -> randomize -> finish_item() -> get_reponse()
driver.run(): seq_item_pull_port.get(req) -> gen response item "rsp" -> rsp.set_id_info()-> put_response(rsp)
(1) create_item()函数的第一个参数是一个type handle, 用意在于可以override原始的request type,加一些特殊处理,用来re-use,很容易改变request的个性。
(2) start_item()包含第一种方案的wait_for_grant()功能。
(3) finish_item()包含了第一种方案的send_request()功能,同时还包含wait_for_item_done()功能。
(4) rsp.set_id_info()的目的是为了response routing用
08-03的例子介绍了并行sequence.多个sequence同时发送给sequencer,只需要fork..join即可,当然sequence也提供了一些arbitration的机制,很实用。
待续。。。