Ordering rule
前面我们学习了PCIe系统中的几种类型的事务,在一个系统中,时刻都有海量的不同类型的事务。如何安排这些事务有序合理的通过总线?访问设备? 谁先谁后?这就是我们要说的“序”。
基本所有的协议都会制定有关顺序的规则,PCIe也不例外。这些顺序规则(Ordering rule)保证了事务的有序完成,避免了死锁、冲突等问题,并和传统的PCI总线兼容。另外,PCIe协议出于性能的考虑,增加了灵活顺序RO(Relaxed Ordering)的选项。
顺序规则定义了什么类型的事务可以穿越其他事务,什么类型的事务必须在其他事务之后,禁止超车!
上面这个表是Spec里面的,表示“行”是否可以超车“列”。a)表示没有打开RO选项。b)表示使能RO选项。
这个表实在是看着太头大了,讲起来也非常的枯燥和无趣。
在RO默认关闭的前提下,选两种简单的场景,大家感受一下:
- Read Request不能超车Posted Request:这个也好理解,写请求正在路上,读请求不能超过它,否则读取的内容就不是最新的了。
- Posted Request不能超车Posted Request:假如前一个post报文是写数据,后一个post报文是写状态。本意是数据刷新后置状态,如果超车会发生什么呢? 先置状态了,数据都没到。这会导致数据也不是最新的。
注意:上述两个例子都是在RO没有打开的前提下。PCIe的序由于有了RO变得更加复杂和灵活。我们不需要特意的记住这个表,没关系。实际的应用中,有些深层次的问题定位,需要分析仪抓取报文分析,涉及到数据一致性、死锁等问题,可以考虑是否是“序”导致的。到时候再临时抱佛脚,翻协议也不迟。