原创 BMD64与BMD128比较

2019-8-6 11:21 2049 22 1 分类: FPGA/CPLD 文集: PCIE
结合排查之前pio_writeReadBack_test0测试出现的问题,需要参考前人写的相关博客,大部分都是基于BMD64,而我的示例是基于BMD128。pio_writeReadBack_test0测试HOST发起一个MEM32写,然后再启动MEM32读回,所以先要探究MEM32写,分析BMD RX 引擎(用于接收、解析TLP。下图是https://blog.csdn.net/ningjinghai11/article/details/80924209博文中给出的BMD64模式下的MEM32写时序仿真图,可以看到存储器写请求TLP有2个,所以相应的bmd_64_rx_state分别有MEM_WR32_QW1和MEM_WR32_WT两个状态对应。

而我在仿真BMD128模式时,由于数据位宽为128bit,所以存储器写只有一个128bit的TLP就足够,而bmd_rx_state只一个MEM_WR32_WT就结束并进入RST状态,具体时序图如下:

:BMD_MEM_RD32_FMT_TYPE 和BMD_MEM_WR32_FMT_TYPE 两种标头对应的TLP是以PIO的模式传输,所以只会传输一个DW数据,再加上3DW标头;所以在BMD64模式下,一共两帧数据,而在上一个状态已经传输了一帧,本状态传输最后一帧数据,所以需要判断trn_reof_n 帧结束信号,同样需要主、从设备都准备好,即trn_rsrc_rdy_n 和trn_rdst_rdy_n 同时有效才能传输。而在BMD128模式下,只需一帧数据就足够了。这可以从上面两个时序图中可以清晰看出来。) 

下面比较下BMD64和BMD128的RX引擎中对几个状态机的定义。

先来看看BMD64:

  1. //接收引擎关键状态机的8个状态
  2. `define BMD_64_RX_RST                                    8'b00000001//接收引擎复位状态
  3. `define BMD_64_RX_MEM_RD32_QW1                 8'b00000010//存储器读状态
  4. `define BMD_64_RX_MEM_RD32_WT                   8'b00000100//等待存储器读结束
  5. `define BMD_64_RX_MEM_WR32_QW1                8'b00001000//存储器写状态
  6. `define BMD_64_RX_MEM_WR32_WT                  8'b00010000//等待存储器写结束
  7. `define BMD_64_RX_CPL_QW1                           8'b00100000//不带数据的完成
  8. `define BMD_64_RX_CPLD_QW1                         8'b01000000//带数据完成
  9. `define BMD_64_RX_CPLD_QWN                         8'b10000000//带数据完成
  10. //接收引擎4种标头
  11. `define BMD_MEM_RD32_FMT_TYPE                   7'b00_00000//存储器读请求:TLP头大小为3个双字,不带数据
  12. `define BMD_MEM_WR32_FMT_TYPE                  7'b10_00000//存储器写请求:TLP头大小为3个双字,带数据
  13. `define BMD_CPL_FMT_TYPE                              7'b00_01010//完成报文:TLP头大小为3个双字,不带数据;包括存储器、配置和I/O写完成
  14. `define BMD_CPLD_FMT_TYPE                           7'b10_01010//带数据完成报文:TLP头大小为3个双字;包括存储器读、配置读、I/O读和原子读操作完成

先来看看BMD128:

  1. //定义了8种关键状态机状态
  2. `define BMD_128_RX_RST 8'b00000001
  3. `define BMD_128_RX_MEM_RD32_STRAD 8'b00000010
  4. `define BMD_128_RX_MEM_RD32_WT 8'b00000100
  5. `define BMD_128_RX_MEM_WR32_STRAD 8'b00001000
  6. `define BMD_128_RX_MEM_WR32_WT 8'b00010000
  7. `define BMD_128_RX_CPL_STRAD 8'b00100000
  8. `define BMD_128_RX_CPLD_STRAD 8'b01000000
  9. `define BMD_128_RX_CPLD_QWN 8'b10000000
  10. //定义了4种标头
  11. `define BMD_MEM_RD32_FMT_TYPE 7'b00_00000
  12. `define BMD_MEM_WR32_FMT_TYPE 7'b10_00000
  13. `define BMD_CPL_FMT_TYPE 7'b00_01010
  14. `define BMD_CPLD_FMT_TYPE 7'b10_01010

作者: coyoo, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1010859.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

给作者打赏,鼓励TA抓紧创作!

赞赏支持
点赞 22
赞赏0

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
22
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /6 下一条