当前位置:   article > 正文

7 Series FPGAs Integrated Block for PCI Express IP核中的Atomic Operations、Core Buffering和Flow Control介绍

7 Series FPGAs Integrated Block for PCI Express IP核中的Atomic Operations、Core Buffering和Flow Control介绍

1 Atomic Operations

原子操作是计算机系统中用于在多线程或多处理器环境中实现数据同步的一种机制。它们保证在并发执行的环境中,某个操作在执行过程中不会被其他线程或处理器中断,从而确保数据的一致性和完整性。

7 Series FPGAs Integrated Block for PCI Express IP核支持PCI Express基础规范v2.1中定义的发送和接收原子操作。这些规范定义了三种TLP类型,允许在多个生产者和/或消费者之间实现高级同步机制。这些TLP类型包括:

  • FetchAdd:将地址处的值读取到TLP的载荷中,然后将该值与TLP载荷中的值相加,并将结果写回原始地址。
  • Swap:将地址处的值读取到TLP的载荷中,并将TLP载荷中的新值写入原始地址。
  • CAS(Compare And Set):将地址处的值与TLP载荷中的比较值进行比较。如果两者相等,则将TLP载荷中的新值写入原始地址。

请求原子操作的应用程序必须在用户应用程序中创建TLP,并通过发送AXI4-Stream接口发送它。响应(完成)原子操作的应用程序必须从接收AXI4-Stream接口接收TLP,在用户应用程序中创建适当的完成TLP,并通过发送AXI4-Stream接口发送结果完成TLP。

Core Buffering and Flow Control

PCIe链路的每一端的端口都必须实现Flow Control。Flow Control确保在发送数据包之前,接收端有足够的空间来接收数据。

2.1 Maximum Payload Size

TLP(Transaction Layer Packet)的大小受到链路两端设备能力的限制。在链路训练完成后,Root Complex在Device Control寄存器中设置MAX_PAYLOAD_SIZE值。这个值等于或小于IP核Device Capability寄存器中公告的值。

IP核的Device Capability寄存器中公告的值可以是128、256、512或1024字节,具体取决于Vivado IDE中的设置(注意:对于8通道、5.0 Gb/s 128位核心,不支持1024字节)。

IP核的Device Control寄存器的值通过cfg_dcommand[15:0]输出提供给用户应用程序。

2.2 Transmit Buffers

IP核的transmit AXI4-Stream接口提供了tx_buf_av,这是一个即时指示,表示在发送缓冲池中可用于使用的Max_Payload_Size缓冲区的数量。

对于特定的IP核,表3-13定义了可用的传输缓冲区数量和最大支持的有效负载大小。

每个缓冲区都可以存储一个最大尺寸的TLP(事务层数据包)。一个最大尺寸的TLP包括一个4-DWORD的头部,加上一个等于IP核Max_Payload_Size(在Device Capability寄存器中定义)的数据有效载荷,以及一个TLP摘要(Digest)。在链路连接完成后,Root Complex在Device Control寄存器中设置Max_Payload_Size值。这个值等于或小于IP核Device Capability寄存器中公告的值。

在IP核的传输缓冲区中,一个TLP会一直保留到链路伙伴确认收到该数据包为止。一旦确认收到,缓冲区就会被释放,用户应用程序就可以在其中加载一个新的TLP。

例如,如果Endpoint IP核选择的Capability Max Payload Size是256字节,并且选择的性能级别是高,那么总共有29个传输缓冲区。每个缓冲区最多可以容纳一个64位内存写请求(4-DWORD头部),加上256字节的数据(64个DWORDs),再加上TLP摘要(一个DWORD),总共是69个DWORDs。这个例子假设了Root Complex将Device Control寄存器中的MAX_PAYLOAD_SIZE设置为256字节,这是该IP核所公告的最大能力。因此,在任何给定时间,这个IP核都可以有29个这样的69 DWORD TLP等待传输。

多个TLP之间不会共享缓冲区,所以即使用户发送的是较小的TLP,如没有TLP摘要的32位内存读请求(每个TLP总共只有三个DWORDs),每个传输缓冲区在任何时候仍然只能容纳一个TLP。

内部的传输缓冲区在用户应用程序和IP核的配置管理模块(CMM)之间共享。因此,即使用户应用程序没有发送数据包,tx_buf_av总线也可能会波动。CMM在响应配置读取或写入时生成完成TLP,在用户应用程序的请求下生成中断TLP,并在需要时生成消息TLP。

可用的传输缓冲区指示使用户应用程序能够充分利用IP核发射器的PCI事务排序特性。事务排序规则允许Posted和Completion TLP绕过Non-Posted TLP。这意味着,如果IP核支持事务排序,用户应用程序可以根据需要优先发送或处理特定类型的TLP。

