问题描述
本答复记录适用于SPI4.2 Core的所有版本。
SPI-4.2 Sink Core可能会显示以下异常行为:
– 虽然Sink内核正在接收数据,但仍可能断言SnkFFAlmostEmpty_n和SnkFFEmpty_n。
– SnkFFAlmostEmpty_n和SnkFFEmpty_n可能需要大量的周期才能被置为无效。
– SnkFFAlmostEmpty_n和SnkFFEmpty_n可能同时作为SnkAlmostFull_n被断言。
在以下情况下,这种不寻常的行为更加明显:
– SnkFFClk比RDClk成比例地快(即读出速度比数据进入速度快)。
– 接收器FIFO非常浅。 FIFO的浅度由SnkAFThresholdAssert设置决定,接近508的值被认为是浅FIFO。
解决/修复方法
这些都是Sink核心的预期行为,原因如下:
标志SnkFFAlmostEmpty_n和SnkFFEmpty_n实际上并不表示FIFO的真实状态,但它们只是指示数据未准备好从FIFO接口的读取流水线中读出。因此,某些数据可能已写入Sink FIFO,但数据可能无法在稍后的某些周期内读出。此外,AlmostFull阈值是在RDClk域中运行的写入侧阈值,SnkFFEmpty和SnkFFAlmostEmpty是在SnkFFClk域中运行的读取指示符。这两个独立时钟域中的逻辑以不同方式报告接收器FIFO的状态。因此,可以同时断言Almost Empty和Almost Full条件。
在处理并将其传递到读(FIFO)接口之前,Sink Core必须接收完整的数据突发。如果将Almost Full阈值设置为小于接收到的数据突发(加上处理开销加上~24个信用),则可以实现SnkFFAlmostFull状态,这可能会影响SPI-4.2数据传输,从而影响整个带宽。如果接收FIFO阈值不大于数据突发,则发送到Sink核心的部分突发可能在核心中停止而不被处理,导致SnkFFAlmostEmpty_n和SnkFFEmpty_n的无限断言。
防止异常行为的建议
从SPI-4.2 v8.2内核开始,Sink内核具有读模式选项。此选项允许您选择“Partial Burst”或“Full Burst”。 “Full Burst”读取模式与先前版本兼容,在此版本中,Sink核心不会处理数据,直到接收器核心接收到完整突发。相反,“部分突发”读取模式允许接收器核心在数据到达时处理数据,而无需等待突发结束。使用“部分突发”读取模式可以最大限度地减少进入FIFO溢出和Sink内核锁定状态的可能性。
运行SnkFFClk与RDClk相对成比例(即,避免读取数据的速度超过它们的速度)。 SPI-4.2内核不需要RDClk和SnkFFClk成比例;但是,当SnkFFClk比RDClk相对快时,读取接口很可能是空的,周期性地导致SnkFFEmpty和SnkFFAlmostEmpty断言。
将几乎完全阈值设置得足够大,以接收完整的突发加上24个额外信用或限制突发的大小,以便Sink FIFO可以接收完整的突发,而不会超过几乎满的阈值电平。 FIFO的有效深度由SnkAFThresholdAssert设置决定。 SnkAFThreshold级别基于FIFO的空白空间。因此,接近508的SnkAFThresholdAssert值被认为是非常浅的FIFO。
必须在Tx器件上将大数据包(巨型帧)分段为较小的突发。突发必须足够小,以适应接收器FIFO,FIFO中有24个信用额头的空间。
没有回复内容