1.信号收集:
subscriber负责从ahb_mst_monitor那里监听transaction(通过tlm),内置了rgm,在write()函数里识别transaction里的地址,然后根据这个地址去rgm里对应相应的寄存器,捕捉寄存器内值的变化去trigger event;(将event都放在用protected声明的event_pool里面,这样scoreboard里的event就可以和coverage model里的分开)
scoreboard继承于subscriber,因此scoreboard内部可以使用subscriber内部的event_pool,同时可以复用do_listen_event()函数。因此数据收集如下:
通过do_listen_event()函数从subscriber监听事件的触发情况,根据触发的事件、transaction和寄存器模型中值来配置ref model内定义的变量。
2.ref model:
根据ref model内定义的变量去模拟timer的计数行为:@(posedge vif.clk iff cfg.scbenable && timer_enable)的时候,观察当前计数值counter,如果counter等于1且中断寄存器打开,则中断值置1,如果counter等于0则把初始值赋给counter,如果counter是其它值的话则counter减一;
3.do_differing:
使用forever语句持续比较ref model里面的counter值和vif上的counter值,如果他们之间的差大于规定的最大误差值则报错。