IP核支持事务排序规则,并优先处理被阻塞的非发布(Non-Posted)TLP之前的发布(Posted)和完成(Completion)数据包。非发布TLP可能会在链路伙伴暂时没有非发布接收缓冲区可用时变得阻塞,链路伙伴会通过流控制(Flow Control)更新来通知这一情况。在这种情况下,IP核会将这些阻塞的非发布TLP之前的完成和发布TLP提前发送。但是,这只能发生在完成或发布TLP已经被用户应用程序加载到IP核中。通过监控tx_buf_av总线,用户应用程序可以确保至少有一个空闲的缓冲区用于任何完成或发布TLP。只有在非发布TLP被阻塞时,才会发生完成和发布TLP的提前发送;否则,数据包将按照用户应用程序接收的顺序在链路上发送。

2.3 Receiver Flow Control Credits Available

IP核向用户应用程序提供关于接收缓冲区池队列状态的信息。这些信息表示当前为发布、非发布和完成队列提供的空间。

一个头部信用额度(Header Credit)等于一个3-或4-DWORD的TLP头部,一个数据信用额度(Data Credit)等于16字节的有效载荷数据。表3-14提供了在user_lnk_up断言后立即但尚未接收任何TLP时的可用信用额度值。如果上述任何类别的空间用尽,则相应的可用信用额度信号将指示为零。在接收器排空所有TLP后,可用信用额度将恢复到初始值。

用户应用程序可以使用fc_ph[7:0]fc_pd[11:0]fc_nph[7:0]fc_npd[11:0]fc_cplh[7:0]fc_cpld[11:0]fc_sel[2:0]信号来高效利用和管理IP核及其应用程序中可用的接收缓冲区空间。

Endpoint IP核有一个独特的要求,即用户应用程序必须使用高级方法来防止在从上游组件请求非发布读取请求时发生缓冲区溢出。根据规范,PCI Express Endpoint需要在其接收器中为完成事务(Completion Transactions)广播无限存储信用额度。这意味着Endpoint必须在内部管理向上游传输的内存读取请求,并在接收到相应的完成时不会使接收器溢出。

用户应用程序的传输逻辑必须使用提供的完成信用额度信息来调节内存读取请求的速率和大小,以保持在IP核接收器中的即时完成空间范围内。

2.4 Flow Control Credit Information

集成块为用户应用程序提供关于事务层发送和接收缓冲区信用额度池状态的信息。这些信息表示当前可用的空间,以及发布、非发布和完成池的信用额度“限制”和“已使用”信息。通过这些信息,用户应用程序可以更好地管理数据包的发送和接收,以确保系统的稳定运行和避免缓冲区溢出。

下表定义了流控制信用额度信号。这些信号上呈现了信用状态信息:

  • fc_ph[7:0]
  • fc_pd[11:0]
  • fc_nph[7:0]
  • fc_npd[11:0]
  • fc_cplh[7:0]
  • fc_cpld[11:0]

这些信号统称为fc_*

fc_*信号提供了关于PCI Express基础规范中定义的每个信用池的信息:发布、非发布和完成的头部和数据信用额度。

用户应用程序可以读取六种不同类型的流控制信息。fc_sel[2:0]输入选择fc_*输出所表示的流控制信息类型。流控制信息类型在表3-15中列出。

(注意:表3-15没有直接给出,但通常它会列出类似于“发布头部信用额度”、“发布数据信用额度”、“非发布头部信用额度”等类型的选项。)

通过正确设置fc_sel[2:0]的值,用户应用程序可以查询不同类型的信用额度信息,以了解当前可用的信用额度数量,并根据这些信息来管理其数据传输,以避免缓冲区溢出或不必要的延迟。

fc_sel[2:0]输入信号可以在每个时钟周期上更改,以指示不同的流控制信息类型。对于64位和128位接口,从fc_sel[2:0]的值改变到相应的流控制信息类型在fc_*输出上呈现,存在两个时钟周期的延迟。Figure 3-56展示了流控制信用信号的时序。

流控制(Flow Control)信号`fc_*`所代表的信用值是根据PCI Express基础规范来定义的。一个头信用等于一个3-DWORD(双字)或4-DWORD的TLP头。TLP是PCIe中用于在事务层传输数据的基本单元。头信用决定了发送方可以发送多少个TLP头,而不需要等待接收方的确认。一个数据信用等于16字节的有效载荷数据。这意味着,在发送了一个TLP头后,发送方可以连续发送16字节的数据,而不需要等待接收方的进一步确认。

表格Table 3-16定义了`fc_*`信号上可能呈现的值,并且指出初始信用信息会根据集成块内接收缓冲区的大小和链路伙伴(Link Partner)的不同而有所变化。

2.5 Receive Credit Flow Control Information

PCIe中的接收信用流控制(Receive Credit Flow Control)信息是通过设置fc_sel[2:0]来选择不同的流控制信息,它可以被设置为000b001b010b。具体地说,接收信用流控制信息指示了集成块内部接收缓冲区的当前状态。

  • Receive Credits Available Space: fc_sel[2:0] = 000b

