沧小海基于xilinx srio核的学习笔记之第四章 Xilinx SRIO的示例分析(二)

 

目录

4.4 核的物理层

4.5 “srio_request_*”模块分析

4.6 “srio_response_*”模块分析


4.4 核的物理层

       原本不打算理会这部分内容的,但看《PG007》对这部分介绍很多,而且上问好多信号也涉及到了这部分内容,所以看来有必要对这部分内容进行简单的了解,如下为翻译。

本节描述了串行RapidIO PHY内的功能,包括通过链路接口与内核的通信。 本节还描述了初始化RapidIO链接,管理控制符号,接收和发送数据包,发出和响应中断,管理确认标识符,检测特殊情况错误条件,设置超时计数器以及接收和发送多播事件控制符号。

1、初始化RapidIO Link

       PHY必须进行初始化和对齐,以便可以可靠地接收数据包和控制符号。PHY在复位后进行初始化和对齐,并从输入串行流中恢复输入的数据和时钟。

       初始化和对齐是在退出复位状态或在系统运行期间输入端口失去同步之后发生的。 可在RapidIO互连规范-第六部分:物理层1x / 4x LP串行规范中找到初始化和对齐的准则。

       监视以下信号以监视链接是否已初始化和对齐:

port_initialized:链接已锁定以接收流。

     mode_1x:对于2x或4x内核,信号指示内核已训练到一条通道,在port_initialized声明后有效。

   rx_lane_r:指示核心已训练到冗余通道。

   idle2_selected:指示核心正在IDLE2模式下运行。

   out_of_sync:指示加扰器未同步(仅在启用加扰时有效)。

   link_initialized:表示已接收到七个连续的无错误控制符号,并且已发送15个连续的符号。 核心已经过全面培训,现在可以传输数据。

   这些信号可用于确定PHY TX和RX串行链路何时可用,然后,PHY接口可以开始接收和发送数据包。

2、控制符号的管理

       传入的控制符号被PHY占用,并且不传递给用户应用程序。  PHY处理控制符号,并在必要时以适当的控制符号响应进行响应。 为了说明,如果PHY接收到传入的链路请求控制符号,它会通过在发送端口上自动生成链路响应控制符号进行响应。表3-11包含SRIO控制符号和PHY采取的措施。 传输动作描述了PHY将传输控制符号的条件。接收动作描述了内核在接收到特定控制符号时采取的动作。 有关SRIO定义的控制符号的更多信息,请参见RapidIO互连规范-第VI部分:物理层1x / 4x LP串行规范

3Link Reset

您应该监视phy_rcvd_link_reset信号,该信号表示PHY已接收到四个链接请求重置设备控制符号,并且正在重置内核。 所有状态都必须返回其默认值。 根据sys_rst的应用程序实现,可以响应phy_rcvd_link_reset的声明来声明sys_rst以重置整个应用程序。

4、驱动接收BUF状态

       接收缓冲器状态phy_buf_stat [5:0]是一个六位信号,由缓冲器驱动至PHY。  BUF通常将传入的数据包存储在Block RAM中。 该信号指示BUF可以容纳的最大大小的数据包数。 编码值指定当前可用的数据包缓冲区的数量。 这可能表示从0(6’b00_0000)到30(6’b01_1110)个可用缓冲区的任何位置。 该信息被编码在PHY发出的传出确认,状态和数据包重试控制符号的buf_status字段中。

   根据先前的信息,连接的设备决定是否可以向PHY发送更多数据包。 如果BUF没有可用于数据包的缓冲区(phy_buf_stat [5:0] = 6’b00_0000),它将中断传入数据包。 这样做会使PHY向发送方发送一个数据包重试控制符号,并丢弃所有传入的数据包。

如果不使用标准RapidIO缓冲区,则必须至少实现一个缓冲区来存储完整大小的数据包。 在这种情况下,仅动态驱动phy_buf_stat [5:0]信号的最低有效位。  phy_buf_stat [5:0]信号的所有其他未使用位都接地。值0表示没有可用的缓冲区,而值1表示该设备有一个空缓冲区。如果需要基于接收器的流控制,请连接phy_buf_stat [5:0] = 6’b11_1111。

