vmm_notify类实现进行通知服务的接口。该通知服务可为并发线程或者事物提供同步机制。
1. 通知可以和某一个由vmm_data派生出的status descriptor实例相关联,以便以后重新得到这个关联的status descriptor。如下:
this.notify.indicate(int notification_id, vmm_data status);
....
$cast(status, this.notify.status(notification_id);
2. 配置notifycation
virtual function int configure(int notification_id=-1,sync_e sync=ONE_SHOT);
如果指示标号为负数(缺省为负数),则返回新的大于1000000的一个唯一标识号,否则标识号就是你指定的notification_id,而配置的类型有ONE_SHOT(脉冲), ON_OFF(电平),BLAST(更加强调broadcasting)
3. 哪些vmm基类中有vmm_notify 公共成员
同vmm_log,基本上所有的vmm基类中都有vmm_notify 公共成员。 包括vmm_data, vmm_xactor, vmm_channel, vmm_env. 因为同步事件是每个基类必须的。基类的构造函数new会根据自己的vmm_log接口创建自己的vmm_notify句柄。如下,
this.notify=new(vmm_log log); //创建该类的新实例,使用指定的消息服务接口发出错误和调试信息
4. vmm各个基类中有哪些预定义的事件ID
vmm_data有ON_OFF类型的:
EXECUTE //一旦生成一个新的transaction就发出这个事件
STARTED // 未使用,(也许我们可以在transactor开始执行这个transaction时发出这个事件)
ENDED // 未使用
例如:用于等待各个transaction都完成了, tr.notify.wait_for(vmm_data::ENDED);
一般ENDED在VIP里面是这样使用的,以后我们也应该这样使用:
recevier在get出某个transaction后,进一步对transaction作一些处理,然后transaction发出ENDED通知。
vmm_xactor中预定义了已经被基类使用的事件
XACTOR_IDLE // ON_OFF transactor创建以后的default的起始状态
XACTOR_BUSY // ON_OFF
XACTOR_STARTED // ONE_SHOT transactor进入启动状态
XACTOR_STOPPED // ONE_SHOT transactor处在stop状态
XACTOR_RESET // ONE_SHOT transactor 被reset了
例如:
在driver或reciever的send或rcv函数中加入
this.notify.indicate(vmm_xactor::XACTOR_IDLE);
...//处理一个transaction
this.notify.reset(vmm_xactor::XACTOR_IDLE);
在tb_env中的stop()中加入
drv.wait_for(vmm_xactor::XACTOR_IDLE);
vmm_atomic_gen中预定义了已经被使用的事件
GENERATED // ONE_SHOT 表明已经根据blueprint产生了transaction descriptor的一个产品
DONE // ON_OFF 已经把所有的产品放入到channel中。
其他的不太常用,就不介绍了。