AHB master VIP 二级流水线传输的实现分为下面几个部分:
1、trans的获取与缓存:在driver中实现对trans的get并且进行缓存,由于AHB实现的是二级流水线,因此trans的缓存队列深度为2。
2、控制信号驱动:在上一个trans的控制信号发送结束时,对trans缓存队列进行pop_front并驱动该trans的控制信号,并通过trans_count++的方式,告知数据信号驱动部分在下一个时钟可以进行数据的驱动,同时将其缓存进入“待完成”队列,“待完成”队列的深度同样为2。
3、数据信号的驱动:由于数据的驱动需要在控制信号的驱动下一周期进行,因此对trans_count的数值进行判断后进行驱动,当trans_count大于0时,代表先前已经有控制信号驱动,可以驱动数据信号。
4、trans完成判断:通过对ahb总线上的hready等信号进行判断是否有trans完成,若存在完成的trans则将“待完成”队列进行一次pop_front,并返回rsp。
具体代码如下:
其中的驱动函数中通过事件驱动,首先进行trans完成判断,然后进行数据驱动,最后进行控制驱动,由于在控制驱动之后数据才会进行驱动,因此数据会比控制晚一拍。
1、trans的获取与缓存
其中trans-queue是对trans的第一步缓存。
2、控制信号驱动
push_trans_control与push_trans_data分别用于“待完成”控制与数据的缓存,在存入队列的同时也进行控制信号的驱动。并将transcount++以表示数据信号可以驱动。
3、数据信号的驱动
对transcount进行判断并驱动数据信号。
4、trans完成判断
通过对hready信号以及“待完成”队列数量判断当前clk是否有trans完成了控制与数据的传输,当判断完成时,对“待完成”队列进行pop front并返回rsp。
5、sequence代码: