赞
踩
简述:
为了贯彻单一职责性,在uvm里,将产生和发送激励这两件事拆分为三个部分:sequence,sequencer和driver,其中只有后两者存在于component组件中。sequence唯一的作用就是产生item和trans。
sequence是sequence_item的集合,sequence之所以不存在于组件中是因为其有生命周期,是一个动态的元素。当它内部所有元素全部发送完毕,该sequence的生命周期结束。
sequencer类似于一个管道,作为存在于sequence和driver的中间者,它的主要功能有仲裁和协调二者不同的处理速度,所以其内部必须存在一个fifo用于缓存。
driver唯一的职责在于发送sequencer传送过来的产生好的数据。
过程:
sequence可以主动询问sequencer请求发送trans,而driver也可以使用seq_item_port与seqr建立通道,建立完整通道后driver使用get_next_item向seuqencer索取trans。
sequence产生trans有四种方法:1.使用`uvm_do宏 2.使用`uvm_rand_send宏 3.使用`uvm_create和`uvm_send宏 4.使用start_item和finish_item
以上三者我们需要在agent使用connect函数中将他们连接。
细节:
当sequencer发送给driver时,会自己留存一份,直到收到driver返回的item_done时才将其删除。
sequence的启动(挂载)方式:1.通过在env或者sequencer中调用自身的start函数。2.使用default_sequence(config_db)。
driver方法:get_next_item,try_next_item,区别在于是否阻塞,get会一直等到获得一个trans才返回,而try在实际中使用的更多。
objection机制会在sequence中使用starting_phase执行。
一般来说一个sequencer只能发送单一类型的trans或者item,遇到多种类型需要$cast转换。
一般由顶层的vseq控制objection。
补充:
lock和grab操作:是seq对seqr发送的请求。两种操作都用来锁定seq的发送,将该seq发送结束才能解除锁定,lock是将该seq放在响应事件的最后,等该seqr所有事件全部结束之后才能锁定,而grab意为夺取,seqr会立刻结束当前进程来响应(但是grab会等待当前lock结束执行)。
下面是详细笔记
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。