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]] |
对每个数据包 |