赞
踩
在PCIe通信中,Inbound Packets(入站数据包)是从PCIe设备(通常是Endpoint,即EP)发送到主机系统(通常是Root Complex,即RC)的数据包。这些数据包通常包含设备发送到主机内存的数据,或者是设备对主机发出的请求或中断的响应。
用户应用逻辑可以通过取消断言(deasserting)m_axis_rx_tready
信号来在任何时候暂停从PCIe核心接收数据。
m_axis_rx_tready
,并且有一个TLP可用,PCIe IP核将断言m_axis_rx_tvalid
并在m_axis_rx_tdata[63:0]
上呈现第一个TLP的QWORD(64位)。m_axis_rx_tready
,以表示它准备好接收在m_axis_rx_tdata[63:0]
上呈现的数据。m_axis_rx_tready
,PCIe IP核将继续呈现后续的TLP QWORDs,只要m_axis_rx_tready
保持断言状态。m_axis_rx_tready
,IP核将暂停数据传输,直到m_axis_rx_tready
再次被断言。当m_axis_rx_tready
信号被取消断言(deasserted)时,数据传输将被暂停,并且这种暂停可以持续任意数量的时钟周期。PCIe IP核将持续等待,直到用户应用逻辑再次断言m_axis_rx_tready
信号,表示它已经准备好接收传输层数据包(TLPs, Transaction Layer Packets)。
图3-19展示了PCIe IP核心在断言m_axis_rx_tvalid
的同时在m_axis_rx_tdata[63:0]
上呈现数据。
用户应用逻辑通过取消断言m_axis_rx_tready
来插入等待状态。IP核在检测到m_axis_rx_tready
再次被断言之前不会呈现下一个TLP QWORD。
用户应用逻辑可以根据需要断言(assert)或取消断言(deassert)m_axis_rx_tready
信号,以平衡从PCIe IP核接收新的TLP(传输层数据包)的速率与应用逻辑内部处理TLP数据的速率。
在PCIe通信中,当数据以高速率传输时,PCIe IP核可能会在接收AXI4-Stream接口上连续地发送背靠背(back-to-back)的TLPs(传输层数据包)。这意味着在前一个TLP的m_axis_rx_tlast
信号被断言后的下一个时钟周期,IP核就可以开始发送下一个新的TLP,并断言m_axis_rx_tvalid
信号。
用户应用逻辑必须被设计用来处理这种背靠背TLPs的呈现。这通常要求应用逻辑能够持续监控m_axis_rx_tvalid
和m_axis_rx_tlast
信号,以便在数据到达时及时处理,并在一个TLP结束且下一个TLP开始时进行切换。图3-20展示了在接收接口上呈现的背靠背TLPs的示例。
如果用户应用逻辑不能接受背靠背的数据包,它可以通过取消断言m_axis_rx_tready
信号来暂停TLP的传输。图3-21可能展示了如何使用m_axis_rx_tready
来暂停第二个TLP的接收的一个例子。
为了在用户应用中简化逻辑,PCIe IP核基于接收到的TLP(事务层数据包)的TLP Digest(TD)和数据毒化(EP)头字段的值执行自动预处理。
所有接收到的数据头字段中数据毒化位被设置的TLP(即EP = 1)都会被呈现给用户应用。当接收到被毒化的TLP时,核心会在整个被毒化TLP的持续时间内断言m_axis_rx_tuser[1]
信号(通常标记为rx_err_fwd
),如图3-24所示。
在PCIe通信中,数据毒化(Data Poisoning)是一种错误处理机制,当某个数据包由于硬件故障(如内存错误)而被标记为无效时,就会使用这种机制。数据毒化允许设备在检测到错误时,通过设置数据包中的EP位来指示该数据包已被污染(即无效)。
在PCIe通信中,TLP(事务层数据包)的头部包含一个TLP Digest(TD)位字段。当这个字段被设置为1(TD = 1)时,意味着TLP包含一个End-to-End CRC(ECRC),用于在传输过程中检测TLP的完整性。
IP核会从接收到的TLP中移除并丢弃ECRC字段。同时,清除TLP头部中的TLP Digest位(即设置TD = 0)。
在这种情况下,用户应用接收到的TLP将不包含ECRC字段,且TLP Digest位将被清除。
IP核不会从接收到的TLP中移除ECRC字段。整个TLP,包括TLP Digest和ECRC,将被呈现给用户应用的接收器接口。
在这种情况下,用户应用需要自行处理ECRC字段和TLP Digest位。
在7系列FPGA中,集成的PCI Express IP核会在启用ECRC检查的情况下,对传入的事务数据包进行ECRC(End-to-End CRC)校验。如果IP核在事务数据包中检测到ECRC错误,它会通过同时断言m_axis_rx_tuser[0]
(通常标记为rx_ecrc_err
)和m_axis_rx_tlast
信号来指示这个错误,如图3-25所示。
这里的m_axis_rx_tuser[0]
是一个用户自定义字段(tuser),在AXI4-Stream接口中用于传输与主数据流相关的辅助信息。在这个场景中,它被用作指示ECRC错误的信号。当该信号被断言时,用户应用知道接收到的数据包包含了一个ECRC错误。
当7系列FPGA中的PCI Express集成块配置为Root Port时,它确实不执行任何BAR(Base Address Register)解码或过滤操作。当配置为Endpoint时,IP核会对接收到的内存和I/O TLP(事务层数据包)请求地址进行解码,以确定它们正在访问IP核Type0配置空间中的哪个基本地址寄存器(BAR)。解码后的基地址通过m_axis_rx_tuser[9:2]
(即rx_bar_hit[7:0]
)信号进行指示。
关于rx_bar_hit[7:0]
信号的行为,可以归纳如下:
rx_bar_hit[7:0]
信号中的一个位会被断言。表3-1展示了rx_bar_hit[7:0]
信号与BARs之间的映射关系,以及它们在IP核Type0配置头中的相应字节偏移量。这个表可以帮助用户理解哪个BAR被特定的TLP所访问。
对于接收接口上的内存或I/O TLP来说,m_axis_rx_tuser[9:2]是一个用户定义的信号字段,通常在PCIe的AXI流接口中使用。对于内存或I/O的TLP交易,这个字段在接收接口上被用来传递rx_bar_hit[7:0]
这个信息。信号rx_bar_hit[7:0]通常与PCIe的地址匹配有关。在某些PCIe系统中,可用来指示TLP的目标地址是否匹配了某个预定义的地址范围(例如,BAR)。如果匹配,相应的位会被置位。
m_axis_rx_tuser[9:2]
字段会被用来传递rx_bar_hit[7:0]
的值。这个值从m_axis_rx_tvalid
信号被断言时开始,并持续整个TLP的长度。如下图所示。rx_bar_hit[7:0]
信号是未定义的(undefined)。因此,在这种情况下,你不应该依赖m_axis_rx_tuser[9:2]
来获取rx_bar_hit[7:0]
的值。(rx_bar_hit[7:0])
通过 m_axis_rx_tuser[9:2]
信号使得接收到的内存和I/O事务能够被导向用户应用程序中适当的目标地址范围。这里,rx_bar_hit[7:0]
用于指示接收到的地址与哪个基地址寄存器(BAR)匹配,从而允许应用程序逻辑根据这一信息将事务导向到正确的处理逻辑。
与链路伙伴的通信丢失是通过取消断言user_lnk_up
信号来指示的。当user_lnk_up
信号被取消断言时,它实际上对整个IP核起到了热复位(Hot Reset)的作用。因此,所有存储在IP核内部或正在呈现给接收接口的事务层数据包(TLPs)都将无法恢复地丢失。
具体来说,当一个TLP正在通过接收AXI4-Stream接口传输时,它会根据TLP头部中的Length字段呈现其正确的长度。然而,由于通信的丢失(由user_lnk_up
信号的取消断言指示),这个TLP会变得损坏,并且应该被用户应用程序丢弃。
图3-27描述了数据包传输中断的场景。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。