fc_sel[2:0]被设置为000b时,可以选择查看接收信用可用空间。这个信息展示了集成块事务层本地接收缓冲区中每个信用池(credit pool)的可用信用空间。如果任何一个信用池的可用空间耗尽,对应的fc_*信号将指示一个零值。

PCIe中的信用池是一个逻辑概念,用于管理不同类型的TLP的接收。例如,可以有不同的信用池用于管理完成TLP、非发布TLP等。

  • Receive Credits Limit: fc_sel[2:0] = 001b

这个字段表示分配给链接伙伴(即接收端)的信用数量。这些信用的数量在流控制初始化期间由集成的块(可能是PCIe控制器或端点)根据广播的值进行初始化。随着通过AXI4-Stream接口从事务层(Transaction Layer)接收缓冲区中读取TLPs(Transaction Layer Packets),这些值会作为累积计数进行更新。

如果为特定的信用池广播了无限信用,那么该池的接收缓冲区信用限制始终指示为零信用。然而,在实际应用中,这通常是通过设置一个非常大的值来实现的,而不是真正的零。

  • Receive Credits Consumed: fc_sel[2:0] = 010b

这个字段表示链接伙伴(接收端)已经消耗(即接收)的信用数量。这些初始的fc_*值总是零,并随着数据包被事务层接收缓冲区接收而作为累积计数进行更新。

简单来说,Receive Credits Limit是接收端可以接收的TLPs的最大数量,而Receive Credits Consumed是接收端已经接收的TLPs的数量。这两个字段共同管理PCIe链接上的流控制,确保数据传输不会因缓冲区溢出而中断。

2.6 Transmit Credit Flow Control Information

Transmit Credit Flow Control Information是PCIe流控制机制中的一部分,用于确保数据包的传输在接收方有足够的空间。当fc_sel[2:0]被设置为100b101b110b时,可以获取与发送信用流控制相关的信息。这些信息反映了链接伙伴(Link Partner)接收缓冲区内的当前状态。

  • Transmit Credits Available Space (fc_sel[2:0] = 100b)

这个字段指示链接伙伴的接收缓冲区中每个信用池(credit pool)中可用的信用空间。如果任何信用池的空间都被耗尽,对应的fc_*信号将指示一个零或负值。当集成块(可能是一个PCIe控制器或端点)成功地将所有TLPs发送到链接伙伴后,Transmit Credits Available Space将返回到其初始值。

如果向集成块的本地发送缓冲区写入了比链接伙伴当前能够消耗的更多的头部或数据,则值可能为负。由于集成块不允许带有完成通知的发布数据包(posted packets)在等待信用的完成通知之前通过,因此如果有一个完成通知在带有发布数据包的前面等待信用(如由零或负值指示),则不会发送该发布数据包。类似地,如果发布数据包在带有完成通知的前面等待信用,则不会发送该完成通知。用户应用程序可以监控Transmit Credits Available Space以确保这些临时阻塞条件不会发生,并仅向集成块写入在链接伙伴接收缓冲区中具有足够空间的数据包,以充分利用PCI Express链路的带宽。

非发布数据包(Non-Posted packets)总是可以在集成块内部被绕过,因此任何发布的或带有完成通知的数据包都可以绕过等待信用的非发布数据包。

PCIe允许链接伙伴(Link Partner)为一个或多个流量类型(Header、Data、Completion)广播无限信用。当设置为无限信用时,这通常意味着发送方(例如,PCIe控制器或端点)可以不受限制地向接收方发送数据包,直到接收方明确指示其缓冲区已满。

为了指示无限信用,可以将Header和Data信用输出设置为它们的最大值。

  • Transmit Credits Limit: fc_sel[2:0] = 101b

这个字段显示了链接伙伴为每个信用池设置的接收缓冲区限制。fc_*的值在流控制初始化期间由链接伙伴广播,并在从链接伙伴接收到流控制更新时作为累积计数进行更新。

无限信用的情况:如果为特定的信用池广播了无限信用,那么该池的Transmit Buffer Credits Limit始终指示为零信用。这是因为无限信用意味着没有实际的限制。

• Transmit Credits Consumed: fc_sel[2:0] = 110b

这个字段显示了集成块(如PCIe控制器或端点)从链接伙伴的接收缓冲区中消耗的信用数量。初始值始终为零,并随着数据包被传输到链接伙伴而作为累积计数进行更新。

通过监控Transmit Credits Consumed,集成块可以知道它已经使用了多少信用,并据此调整其发送速率,以避免耗尽接收方的缓冲区空间。

总结

在PCIe系统中,流控制是一个重要的机制,用于确保发送方和接收方之间的数据传输是稳定和有效的。通过正确地广播和更新信用,系统可以避免缓冲区溢出和数据丢失,同时最大化链路的带宽利用率。集成块和链接伙伴都需要遵循PCI Express规范中关于流控制和信用管理的规定,以确保系统的正确运行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/646299
推荐阅读
相关标签
  

闽ICP备14008679号