参考文献:
UltraScale+ Devices Integrated Block for PCI Express v1.3
m_axis_cq_tuser (512-bit Interface)
bit | name | width | description |
7:0 | first_be[7:0] | 8 | 1)payload的第一个Dword的字节使能标识。 2)first_be[3:0]反应此拍第一个TLP中传输事务层头中的First Byte_Enable位的设置,而first_be[7:4]反应此拍第二个TLP中传输事务层头中的First Byte_Enable位的设置。 3)对应存储读和I/O读,这4bits指示读取的第一个Dword中有效的字节 4)对应存储写和I/O写,这4bits指示payload的第一个Dword的有效字节 5)对于原子操作和带有payload的消息,这4bits全部设置位1 6)仅当在CQ接口上开启straddle时,first_be的bits[7:4]位才是有效的,当straddle关闭时,这bits[7:0]将被设置为全0 7)first_be域段仅在packet的第一拍是有效的。当m_axis_cq_tvalid和is_sop[0]全是1时,first_be[3:0]才有意义,当m_axis_cq_tvalid和is_sop[1]全是1时,first_be[7:4]才有意义 |
15:8 | last_be[7:0] | 8 | 1)关于payload的最后Dword的Byte 使能标识 2)last_be[3:0]反应在此拍第一个TLP的传输层头中Last Byte Enable的设置,last_be[7:4]反应在此拍第二个TLP的传输层头中Last Byte Enable的设置 3)对于存储读操作,这4bits指示数据块中最后Dword的有效字节 4)对于存储写操作,这4bits指示payload的末端Dword的有效字节 5)对于一个Dword传输和0长度的传输的存储读和写,这4bits应该全为0 6)对于原子操作和带有payload的消息,这4bits应该全为1 7)仅当在CQ接口上开启straddle时,last_be的bits[7:4]位才是有效的,当straddle关闭时,这bits[7:0]将被设置为全0 8)last_be域段仅在packet的第一拍是有效的。当m_axis_cq_tvalid和is_eop[0]全是1时,last_be[3:0]才有意义,当m_axis_cq_tvalid和is_eop[1]全是1时,last_be[7:4]才有意义 |
79:16 | byte_en[63:0] | 64 | 1)逻辑内部选择性的使用这些byte_en位,表示正在传输包的payload中有效的字节,bit[63:0]分别对应m_axis_cq_tdata[511:0]的64个字节。 2)对于描述符字节,这些bit位没有意义 3)逻辑内部可以通过请求描述符(地址和长度)产生byte_en标志位,也可通过first_be和last_be的设置产生byte_en标志位,逻辑可以直接使用byte_en标志位代替逻辑内部产生的byte_en标志位 4)当payload大小超过2Dword(8bytes)时,byte_en的bit位是连续的,当payload大小不足2Dword时,byte_en的bit位将是不连续的 【特例】:对于PCIE定义的0长度内存写事务特殊情况,当关联的1个Dword 净荷被传输时,byte_en的bit位全部为0。 |
81:80 | is_sop[1:0] | 2 | 1)此拍中1个新的TLP开始的标识 2)这2bits位被设置在TLP的第1拍 3)当straddle关闭时,仅is_sop[0]是有效的且is_sop[1]固定设置为0 4)当straddle开启时,is_sop[1:0]标识含有如下:
5)当straddle关闭时,对于逻辑内部,is_sop[1:0]标识的使用时可以选的,因为一个新的TLP,一定时尾随tlast标识的 |
83:82 | is_sop0_ptr[1:0] | 2 | 1)指示第一个TLP的第一个字节的位置
2)当 CQ接口的straddle开启时,这个域段有效,否则,这个域段固定为0,且一个TLP起始位置为byte lane0 |
85:84 | is_sop1_ptr[1:0] | 2 | 1)指示第2个TLP的第一个字节的的位置
2)当CQ接口的straddle开启时,这域段有效。在1拍中可差分2个TLP。当straddle关闭时,这个域段固定为0 |
87:86 | is_eop[1:0] | 2 | 1)指示一个TLP结束在此拍。 2)is_eop被设置在TLP的最后一拍 3)当straddle关闭时,仅is_eop[0]有效,is_eop[1]固定为0 4)当straddle开启时,is_eop标识含有如下:
5)当straddle关闭时,是否使用此域段有逻辑内部决定,因为1个TLP的尾tlast是有效的 |
91:88 | is_eop0_ptr[3:0] | 4 | 1)此拍第一个TLP的最后一个Dword的偏移 2)当is_eop[0]有效时,此域段才有效 |
95:92 | is_eop1_ptr[3:0] | 4 | 1)此拍第二个TLP的最后一个Dword的偏移 2)当is_eop[1]有效时,此域段才有效 |
96 | discontinue | 1 | 1)如果此IP核在从其内部FIFO中读取TLP净荷,检测到不可纠错的错误时,IP核会在TLP的最后一拍将discontinue标识置为有效 2)当用户逻辑检测到这个discontinue标识有效时,逻辑内部必须丢弃整个TLP数据 3)当TLP没有净荷时,discontinue标识一直无效 4)仅在净荷传输的最后一拍,discontinue标识才有效,此时is_eop[0]=1 5)当straddle开启时,如果在此拍discontinue标识有效,IP核不会产生产生第二个TLP 6)当IP核被设置为Endpoint时,IP核使用Advanced Error Reporting,将此错误向与它相连的Root Complex报告 |
98:97 | tph_present[1:0] | 2 | 1)tph_present指示通过接口传递请求TLP中,存在一个传输事务处理提示
|
102:99 | tph_type[3:0] | 4 | 1)当在请求TLP中存在TPH时,这两个2bits位提供于提示相关联的PH[1:0]字段值
|
118:103 | tph_st_tag[15:0] | 16 | 1)当在请求TLP中存在TPH时,tph_st_tag提供了8bit的Steering Tag,这8bit的Steering Tag于整个TPH有关联
|
182:119 | parity | 64 | 1)关于512bit位宽的传输数据的奇数校验 2)Bit i 指示对m_axis_cq_tdata的byte i 进行奇数校验 3)64bits分别对应512bits数据的64个字节 |
m_axis_cc_tuser (512-bit Interface)
bit | name | width | description |
1:0 | is_sop[1:0] | 2 | 1)此拍内有一个新的TLP标识 2)is_sop[1:0]被设置在TLP的第一拍 3)当straddle关闭时,仅is_sop[0]是有效的 4)当straddle开启时,is_sop[1:0]含有如下:
5)is_sop[1:0]域段仅当straddle使能时,IP核才使用此域段 6)当straddle关闭时,IP核使用tlast标识去判断一个输入的TLP的第一拍 |
3:2 | is_sop0_ptr[1:0] | 2 | 1)is_sop0_ptr[1:0]用来指示第一个TLP的第一个字节的位置
2)当straddle开启时,is_sop0_ptr[1:0]域段被IP核使用 3)当straddle关闭时,逻辑内部必须将一个新的TLP放在byte lane 0位置 |
5:4 | is_sop1_ptr[1:0] | 2 | 1)is_sop1_ptr[1:0]用来指示第二个TLP的第一个字节的位置
2)当straddle开启时,is_sop1_ptr[1:0]域段被IP核使用。逻辑内部在此拍拆分2个TLP |
7:6 | is_eop[1:0] | 2 | 1)在此拍内有一个TLP尾 2)is_eop[1:0]域段被设置在TLP的最后一拍 3)当straddle关闭时,仅is_eop[0]是有效的。 4)当straddle开启时,此域段的含有如下:
5)当straddle开启时,这个域段被IP核使用 6)当straddle关闭时,IP核使用tlast核tkeep域段判断尾拍和EOP的位置 |
11:8 | is_eop0_ptr[1:0] | 2 | 1)在此拍内第一个TLP的最后一个Dword的偏移 2)当is_eop[0]有效时,此域段才有意义 3)当straddle开启时,这个域段才被IP核使用 |
15:12 | is_eop1_ptr[1:0] | 2 | 1)在此拍内第二个TLP的最后一个Dword的偏移 2)当is_eop[1]有效时,此域段才有意义 3)当straddle开启时,这个域段才被IP核使用 |
16 | discontinue | 1 | 1)在事务传输期间,逻辑内部检测到错误并且需要中止此包时,需要置位此标识。IP核会将链路上对应的TLP清空,避免出现数据损坏。 2)除TLP的第一拍外,逻辑内部可以在事务传输的任何拍置位此信号 3)逻辑内部可以选择在error出现的地方中止数据包或进行传输直到包尾。针对后者情况,IP核认为此包从出现错误开始到包尾都是错误的,即使在包尾前逻辑内部将discontinue标识置低。 4)当s_axis_cc_tvalid=1时,discontinue才有意义 5)IP核仅当s_axis_cc_tready=1时,采集discontinue信号。因此,一旦discontinue置位后,直到s_axis_cc_tready=1之前,discontinue不应置为0 6)当straddle开启时,若一个带有discontinue标识的TLP尾,在相同的拍内,不应该发送新的TLP 7)当IP核被设置在一个Endpoint,这个错误通过IP核上报到Root Complex,使用AER |
80:17 | parity | 64 | 1)256bit数据的奇数校验 2)当IP核的校验检查开启时,关于s_axis_cc_tdata的字节i的奇数校验,逻辑内部设置parity的bit i。 3)当IP核检测到奇偶校验错误时,IP核会将对应的TLP清空,并将此错误作为不可纠正的内部错误 4)如果校验检查关闭,parity标识将设置为0 |
AXI4-Stream Interface Description
Completer Request Interface Operation(512bits)
对于还有payload的TLP,以128bit的描述符开始,且后面跟随数据。
Completer请求接口支持2中不同的数据对齐模式,IP核例化的时候进行选择哪种模式。
Dword对齐模式
有效数据的第一个字节出现在lane n=S+16+(A mod 4) mod 64,A表示以字节为单位的传输的数据块起始地址,S表示描述符的第一个字节出现的位置。对于消息和配置请求,A被设置为0。当straddle关闭时,S一直为0。当straddle开启时,S可能是0或32。
128bit地址对齐模式
在512bit总线上,payload的起始位置一直在128bit边界对齐。然而,512bit总线上,描述符的起始仅在第0字节或者第32字节。与payload相关联的第1个字节的偏移遵循公式,n=(S+16+(A mod 16)) mod 64,S是描述符的第一个字节出现位置的偏移,A是与payload第一个字节相关的内存或I/O地址。意味着,如果描述符起始位置为第0字节,payload的起始位置可能为:16,20,24,28。如果描述符起始位置为第32个字节,payload的起始位置可能为:48、52、56或60。
描述符的末端与payload的第一个字节之间用空字节填充。
支持straddle功能的接口,在相同拍内最多允许支持2个TLP。straddle功能仅能在Dword对齐模式下使用。
Completer Request Descriptor Formats
IP核将链路上收到的每一个请求TLP作为独立的AXI4-Stream包,在完成请求接口上传输。每个包以描述符开始,并且payload尾随描述符的后面。描述符保持16B长度,描述符在请求包的第一个16字节中发送。描述符一直保持在512bit接口的第一拍发送。描述符的结构根据请求类型有所不同。
下面的结构是内存read/write、I/O的read/write或原子操作请求:
Completer Request Descriptor Fields
bit | field name | descriptor |
1:0 | Address Type | 1)对于内存事务和原子操作,此域段才被定义,含有如下:
|
63:2 | Address | 1)此域段应用在内存、I/O和原子操作请求。 2)这个地址是请求的第一个Dword的地址 3)m_axis_cq_user中的first_be来判定字节级别的地址(重要) 4)当事务指定地址位宽为32bits时,bits[63:32]将被设置为0 |
74:64 | Dword Count | 1)此域段用来指示读或写的数据块大小(以Dword为单位) 2)这个域段的取值范围为:0~256 Dwords 3)对于I/O访问,Dword count=1 4)对于0长度的内存read/write,Dword count=1,且Firt_be=0 |
78:75 | Request Type | 1)识别事务的类型 2)事务类型和其编码,如下:
|
95:80 | Requester ID | 1)与请求相关的PCI请求ID 2)在RID传统解释接口中,16bits拆分为,8bit bus number、5bit device number、3bit function number 3)开启AIR时,bit[95:88]为8bit的bus number、bit[87:80]为8bit的function number 4)当请求时非邮寄的事务时,逻辑内部必须存储requester id,并且,当数据返回时,需要将此域段返回给IP核 |
103:96 | Tag | 1)与请求相关的Pcie Tag 2)当请求时非邮寄的事务时,逻辑内部必须存储tag,并且,当数据返回时,需要将此域段返回给IP核 3)对于内存写和消息,此域段被忽略 |
111:104 | Target Function | 1)关于内存、I/O和原子操作请求,此域段才有意义 2)它提供请求的目标function number号(BAR检查进行判定) 3)当ARI使用时,此域段全部有效,否则,仅bit[106:104]有效 |
114:112 | BAR ID | 1)关于内存、I/O和原子操作请求,此域段才有意义 2)它为请求中的地址提供匹配的BAR number
注意:在Root Port(RP)模式下,BAR ID 保持000状态 |
120:115 | BAR Aperture | 1)关于内存、I/O和原子操作请求,此域段才有意义 2)它提供与请求匹配的BAR的间隙设置 3)在寻址它的内存或I/O空间中,用户决定使用的bits位 4)例如,数值12表示:匹配BAR的间隙是4K,并且,bits[63:12]被忽略 5)对于VF BARs,BAR Aperture是基于覆盖BAR的单个VF消耗的存储器空间 |
123:121 | Transaction Class (TC) | 1)与请求相关的PCIe传输事务类 2)当请求时非邮寄的事务时,逻辑内部必须存储tag,并且,当数据返回时,需要将此域段返回给IP核 |
126:124 | Attributes | 1)bit124是No Snoop 标识位,bit125是Relaxed Ordering标识位,bit126是ID-Based Ordering标识位,仅对于存储请求和信息,以上标识才能被设置 2)当请求时非邮寄的事务时,逻辑内部必须存储tag,并且,当数据返回时,需要将此域段返回给IP核 |
114:112 | Message Routing | |
15:0 | Destination ID | |
63:32 | Vendor-Defined Header | |
63:0 | ATS Header |
Aborting a Transfer(中止传输)
对于包含有效载荷的任何请求,在传输payload的期间,在数据的最后一拍discontinue标识有效时,表示有错误产生。逻辑内部要对此TLP包,进行整包丢弃处理。在开启straddle的情况下,在尾拍中,接口不允许产生新的TLP包
Selective Flow Control for Non-Posted Requests(关于非邮寄事务的流控选择)
PCIe协议要求,即使逻辑内部不能接收非邮寄传输事务,也要Pcompleter请求接口持续传递邮寄事务。为了达到要求,IP核在completer接口上实现了基于可信值的流控机制,通过逻辑内部控制接口上的非邮寄事务请求,从而不影响邮寄事务。逻辑内部将接受非邮寄事务的buffer的可用空间值,通过pcie_cq_np_req信号传递到IP核中。仅当可用信值非零时,IP核才会发送非邮寄事务到逻辑内部。当非邮寄事务的传递因缺乏信值被暂定时,IP核任然会持续传递邮寄请求事务给逻辑内部。当逻辑内部没有基于信值反压机制时,逻辑内部会按照IP核传递的邮寄事务和非邮寄事务的顺序进行处理。
IP核维护一个内部信值计数器,用于跟随非邮寄事务的可用信值。下面的算法用于信值的跟踪。
-
在复位时,IP核内部的信值计数器置0
-
接口输出复位后,在每个时钟周期下:
-
如果这个时钟下,pcie_cq_np_req[1:0]非零且没有非邮寄请求事务,信值+1,除非信值计数达到上限。当pcie_cq_np_req[1:0]=2‘b01时,信值+1,pcie_cq_np_req[1:0]=2‘b10或2’b11时,信值+2
-
如果这个时钟下,pcie_cq_np_req[1:0]=2‘b00且有一个非邮寄请求被传递,信值-1,除非信值已为0
-
如果这个时钟下,pcie_cq_np_req[1:0]=2’b00且有两个非邮寄请求被传递,信值-2,除非信值已为0
-
否则,信值计数器保持不变
-
-
如果信值计数器大于0,IP核开始传递一个非邮寄请求事务给逻辑内部
Completer Completion Interface Opearation(512-bits)
数据包的头部描述符的长度为96bit,描述符后面紧跟着的payload数据。
在Dword-aligned模式下,有效字节的第一个字节放置的位置必须遵循此公式:n=(S+12+(A mod 4) )mod 64,A表示:被传输的数据块的起始地址(Byte为单位的地址),S表示:描述符的第一个字节出现的lane number。这个地址A为描述符中Lower Address域段的值。当straddle关闭时,这个起始的lane number S一直为0,当straddle开启时,这个起始的lane number S为0或32。
在128bit address-aligned模式下,有效字节的第一个字节放置的位置必须遵循此公式:n=(S+16+(A mod 16) )mod 64,A表示:payload净荷的首字节的地址,S表示:描述符的第一个字节出现的lane number(0或32)。描述符和payload净荷的之间的空隙,通过添加空字节进行填充。
此接口支持Straddle模式,在同一拍的数据中最多可有两个TLP数据。Straddle模式仅能在Dword-aligned模式下使用。
Completer Completion Descriptor Format
将完成数据发动至IP核的完成接口。每个数据包都已描述符开始,尾随后面的是净荷数据。描述符的大小固定为12B。Completion TLP的描述符总是在TLP包的首拍的数据中。当逻辑内部将completion数据拆分为多个Completion时,必须将拆分的Completion包当作独立的AXI4-Stream数据包,拥有自己的描述符。
描述符格式如下:
Bit index | Width | Fied Name | Description |
6:0 | Address | 7 | 1)对于memory读Completion,这个域段表示memory数据传输的起始地址(以Byte为单位)的低7bit位。 2)对于其他的Completion,此域段被设置为0 |
7 | RSV | 1 | 保留 |
9:8 | Address Type | 2 | 1)此域段,仅在memory事务和Atomic操作,才会被定义。逻辑需要将CQ的描述符中AT域段的值填充至此域段中 2)对于其他的事务,逻辑必须将其设置为0 |
15:10 | RSV | 6 | 保留 |
28:16 | Byte Count | 13 | 1)这13bit取值的范围为:0~4096。 2)如果memory读请求使用一个Completion完成,则此域段表示payload的大小(单位:Byte) 3)对于I/O 读completion和I/O写completion,此域段必须设置为4 4)当发送一个payload长度为0的memory读时,此域段必须设置为1且必须有一个Dword大小的虚拟payload跟随在描述符后面 |
29 | Locked Read Completion | 1 | 1)当这个completion是Locked Read requst响应时,此域段必须设置 2)对于其他Completion,此域段必须设置为0 |
31:30 | RSV | 2 | 保留 |
42:32 | Dwrod Count | 11 | 1)此域段表示payload的大小(单位:Dword),取值范围:0~1024 2)对于I/O读completion,此域段必须设置为1 3)对于I/O写completion,此域段必须设置为0 4)对于memory读且payload长度为0时,此域段必须被设置为1 5)当发送一个UR或CA 时,此域段必须设置为0 6)对于其他场景,根据当前数据包的payload大小,进行真实设置 |
45:43 | Completion Status | 3 | 1)此域段必须根据Completion类型进行设置 2)有效的设置场景有:
|
46 | Poisoned Completion | 1 | 1)此域段用来标识逻辑内部传输的Completion TLP是否有错误 2)当跟随在描述符后面的payload有错误时,需要将此域段置1,否则,置0。通过此方式向PCIE告知payload有错误 |
47 | RSV | 1 | 保留 |
63:48 | Requester ID | 16 | 1)PCI请求ID,此域段与CQ的描述符中Requester ID一致 |
71:64 | Tag | 8 | 1)PCI Tag,此域段与CQ的描述符中Tag ID一致 |
79:72 | Target Function/Device Number | 8 | 1)此域段表示Completer function的设备号和/或功能号
|
87:80 | Completer Bus Number | 8 | 1)此域段表示Requester Function 的设备号和/或功能号
|
88 | Completer ID Enable | 1 | |
91:89 | Transaction Class(TC) | 3 | 1)1'b1:在描述符中支持Bus、Device和Function numbers,来在TLP头的Completer ID域段 2)1'b0:IP核使用接收的Configuration requests中捕获的Bus和Device numbers和在描述符中支持的Function numbers来自于TLP头中的Completer ID域段 Endpint mode:
Switch上游(IP核的Endpoint mode模式被选择):
Root Port mode:
|
94:92 | Attributes | 3 | 1)此域段值与CQ中TC值一致 |
95 | RSV | 1 | 保留 |
Completions with Successful Completion(SC)Status
对于Non-posted请求,逻辑内部必须返回一个Completion到Completer completion interface。当这个请求没有错误产生时,逻辑内部返回的Completion需要带有Successful Completion(SC) Status。根据请求类型,Completion可以带有payload数据。此外,当一个数据块大小超过MPS时,与这个请求相关的数据需要被拆分为多个Split Completions。逻辑内部必须在每个Split Completion传递到Completer completion interface接口上且每个Split Completion带有各自的描述符头部。
在Dword-aligned模式下,TLP以12Bytes的描述符头,payload数据紧随其后。在没有s_axis_cc_tready拉低且数据包正常传递期间,不允许拉低s_axis_cc_tvalid信号,若在此期间拉低s_axis_cc_tvalid,IP核将视为一个Error且将传输的相关Conpletion TLP作废,避免数据冲突。
逻辑内部必须在数据包的最后一拍,拉高s_axis_cc_tlast信号。如果IP核不准备接收数据,IP核会将s_axis_cc_tready拉低。当s_axis_cc_tready拉低时,逻辑内部保持s_axis_cc_tdata和s_axis_cc_tlast不发生改变。
Completions with Error Status(UR and CA)
当在completer request interface上,响应一个接收请求(此请求带有Unsported Request或Completion Abort 状态)时,逻辑内部必须发生一个3个Dword的completion描述符,其后面附带5个Dwords信息。这5个Dwords信息对IP核产生log很重要。
按照下面的规则构成:
-
前三个Dword为描述符头
-
第四个Dword包含在m_axis_cq_tuser中的部分状态信号,如下
-
m_axis_cq_tuser中的first_be[3:0]
-
m_axis_cq_tuser中的last_be[3:0]
-
m_axis_cq_tuser中的tph_present、tph_type[1:0] 和 tph_st_tag[7:0]
-
-
后四个Dwords来自CQ中的描述符头