5、在收到的用户定义数据包中剥离最终CRC

大于80个字节的RapidIO数据包同时包含中间CRC和最终CRC。80字节或更少字节的RapidIO数据包仅包含最终CRC。如果存在,则将中间CRC从数据包中剥离。 在大多数情况下,最终的CRC也被剥离。但是,RapidIO规范除了最终的CRC之外,还允许16位零填充。对于用户定义的数据包类型,PHY会剥离数据包的最后16位,但是如果使用零填充,则CRC仍然是传递给BUF的数据包的一部分。

6、解释发送BUF状态    

发送缓冲器状态phy_rcvd_buf_stat [5:0]是由PHY驱动到BUF的六位信号。 它指示所连接的远程设备可以容纳的最大大小的数据包数。 编码值指定远程设备当前可用的数据包缓冲区的数量,并且可以表示IDLE1操作中从0(6'b00_0000)到30(6'b1_1110)可用缓冲区中的任何值,或从0(6'b00_0000)到62中的任何位置 (6'b11_1110)在IDLE2操作中。 此信息被编码在远程PHY发出的传入确认,状态和数据包重试控制符号的buf_status字段中。

   根据前面的信息,缓冲区应用程序设计可以实现基于发送器的流控制逻辑,并决定是否可以向连接的设备发送更多数据包。如果phy_rcvd_buf_stat [5:0] = 6’b11_1111,则所连接的设备将使用基于接收器的流控制。

7、识别应答

PHY将与确认标识符ackID相关的以下信号提供给BUF。phy_last_ack [5:0]、phy_next_fm [5:0]在管理传输确认标识(第124页)中提供了上述信号的详细信息。

8、中断物理层

如果BUF或PHY由于资源不可用,FIFO溢出,内部条件或CRC错误而要中断数据传输,则使用中断。本节介绍了PHY和BUF信号,用于指示接收和发送路径中的中断。 还提供了中断的操作,可能的原因和结果。

A、链接接收源中断

操作:

PHY连同m_axis_phyr_tlast一起设置m_axis_phyr_tuser中的不连续位(位0),以指示它希望中止向BUF的数据传输。采取此措施后,PHY停止传输数据包。

原因:如果检测到CRC错误,数据包被踩踏或在数据包接收期间出现其他错误情况,则该无效信号由PHY确认。

效果:声明此信号后,BUF和PHY之间的数据传输将停止。内核停止数据包的传输,并在必要时将不可接受的控制符号或数据包重试发送到数据包的发送方。 如果断言断言时BUF接收到数据包的任何部分,则BUF负责丢弃该数据包。

B、链接接收目的地中断:

操作:

BUF不能在接收方向上中断数据包。

C、链接发送源中断(Rewind倒带)

BUF与m_axis_phyt_tlast一起设置m_axis_phyt_tuser中的不连续位(位0)以指示希望中止向PHY的数据传输

原因:如phy_rewind所示,当发生倒带时,此中断信号被置位。

效果:声明此信号后,BUF和PHY之间的数据传输将停止。PHY不会增加phy_next_fm,从而导致用户设计重新发送数据包。 如果在断言断言时一部分数据包已由PHY发送到RapidIO结构,则PHY将通过发出踩踏控制符号来取消该数据包。

D、链接发送目标中断

操作:

PHY断言phy_rewind信号以指示它想要中断从BUF的数据传输。 确认此信号后,PHY停止接收数据包。phy_rewind信号应保持声明状态,直到缓冲区通过声明m_axis_phyt_tlast信号通知数据包结束为止。

原因:如果PHY已进入输出端口错误恢复过程,因为它已收到一个数据包不可接受的控制符号,或者已进入输出重试停止恢复过程,因为它已收到一个数据包重试控制符号,则它断言此中断。

