首先将package和tb这个模块分成两个文件来存放。遇到一个新的东西,以及读完代码后的一些不了解的知识点如下
Mailboxes是一种在进程之间交换消息的机制。数据可以通过一个进程发送到Mailboxes,然后由另一个进程获取。数据可以是任何有效的systemVerilog数据类型,包括类class数据类型。
也就是线程之间的fifo
首先来理清层次和结构
new函数将name给到父类中的new
执行父类root_test中的do_config后
分别对三个通道进行约束(数量,间隔,数据尺寸)
声明8个句柄
拿到子类的new后,对所有的class进行例化(checker,3agent,3gen,mcdt_monitor),一共八个。
将generator中的两个信箱的ch_trans,通过initiator传送给agent
将checker的in信箱的mon_data_t,通过monitor传送给agent
将checker的out信箱的mon_data_t,通过monitor传送给mcdt_monitor
gen和run停下来的反馈?这两个task看不太懂
3个agent、3个gen、mcdt_mon和checker同时run起来,出现gen_stop_e就停止gen
3个通道的接口给到agent(通过set_interface),mcdt的接口给到mcdt_mon(通过set_interface)
这里将结构分成数据处理的部分gen+init=agent,数据监测部分monitor=ch+mcdt的mon,比较数据部分checker
对initiator和ch_monitor做了三件事:命名与例化(new),接口的连接(set_interface),运行起来(run)
作为一个中间商
例化两个信箱req_mb和rsp_mb(信箱的位置是在这,其他都是传送句柄(数据包)),信箱存放的是类(ch_trans)的句柄req和rsp
根据最上面basic_test给出的约束条件,给出相应的ntrans个数据包trans,放入req和拿出rsp
命名new和连接set_interface
run和drive:取出gen的req信箱中的req,用ch_write发送出去,复制req到rsp(克隆函数),点亮trans中的rsp(bit位),将rsp(句柄)给回到gen的rsp信箱
最底层,被传送的,这是一个数据包,包括数据+id+间隔,每个trans都有一定数量的数据及其通道id等,每个trans之间都有间隔
上面initiator提到的克隆函数也在这里
new命名和接口set_interface
存放data和id的信箱,如果输入端数据有效且ready,就放到mon_data_t,再放到信箱中
同上,new和接口
同样的信箱,如果mcdt输出端有效,就放到mon_data_t,再放到信箱中
例化上面monitor中的信箱,也就是说上面只是句柄,这里才是信箱的位置
一共例化3个in1个out,四个信箱
先拿out的句柄,case对应3个id去取对应通道的句柄,比较数据,如果不一样,error+1,比较完comp+1