片段(Fragment)
一、规范(Specification)
Fragment
包(Bundle)是利用多个小片段传输一个大集合的概念。例如:
一张利用
Stream[Fragment[Pixel]]
传输的尺寸为width*height的图片。一个接收来自控制器信号的无流控制协议的UART包可以在
Stream[Fragment[Bits]]
上传输一个AXI突发读模式可以被
Stream[Fragment[AxiReadResponse]]
承载
由Fragment
包定义的信号是:
信号 | 类型 | 驱动 | 描述 |
---|---|---|---|
fragment | T | Master | 当前传输的负载 |
last | Bool | Master | 当该片段是当前包的最后一个片段时则置高 |
可以发现根据规范和上述例子, Fragment
不会指明传输任务是如何被传输的(用户可以使用Stream, Flow或其他任何协议)。它只会增加足够的信息last
来告知当前传输是否为给定数据包的第一个, 最后一个还是中间的某一个。
注意:协议没有携带’first’比特是因为它可以通过执行’RegNextWhen(bus.last, bus.fire) init(True)’被生成在任何位置
二、函数(Functions)
对于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]] | 对每一个x 的包添加header 并且返回结果总线 |