文章目录
前言
实验内容:
- 将产生transaction并且发送至driver的generator组件,拆分为sequence与sequencer
- 在拆分的基础上,实现底层的qequence
- 完成sequencer与driver的连接和通信
- 构建顶层的virtual sequencer
- 将原有的mcdf_base_test拆分为mcdf_base_virtual_sequence与mcdf_base_test,前者发挥产生序列的工作,后者只完成挂载序列的工作
- 将原有的mcdf_data_consistence_basic_test和mcdf_full_random_test继续拆分为对应的virtual sequence和轻量化的顶层test
实验的最终目标是将generator、driver和test的关系移植为sequence、sequencer、driver和test的关系,主要目的是熟悉sequence的使用。
提示:以下是本篇文章正文内容,下面案例可供参考
一、driver与sequencer的改建
移除各个组件中driver中的mailbox句柄,以及在do_driver()任务中使用mailbox句柄通信的方式,转而使用uvm_dirver::seq_iten_port进行通信。并且后续会将generator拆分sequencer和sequence,这里先定义sequencer,用于和driver的tlm端口通信
chnl_pkg(其他组件同下):
将generator拆分成sequencer和sequence,sequencer如下:
【注意】:一定要注明driver 和 sequencer(包括sequence)参数类型且一致,否则仿真会报错
二、底层sequence提取
将原来在各个generator中发送transaction的任务,提取为各个对应的底层sequence。需要注意的是可以将mcdf_base_test中的idle_reg()、write_reg()和read_reg()也可以提取在reg_pkg中定义为对应的sequence,即idle_reg_sequence、write_reg_sequence和read_reg_sequence
chnl_pkg:
reg_pkg:
fmt_pkg:
在各个agent中声明、创建对应的sequencer,并且将其与driver通过TLM port连接起来。
chnl_pkg:
reg_pkg:
fmt_pkg:
三、移除generator的痕迹
将各个组件的generator定义,mcdf_base_test 中的声明、创建以及与driver之间的连接清除。
略
四、移除mcdf_base_test的transaction发送方法
移除已经移植到reg_pkg中的idle_reg()、write_reg()、read_reg()方法,mcdf_base_test只变为了容器性质,它的内部主要由mcdf_env、将来添加的mcdf_config配置对象以及被用来挂载的顶层sequence构成。
略
五、添加顶层的virtual sequencer
由于MCDF的验证环境存在多个底层的sequencer和sequence,因此这就需要有顶层的virtual sequencer与virtual sequence统一调度。
- 实现MCDF顶层virtual sequencer
- 在mcdf_env中声明、例化virtual sequencer,并完成其与顶层sequencer的连接
六、重构mcdf_base_test
原有的mcdf_base_test除了承担其容器的功能,还在其run_phase阶段实现了sequence的分阶段发送功能。在添加了顶层的virtual sequencer之后,需要将所有发送序列的顺序和组织等内容均移植到mcdf_base_virtual_sequence。
- 定义mcdf_base_virtual_sequence,并将发送序列的功能移植到run phase,最后在base_test中完成virtual sequence到virtual sequencer的挂载与启动
定义mcdf_base_virtual_sequence
- 在mcdf_base_test中完成挂载和发送序列,任务run_top_virtual_sequence()需要做的就是virtual sequence的例化、挂载并发送virtual sequence
七、重构mcdf_data_consistence_basic_test
将产生和发送transaction的任务均移植到mcdf_data_consistence_basic_virtual_sequence,使相应的mcdf_data_consistence_basic_test只作为容器
定义mcdf_data_consistence_basic_virtual_sequence
在mcdf_data_consistence_basic_test完成挂载与发送序列
八、重构mcdf_full_random_test
定义mcdf_full_random_virtual_sequence
在mcdf_data_consistence_basic_test完成virtual sequence的挂载与发送
编译仿真
上述错误原因在于没有将传递给driver的req序列id赋值给rsp,sequencer无法识别rsp应该返回给idle/write/read_reg_sequence中的哪一个。克隆任务clone()不会复制sequence_id,因此在多序列挂载同一个sequencer且有返回值时一定要手动复制req的序列id。【红宝书p379】