PCIe总线的序

PCIe序的要求是为了满足满足生产者/消费者模型,和避免死锁。可以通过配置RO和IDO使得报文通过中间路径变为宽松排序,但可能会带来一些违反生产者/消费者模型的问题,需要开发者自行保证.

生产/消费者工作流程

生产者(FPGA板卡) 消费者(软件)
1 将数据写入内存(或者在本地准好数据) 轮询flag位(位于内存),直到该位为1。
2 写flag位为1 置flag位为0
3 查询status位(位于FPGA),直到该位为1 将数据从内存中(或去生产方读数据)取出使用
4 status=1后表示数据使用完毕,置status=0,此次发送结束 使用完数据后置status=1

不同VC之间没有序的要求。

强序标准(RO=0,IDO=0)

行穿越列 写请求(Col 2) 读请求(Col3) 完成报文(Col4)
写请求(A) No Yes Y/N
读请求(B) No Y/N Y/N
完成报文(C) No Yes Y/N

(YES=必须能,NO=不能,Y/N=无序要求)

在强序要求下,Yes是为了保证不会出现死锁,No是为了满足生产者/消费者模型。Y/N表示两者之间无序要求,无论是否穿越,都不会影响到生产者/消费者模型和出现死锁。

  • A2

写请求不能穿越写。生产者写了一笔数据到内存,又写了1个flag=1到另一个内存地址,若后一个写穿越了前一个写,软件轮询到flag后可能前一个写还未到达,软件就会取到未更新的数据。这就破坏了生产者/消费者模型。

  • B2

读请求不能穿越写。 否则可能造成读到了已经被写请求覆盖的数据。

  • C2

完成报文不能穿越写。生产者写了一笔数据到内存,置位于自己侧的寄存器为1,消费者在不断轮询该寄存器。如果完成报文能穿越写,就可能先读到flag为1,但此时写数据还未更新,软件取数据就出错了。这就破坏了生产者/消费者模型。

  • A3

写请求必须可以穿越读请求。如果总线上出现了NP,P,Cpld三个包,NP在最前面,Cpld是不能穿越P的,为了让Cpld穿越NP不造成死锁,必须让P能穿越NP。

  • B3

读请求与读请求之间是没有序的要求的。读请求是可以相互穿越的。但这会带来cpld返回乱序的问题,给处理数据方带来了麻烦。

  • C3

完成报文必须能够在读报文阻塞时穿越,否则可能造成死锁。假设A和B都给对方连续发送NP报文导致对端NP buffer满了,只有本地cpl发送出去了,本地np buffer里的NP才会减一,buffer才会空一点,对面的NP才能再发送一个过来。如果cpl不能穿越np,将造成死锁。

  • A4

写请求和完成报文没有序的关系。谁先谁后都不会影响到生产者/消费者模型,也不会造成死锁。

  • B4

读请求和完成报文没有序的要求。

  • C4

完成报文和完成报文之间没有序的要求,可以相互穿越返回。但是相同tag的报文要按序返回。不同tag之间可以乱序。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 10:14:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 10:14:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 10:14:04       58 阅读
  4. Python语言-面向对象

    2024-07-13 10:14:04       69 阅读

热门阅读

  1. 怎么知道服务器100M带宽可以支持多少人访问?

    2024-07-13 10:14:04       27 阅读
  2. [AI 大模型] Meta LLaMA-2

    2024-07-13 10:14:04       27 阅读
  3. Oracle逻辑备份

    2024-07-13 10:14:04       23 阅读
  4. c#视觉应用开发中如何在C#中处理图像噪声?

    2024-07-13 10:14:04       28 阅读
  5. 【ceph】ceph-mon重新选举的情况

    2024-07-13 10:14:04       27 阅读
  6. SpringBoot配置Swagger开启页面访问限制

    2024-07-13 10:14:04       25 阅读
  7. MFC常用数据类型类:CRect

    2024-07-13 10:14:04       25 阅读
  8. noi.openjude1.5 26统计满足条件的4位数个数

    2024-07-13 10:14:04       19 阅读
  9. MYSQL

    MYSQL

    2024-07-13 10:14:04      19 阅读
  10. Vue.js Ajax(axios)

    2024-07-13 10:14:04       20 阅读
  11. 开源项目有哪些机遇与挑战?

    2024-07-13 10:14:04       20 阅读
  12. Spring Boot集成Atomix快速入门Demo

    2024-07-13 10:14:04       24 阅读
  13. Python实现网站IP地址查询

    2024-07-13 10:14:04       20 阅读
  14. parquet-go的CSVWriter

    2024-07-13 10:14:04       27 阅读