回顾实验3:
我们在完成了实验3之后,大家可以看到,monitor、reference model 与 checker 之间的通信是通过TLM端口或者TLM FIFO 来完成的,相较于之前的 mailbox 句柄连接,更加容易定制,也使得组件的独立性提高。
实验4的总体内容:
- 将产生 transaction 并且发送至 driver 的 generator 组件, 拆分为 sequence 与 sequencer 。
- 在拆分的基础上,实现底层的sequence。
- 完成 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。
以 chnl_agent 中的改造为例
实验1.1 driver 与 sequencer 的改建
实验1.2 底层 sequence 的提取
把原来 generator 的内容移植到 sequence 中,并进行相应的改造
实验 1.3 移除uvm_base_test 的 transaction 发送方法
包括: generator 的创建,在build phase 中的实例化,在connect phase 中的连接。
发现 test 调用了 virtual sequence 那么也就需要一个顶层的 virtual sequencer 与之对应,
virtual sequencer 写在 environment 中
实验 1.4 mcdf_base_virtual_sequence 内容
需要将mcdf_base_test::run_phase()发送序列的功能移植到新定义的mcdf_base_virtual_sequence中,而在移植后,mcdf_base_test::run_phase() 只需要挂载对应的顶层 virtual sequence 即可。
sequence 的挂载也就是启动:通过 my_seq.start(sequencer), 挂载到对应的 sequencer 上, 也就相当于连接到了组件树上,那么uvm_root会自动调用各个组件的run_phase(), 也就把 sequencer 运行,也就间接把 sequence 的 body 任务 运行起来了。
故一句话就是 , my_seq.start(sequencer) 会自动执行 sequence 里的 body 任务。