本文作为SpinalHDL学习笔记第二十篇,介绍SpinalHDL Fragment相关API。
SpinalHDL学习笔记总纲链接如下:
目录:
1.规范
2.函数
1.规范
Fragment 包是通过使用多个“小”片段来传输“大”东西的概念。比如:
• 一张通过 Stream[Fragment[Pixel]] 传输尺寸为宽 * 高的图片
• 一个可以在 Flow[Fragment[Bits]] 上传输的、从没有流量控制的控制器里接收到的 UART 数据包
• 一个可以由 Stream[Fragment[AxiReadResponse]] 承载的 AXI 突发读
Fragment 包定义的信号是:
信号 | 类型 | 驱动 | 描述 |
---|---|---|---|
fragment | T | Master | 当前传输任务的“负载” |
last | Bool | Master | 当该片段是当前数据包的最后一个片段时为高 |
Fragment 概念并未指定传输任务如何传输(可以使用 Stream、 Flow或任何其他通信协议)。它仅添加足够的信息 (last) 来了解当前传输是给定数据包的第一个、最后一个还是中间的一个。
Note: 该协议没有携带’frst’ 位,因为它可以通过执行’RegNextWhen(bus.last, bus.fire) init(True)’ 被生成在任何位置。
2.函数
对于 Stream[Fragment[T]] 和 Flow[Fragment[T]] ,给出以下函数:
语法 | 返回类型 | 描述 |
x.first | Bool | l当前或下一个传输是/将是数据包的第一个片段时返回 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]] | 对每个数据包 x 添加 header并返回生成的总线 |