世界杯精彩,占用了我一定时间。不过计划总要按部就班贯彻执行。Cookbook还是要继续学习!
这段时间,将Cookbook全部看完了,不过,源代码分析没有完成,还需要花一点时间。特别是第9章,书中讲述内容很少,但是源代码的复杂度确实最高。需要考验我的耐心和认真程度。
先谈谈08-06(很奇怪为什么没有08-07,直接从08-06跳到08-08,后面再讲08-08),这个例子的架构如下:
左边看,标准的sequencer结构,使用了层次化的sequence方式,在hfpb_seq_rand_rw中调用了另外两个sequence, 分别是hfpb_seq_read_operand和hfpb_write_operand. 而在hfpb_seq_read_operand中,又调用了hfpb_seq_read_word;在hfpb_seq_write_operand中,又调用了hfpb_seq_write_word. 一共是3层调用。
这种层次化调用在TLM设计中显得非常清晰简洁,将复杂的问题大而化小。有一个很重要的技术被使用到,那就是lock()/unlock(), 当需要连续发送一批sequence的时候,需要采用这个技术。让我联想到USB协议中,一般HOST需要发送两个packet. 这时候就需要使用lock()/unlock()来完成。
第二个收获是driver的设计,将sequence_item_pull_port转化成基于ovm_transaction的ovm_transport_port/ovm_slave_port. 这里利用了ovm_seq_item的父类是ovm_transaction, 他们之间有共同的数据结构。所以hfpb_seq_item中通过函数实现了hfpb_seq_item和hfpb_transaction的数据交换功能,分别是函数copy_tr()和clone_tr().
最后就是标准的sequencer simulation. 通过config,做了250此random的memory读写。