Fragment
规范
Fragment 包是通过使用多个“小”片段来传输“大”东西的概念。比如 :
- 一张通过 - Stream[Fragment[Pixel]]传输尺寸为 宽*高 的图片
- 一个可以在 - Flow[Fragment[Bits]]上传输的、从没有流量控制的控制器里接收到的 UART 数据包
- 一个可以由 - Stream[Fragment[AxiReadResponse]]承载的AXI突发读
Fragment 包定义的信号是:
| 信号 | 类型 | 驱动 | 描述 | 
|---|---|---|---|
| fragment | T | Master | 当前传输任务的“负载” | 
| last | Bool | Master | 当该片段是当前数据包的最后一个片段时为高 | 
正如您在本说明和先例中看到的, Fragment 概念并未指定传输任务如何传输(您可以使用 Stream、Flow 或任何其他通信协议)。它仅添加足够的信息(last) 来了解当前传输是给定数据包的第一个、最后一个还是中间的一个。
备注
该协议没有携带 'first' 位,因为它可以通过执行 'RegNextWhen(bus.last, bus.fire) init(True)' 被生成在任何位置
函数
对于 Stream[Fragment[T]] 和 Flow[Fragment[T]] ,给出以下函数:
| 语法 | 返回类型 | 描述 | 
|---|---|---|
| x.first | Bool | 当当前或下一个传输是/将是数据包的第一个片段时返回 True | 
| x.tail | Bool | 当当前或下一个传输不是数据包的第一个片段时返回 True | 
| x.isFirst | Bool | 当当前传输任务被提交并且为数据包的第一个片段时返回 True | 
| x.isTail | Bool | 当当前传输任务被提交并且不是数据包的第一个/最后一个片段时返回 True | 
| x.isLast | Bool | 当当前传输任务被提交并且为数据包的最后一个片段时返回 True | 
对于 Stream[Fragment[T]] ,以下函数也是可用的:
| 语法 | 返回类型 | 描述 | 
|---|---|---|
| x.insertHeader(header : T) | Stream[Fragment[T]] | 对每个数据包  |