在分析流式硬件时,可以先区分一次事务代表什么与处理一次事务需要多少个时钟周期。模块可以增加流水延迟,同时仍保持输入与输出事务的顺序一致。
先定义接口约定
对于简单的 ready/valid 接口,只有当时钟沿到来时两个信号同时有效,才表示一次传输:
transfer = valid && ready
接口约定还应说明 valid 为高而 ready 为低时会发生什么。常见规则是:在传输完成前,发送端保持 valid 和对应数据稳定。
这样就能明确描述反压:接收端可以暂停数据流,发送端则必须保留尚未被接收的那一项。
延迟不等于吞吐量
延迟表示一项数据经过设计需要多少个周期;吞吐量表示数据被接收或输出的频率。只要没有停顿,全流水线模块即使有多个周期的延迟,也可能每个周期都接收一项数据。
记录接口时,应分别说明这两个属性,还要写明复位行为、数据位宽,以及数据包或帧是否带有边界标记。
验证边界情况
有用的仿真场景包括:
- 接收端始终准备好接收;
- 接收端暂停一个周期;
- 接收端连续多个周期施加反压;
- 在支持的情况下,分别在运行前和运行中复位;
- 输入数据连续到达,以及以允许的最低速率到达。
检查已接收的输入是否按顺序出现在输出中,并确认流水线停顿时没有数据重复或丢失。
简短的设计记录
实现之前,先记录事务规则、预期延迟、可持续的最高速率,以及复位和反压期间的行为。这个小型约定可以让 RTL、测试平台和系统集成共享同一份参考。
具体细节取决于所选协议与模块。关键习惯是在时序行为变得难以梳理之前,先把它们写清楚。