效果:声明此信号后,BUF和PHY之间的数据传输将停止。核心将lnk_tnext_fm更改为需要发送的数据包,从而导致BUF应用程序重新传输该数据包。

9、管理发送确认标识

确认ID(ackID)是用于确认通过链路传输的数据包的标识符。 在IDLE2模式下(使用长控制符号时),ackID具有六个有效位,并且允许范围多达63个未确认的未确认数据包。 在IDLE1模式下(使用短控制符号时),位0绑定为零,最多允许31个未确认的数据包.ackID按升序顺序分配,溢出时回零以指示 数据包传输的顺序。 它们作为发送数据包中的物理层头字段发送到RapidIO结构。

以下信号有助于管理链路传输接口上的ackID:

•phy_last_ack [5:0]:该信号指示PHY收到的最后一个有效(预期)数据包确认。 然后,BUF可以释放收到其确认的帧以供重用。 但是,如果带有ackID的确认控制符号出错,则该信号保持不变。

•phy_next_fm [5:0]:如果传输链路空闲,则该信号指示要传输的下一个数据包的ackID。 它还可能表示当前正在传输的数据包的ackID。 但是,如果由于发送的数据包中的错误导致接口重试,则此信号保持不变。  BUF还必须将此值与当前正在传输的数据包相关。

A、正常工作

在正常操作期间,BUF必须将所有发送数据包与phy_next_fm上显示的值相关联。 这是在该数据包的物理层头字段中传输的ackID值。 连接的设备确认数据包后,它将发送一个数据包接受的控制符号,其ackID值等于在接受的数据包中找到的ackID值。  PHY使用在数据包接受的控制符号中找到的ackID值更新phy_last_ack。 然后,基于此更新,BUF释放保存此数据包的缓冲区位置。

B、错误恢复

本节介绍错误恢复期间必须注意的方案。这些情况说明了导致BUF同时重发一个数据包或同时确认一个或几个数据包的情况。

方案1:由于内部条件而导致的数据包重试连接的设备由于某些暂时的内部条件而使数据包重试。

效果:收到分组重试控制符号后,PHY会在链路发送接口上中断BUF。 内核发送“重试后重启”控制符号。 内核还使用在数据包重试控制符号中接收到的ackID值更新phy_next_fm。这表明BUF必须开始从该ackID值重传数据包,从而在设备之间重新建立正确的顺序。 如果收到的重试控制符号的ackID值等于当前phy_next_fm,即phy_next_fm不会增加,并且BUF必须重试已中断的数据包

场景2:处理序列外的ackID PHY会按顺序发送带有ackID的数据包,并且它会收到除较早ackID以外的所有确认信息。 这表示未收到ackID的数据包可能存在错误。

效果:PHY中断了链路传输接口上的BUF。 然后,它发送一个链接请求输入状态控制符号。 在连接的设备接收到链接请求输入状态控制符号之后,它会发送一个链接响应控制符号,以指示它接下来希望接收哪个分组ackID。 可能需要根据链接响应ackID值执行以下操作:

•链接响应ackID字段指示所连接的设备已确认一个或多个ackID,其数量大于当前在phy_last_ack上驱动的ackID。

PHY使用链接响应控制符号中的值更新phy_last_ack。

BUF可以释放所有缓冲区位置,从先前的phy_last_ack值到更新的phy_last_ack值。

•链接响应ackID字段指示所连接的设备正在等待一个带有ackID的数据包。  PHY使用该值更新phy_next_fm。  BUF必须重新传输此数据包以在设备之间重新建立正确的顺序。

方案3:设备收到损坏的控制符号

连接的设备从PHY接收到损坏的控制符号

效果:连接的设备将不接受数据包的控制符号发送给发送方。PHY的响应方式与场景2:处理序列外ackID中所述类似。

10、检测特殊情况下的错误情况

       PHY设计用于处理RapidIO 1x / 4x LP串行规范中概述的大多数错误情况。但是,必须监视以下信号以避免系统锁定:

•phy_link_reset:发送链接重置

•phy_rcvd_link_reset:链接已发出链接重置控制符号

