目录
对于chnl_generator 中
UVM是uvm_sequence,不变的部分有
1. 数据以及数据的约束没有变
2. 发送几次数据包的函数没有变化,只不过UVM中固定写在了 body() 函数
改变的部分有
1. SV 中需要声明与driver通信的mailbox,并创建它
2. SV中,发送数据给driver的函数中,需要自己创建 req = new() , 并使用 req.randomize with{}
1. UVM中, sequencer 与 driver 通信使用的是TLM的端口(实际通信是 sequence 和 driver),已经被封装好了,叫 seq_item_port 和 seq_item_export 。故直接使用即可。
2. UVM中, sequence 已经被封装好了一系列的宏,用于产生 transaction, 其中 `uvm_do 和 `uvm_do_with 做的事情包括,创建transaction,向sequencer 请求发送 transaction,随机化transaction,获得授权并发送transaction给driver。
可以看到 `uvm_do_with(req,{}) 放的是transaction 的句柄,以及约束。
3. UVM中还多了两个 ,一个是域的自动化,它的作用是无需自己编写对数据进行操作的函数,声明域的自动化,并在其中填入的是 UVM_ALL_ON ,就可以直接使用函数。
4. `uvm_declare_p_sequencer(chnl_sequencer) , 简化理解为 为sequence声明需要挂载的sequencer。
另外,由于uvm中把发送transaction 的事情做了,故不需要再发送req从下面的图中可以看到,也可以看到域的使用 req.sprint()
其中打印中用到的 get_type_name(), 它的含义是返回 类名 在这也就是chnl_data_sequence
具体可参考这个博客:UVM中的get_type_name(),get_name(),get_full_name()方法
再来看 顶层 test 中的sequence不同点
1.SV中对各个 generator 的操作还是放在了 test中,
分为两步, 首先对 generator 中的数据进行随机化,然后再启动 fmt_gen.start()
2. UVM 中,只需要 使用 uvm_do_on_with() 完成了 把调用sequence.start(), 启动sequence,并完成了挂载到对应的sequencer上,最后完成了随机化。
uvm_do() 中的第一个参数可以是 transaction的句柄,实现对transaction的创建以及发送
uvm_do() 中的第一个参数也可以是sequence 的句柄,如下图,实现对 sequence的
sequence.start() 的调用,也就是启动。
本人能力有限,如有错误,望指正