一,posted事务和non-posted事务
https://blog.csdn.net/icxiaoge/article/details/80456837
https://blog.csdn.net/fzhykx/article/details/79718744
简单来说:posted事务就是在request传到下一级时,上游请求就结束了(此时事务还没有到达target,也还没有完成),又下一 级继续完成request。
non-posted事务,需要等到completion的response结束后,才能结束一次request。
由于non-posted事务会一直等到事务完成才释放总线,所以很影响总线的带宽,为此出现了delayed事务和split事务。
二、delayed事务以及delayed事务的顺序要求
PCI桥接受上游的request后,向下传递request,如果16个周期后依旧没有回应,这时候下游的桥就使用retry信号中断请求,PCI桥收到Retay信号后,就中断request信号,释放总线,计数一段时间后,重新发起一个delayed-request,若依旧16个周期没有反应,下游继续发送retay,pci桥在停止request,计数一段时间后再重新发起,如此反复直到target 准备好数据完成(此时的完成标记成delayed总线完成。)
只有memory write(PMW(posted-memory write))和message可以是posted 事务
三、delayed事务执行过程中要注意的顺序问题
总的来讲:
1、PMW不能越过之前的PMW执行(如果前后两个posted写,A是写,B是标记写好,B先于A执行,如果此时出现读事务,就会出现读旧数据的错误),PMW要能够越过其他的non-posted事务执行(为了防止死锁/提高总线利用率)
2、DRC/DWC要可以越过DRR/DWR事务执行,也是为了避免死锁的问题
3、delayed read/write request 都只是一个request,只有得到grant后,事务才开始执行,所以为了防止死锁和提高总线利用率,这个request可能因为之前提到的优先级问题被discard掉。(而一个桥处理delayed事务的能力是有限度的,假设多个delayed事务都在执行,又来了新的delayed事务,可能会导致其中一个delayed事务被bypass 掉,所以南桥有一个针对LPC事务的处理,为防止对LPC的事务被bypass,会计数retry的次数,达到阈值后,就将该request移到pending-request buffer中,过一会儿再重新发起一个request。)