•rcvd_pna:链接数据包未被接受

•port_error:链接端口错误

•force_reinit:强制重新初始化

方案1:

链接请求重置设备链接收到了一个链接请求重置设备。 连接的设备可能会发出链接请求重置设备控制符号序列。 收到四个连续的链接请求重置设备控制符号后,PHY会重置自身并将phy_rcvd_link_reset声明给用户应用程序。用户应用程序对phy_rcvd_link_reset的断言的行为是特定于实现的,超出了本文档的范围。

   推荐:Xilinx建议用户应用程序将所有ackID与存储的数据包分离。

   复位后,PHY在空闲1模式下将phy_next_fm驱动为6’b00_0000,在空闲模式2下将phy_last_ack驱动为6'b01_1111和6'b11_1111。

方案2:

致命错误情况在某些情况下,内核会检测到RapidIO 1x / 4x LP串行规范定义的致命错误。 这可以是但不一定限于:

•链路响应超时:PHY传输了链路请求控制符号,但未收到链路响应控制符号。

     •链接响应的AckID值未对齐:链接响应的ackID字段包含一个未完成的值。

   当检测到这些条件时,内核会声明port_error。 该信号表明PHY已关闭数据包的发送和接收。 您必须向核心声明sys_rst才能重新初始化链接并重置错误恢复状态机。

场景3:

重复接收不接受的数据包而没有进度核心可以重复接收不接受的数据包而没有前进。   在链接操作期间检测到错误时,所连接的设备将发出不接受数据包的控制符号。PHY发出链接请求控制符号。 连接的设备以​​包含下一个预期ackID的链接响应控制符号进行响应。  PHY重新发送该数据包,并恢复链接操作。但是,由于内部错误条件或不可靠的链接操作,所连接的设备可能继续发送未接受的数据包控制符号,从而迫使该链接永远不会在数据包传输上取得进展。

   PHY旨在帮助检测这种情况,并允许您根据系统和设计要求做出反应。 每次接收到未接受的数据包控制符号时,rcvd_pna信号会在一个时钟周期内置位。 该信号与phy_next_fm和phy_last_ack结合在一起,可以检测接收到的多个分组不接受的控制符号,而无需进行分组传输的前移。 这可能表示严重的物理链接问题或其他系统问题。 用户应用程序在检测到这种情况时的行为超出了本文档的范围,并且是特定于实现的。

   实现的可能选项包括:•通过断言force_reinit强制重新初始化链接。

   •通过声明sys_rst重置PHY。

   •通过断言phy_link_reset重置连接的设备。

   注意:对PHY或连接的设备置位复位会导致两个设备在ackID跟踪时未对齐(致命错误),或者重新传输以前发送的数据,这可能导致更大的系统错误。 最好如果一台设备被重置,另一台设备也被重置。 例如,如果对连接的设备进行了重置(使用phy_link_reset),则链接将被重新初始化,并且link_initialized信号将无效,直到重新建立链接。

   推荐:Xilinx建议用户应用在那时向PHY声明sys_rst,从而强制所有ackID跟踪返回到复位值。 这可以防止任何进一步的致命或系统错误情况。

11、失数据包检测的超时计数器

       如果经过足够的时间却没有收到系统的预期响应,则超时计数器将过期。 这些用于检测错误,例如丢失响应或请求数据包。 超时计数器值在物理层维护命令和状态寄存器(CSR)空间中定义,如下所示:

端口链接超时控制CSR(块偏移量0X 20字0):

端口链接超时控制寄存器包含链接事件的超时值,例如,发送数据包以接收相应的确认,以及发送链接请求以接收相应的确认 链接响应。重置值(最大超时间隔)在Vivado IDE中由用户指定。 最大值代表大约3秒。该值从0到最大值线性缩放。PHY使用此超时值来控制内部计数器,这些内部计数器检测错误情况并启动错误恢复或在port_error上指示致命错误。

端口响应超时控制CSR(块偏移量0X 20字1):

端口响应超时控制寄存器包含链接事件的超时值,例如发送数据包到接收相应的响应数据包。 重置值(最大超时间隔)在Vivado IDE中由用户指定。 所有值均应对应3到6秒之间的超时。 用户应用程序负责检测丢失的响应数据包。 通过输出端口port_timeout向您提供CSR中的超时值。

提示:如果您在核心生成过程中为端口响应超时设置了适当的默认值,则端口链接超时计数器会在端口响应超时之前尝试恢复。

12、发送和接收多播事件控制符号

本节介绍如何发送和接收多播事件控制符号。

组播事件请求操作phy_mce信号用于请求用户应用程序发送组播事件控制符号。

•原因:允许发生用户定义的系统事件,以在整个系统中进行多播。

•效果:声明此信号后,它将导致PHY发送多播事件控制符号。 该信号应置为一个时钟周期。

组播事件解码操作当PHY对串行链路上接收到的组播事件控制符号进行解码时,PHY会声明该组播事件解码信号(phy_rcvd_mce)。

•原因:PHY已解码收到的多播事件控制符号。

•效果:PHY通知用户应用程序它已经解码了多播事件控制符号。 由于多播事件是系统特定的,因此用户必须确定如何解释多播事件的接收



4.5 “srio_request_*”模块分析

       在前文以作描述,该模块有两个功能,一是作为“Initiator”发起数据发送,数据源可做选择,或是用户数据或是测试数据,数据包格式根据对IP核的配置进行选择,二是对“Target”响应数据的判断。

本模块的如下写法是个不错的逻辑,同时为1表示数据是有效的。

在本模块定义了一个wire [63:0] instruction [0:511];用来存储“instruction_list.vh”所包含的各种帧头信息。

       “go”这个信号是用来选择是用户数据还是测试数据,由于是对测试程序的分析,故“go”一直是零。也就关于用户数据的都忽略了。另外还有第九类事务也忽略了,因为在配置IP核时并未勾选该事务,在标准RapidIO协议中第9类事务是保留事务。

       “instruction_cnt”是用来控制本模块进行数据发送的,每发送完一包就会加一,直到完成指定的数据包数据的发送,指定包个数为NUMBER_OF_INSTRUCTIONS,如下图所示。当发送完所有包后,会将“sent_all_packets”拉高。

       “current_beat_cnt”是数据包有效信号,是对发送一包数据长度的计数,我们在帧头定义了数据长度,而它有是对发送数据长度的计数,所有其作用就是产生“val_ireq_tlast”信号表示一包数据的发送完成。如果是门铃事务或者读请求,没有载荷数据,“val_ireq_tlast”的产生也就不用此判断逻辑了,如下图所示。

       由于我们不发送用户数据,故发送的数据为data_beat,也就是计数产生的,如下这个计数逻辑挺有意思,脑回路不一般。

“request_address”是用来帧头索引,也就是在发送数据的起初索引呗。并据此确定事务类型、长度等,如下图所示。

       “expecting_a_response”是将请求事务中需要响应的的事务存在RAMB36SDP中去。

       此外,本模块还对接收的响应进行判断,方式是检测到“val_iresp_tlast”信号表示收集完一包数据,判断帧头是否与锁存的一致并打印相关信息。

4.6 “srio_response_*”模块分析

       本模块是当作为“Target”时,对接收数据发出响应。仿真发现“val_treq_tready”一直为高电平,不知为何没有起作用。

“first_beat”信号是当接收完一包数据后拉高的,用来产生“generate_a_response”信号,该信号用来锁存接收的帧信息“response_data_in”,其中有个“current_addr[23:16] == 8'h12”是xilinx的测试程序自定义的,主要针对“SWRITE”和“NWRITE”,表示如果发送该地址为12,表示本包数据需要响应。并将接收数据存入RAMB36SDP。

       “current_beat_cnt”是对发送数据的计数,当计数到指定长度后产生“val_tresp_tlast”信号。如下图根据接收的数据类型选择需要响应的数据类型。

 

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页