FlexNoC NIU 的六步事务处理
沿一条请求路径,理解事务为什么被打包、切分与对齐,以及响应如何恢复原来的语义。
先把 socket 请求归一化为 generic transaction,再按目标能力切分和对齐。响应侧恢复数据与状态;内部切分通常对 socket 隐藏。
本文目录 / CONTENTS
01请求路径与基本概念
阅读范围与来源标记
本文沿请求路径说明六步处理。每一步都回答三个问题:在哪里发生,什么条件触发,地址、长度或数据表示如何变化。原文事实、推导和教学例子分别标记。
本章主线是 INCR / WRAP transaction。FIXED、2D、exclusive / atomic 等特殊 transaction 受额外限制,不能机械套用本文的通用 split 规则。[p.16, 28–34]
原文在 Step 6 之后还有 Step 7 “Burst splitting or SRMD→MRMD conversion”(p.22)。本文以 Step 1–6 为主线:APB、AHB、MRMD OCP,或不支持当前 burst type 的 target 仍可能继续执行 Step 7,因此 Step 6 不是所有 target protocol 的绝对终点。
核心结论(据下文归纳)
- 绝大多数正常 transaction 在 Step 1–3 不变,直接 1:1 映射到 generic interface。Step 4 仍会对每个 transaction 做 address decode,通常结果是 1 个 target、无切分。
- Step 4 是 target 相关切分的核心:每个 remainder 都必须重新进入 Step 4,而不是只检查一次。
- Step 5 只对 WRAP 且 target 数据宽度大于 initiator 的情况做起始地址对齐;Step 6 决定 socket 的 word 编码与 write byte enable。
- split 通常是 NIU 内部行为:response 侧做 reassemble / aggregate,socket 看到的仍是原 transaction。reassembly(拼数据)与 reorder(排顺序)是两件事。
六步处理总览
六步按发生位置分为三段:specific NIU 的步骤通常只适用于部分 protocol;generic NIU 的步骤面向所有 protocol。多个适用步骤按顺序发生。
Narrow burst packing
ASIZE 小于 initiator word 的 multi-beat burst,整理为 precise byte range 与按 word 组织的数据。SIZE / LEN 不再原样传递。
Splitting into precise bursts
把第一个 request phase 无法确定长度的 imprecise burst,切成长度已承诺的 precise fragments。
MRMD → SRMD
保留第一个 request phase,丢弃后续 request phase;全部 data word 保留。
Address decode + target-based split
选中 target,并按 maxWrap、burst_aligned、minInterleaveSize(read)、crossBoundary、maximum burst 递归切分;remainder 重入 Step 4。
Wrapping burst alignment
target 数据宽度大于 initiator 时,把 WRAP 的起始地址对齐到 target word。
Word alignment
生成 socket 能表达的 word 表示;write 用 byte enable 屏蔽无效 byte。AXI 可保留 unaligned start。
transaction 经 NoC 后,请求内容通常与 Step 4 输出相同。security firewall 或 power disconnect unit 可以阻止 transaction 到达 target,但 fabric 本身不再做本章所述的 burst 变换。[p.21]
每一步最关心哪种“宽度”
| Step | 主要宽度输入 | 宽度如何影响结果 |
|---|---|---|
| 1 | Initiator socket word width | ASIZE < word width 才是 narrow;packing 按 initiator word 边界组织数据。 |
| 2 | Initiator word width | rdSplit / wrSplit 以 AHB word 为单位;read prefetch 与 write padding 也以 word 计。 |
| 3 | Initiator word width | 决定 MRMD 多个 request / data phase 合成的 byte length。 |
| 4 | Target word width + target maximum bytes | 判断 transaction 实际占用多少 target word;unaligned transaction 可能因占用额外 target word 而 split。 |
| 5 | Initiator width 与 target width 的比较 | 仅在 target word 比 initiator word 更宽时,对 WRAP 做起始地址 realignment。 |
| 6 | Target socket word width | 决定 start alignment、last-transfer rounding 与 byte-enable mask。 |
四个基本概念
Narrow 不是普通 width conversion
narrow 指同一个 initiator interface 上,单个 transfer 的 ASIZE 小于该 interface 的 word width(例如 32-bit 接口上的 1-B beat)。它不是“32-bit initiator 接 64-bit target”这种端到端 datapath 宽度转换:前者在 Step 1 处理,后者主要在 Step 4–6 暴露影响。[pp.10–11, 16–17]
Precise 与 imprecise
- Precise burst:看完第一个 request phase(以及已发生的 Step 1)就能确定 transaction 的最终 byte range / transfer count。
- Imprecise burst:第一个 request phase 不能承诺最终长度;后续可能提前结束,或 protocol 本身逐步给出长度。
AHB 非 exclusive 的 undefined-length INCR、useEarlyBurstTermination = True 时的 AHB burst,以及 burstprecise = 0 的多-word OCP burst,属于 imprecise。[p.17]
MRMD 与 SRMD
- MRMD(Multiple Request Multiple Data):burst 内每个 data word 都有对应 request phase。
- SRMD(Single Request Multiple Data):一个 request 描述整个 burst,后接多个 data word。
FlexNoC generic interface 原生是 precise、byte-oriented、SRMD(p.10);AHB,以及 burstsinglereq = 0 的 OCP,需要在 specific initiator NIU 归一化。[pp.10, 18, 186, 189, 193]
Length、beats 与 occupied target words 不是同一个量
- Length:有效 byte range。
- beats:某个 protocol interface 上的 transfer 次数。
- occupied target words:该 byte range 覆盖的 target word 数。
同一个 128-B transaction,若从 target word 中间开始,可能占 5 个 32-B target word,而不是 4 个。这正是 Step 4E 的关键(见 Step 4E)。[pp.19–20]
02发起端:归一化请求
Step 1 · 打包 narrow burst
把 socket 上多-beat 的 narrow transaction 转成 generic interface 可统一处理的 precise byte range 与按 word 组织的数据,而不是把 narrow burst 原样送到 target。
发生位置
依据:pp.16–17,“Step 1: Narrow burst packing”。
适用条件
| Protocol | AHB、AXI |
| Narrow 判定 | ASIZE < initiator socket word width |
| Burst | 主要讨论 multi-beat INCR。splitNonModifiableNarrow 对 WRAP 没有影响(原文 NOTE)。 |
| Read / Write | 均可;write data 同时携带有效 byte 信息。 |
| Precise / imprecise | 通常 packing;imprecise 且 non-cacheable 等例外时,按 beat 拆成 precise request。 |
| 前置能力 | minNarrowBurstSize ≠ None。否则 narrow multi-beat 不受支持:RTL 仿真可能 assertion,硬件行为不可预测。 |
依据:pp.16–17;AHB / AXI 的 minNarrowBurstSize 说明(pp.105, 127, 135–136)。
关键配置
| 参数 | 配置层级 | 控制内容 | 取值 / 触发 |
|---|---|---|---|
minNarrowBurstSize | Specification → Interface → NIU → conversion | 允许的最小 narrow size(原文以 HSIZE 表述;AHB、AXI 共用) | None:禁用 narrow multi-beat(single-beat partial access 仍支持);非 None:支持从该最小 size 起的 narrow multi-beat |
forceCacheable | 同上,AHB 专用 | 强制按 cacheable 规则处理 AHB transaction,影响 narrow / imprecise 的拆分方式 | True:忽略 HPROT 的 cacheable 区分;False:使用 HPROT[3] |
splitNonModifiableNarrow | 同上,AXI 专用 | 把 non-modifiable narrow INCR 拆成单 beat,避免 target 读 word 取整 | True 且 AxCACHE[1] = 0、AxLEN > 0、2^AxSIZE < initiator word bytes 时触发;AxSIZE 是字节数的 log₂ 编码,不影响 WRAP |
forceSplitNarrow | 同上,AXI 专用 | 强制 narrow burst 拆成 single-word transaction;原文将其与 data placeholder 上的 word ECC 关联 | True(ECC 支持所需) |
Step 1 的概要行把 minNarrowBurstSize 与 forceCacheable 并列,但 protocol-specific 章节只为 AHB 定义 forceCacheable。本文不把它套到 AXI。[pp.16, 100–105, 127, 135–136]
转换前后原文例子
| 字段 | 转换前:socket | 转换后:Step 1:generic-facing |
|---|---|---|
| Address | 0x1 | 0x1 |
| Transfer size | 1 B per beat | precise byte range;socket SIZE 不再原样传递 |
| Beat count / length | 8 beats | Length = 8 B |
| Burst type | INCR | INCR |
| Request count | 一个 AHB burst,含多个 AHB address phase | 通常 1 个 precise generic transaction |
| Data words | 8 个 narrow beat | 覆盖 3 个 4-B generic word |
| Target | 尚未 decode | 尚未 decode |
| Splitting | 无 | 本例无;例外条件可按 beat split |
依据:p.17,Step 1 example(32-bit AHB,cacheable / bufferable,ADDR = 0x1,8 beats,每 beat 1 B)。
可视化:8 × 1-B 如何覆盖三个 32-bit word 容器教学展开
有效 payload 为 8 B(0x1–0x8),覆盖 3 个 word 容器(0x0、0x4、0x8)。packing 不会把有效 byte 数变成 12 B:0x0 与 0x9–0xB 不是原 transaction 的有效 byte。
依据:原文只给出 start、length 与“三个 data words”,未逐 bit 展示 mask;本图的掩码展开为推导。[pp.10, 17]
数值例子
展开数值过程
输入(原文例子)
protocol = AHB, 32-bit(word = 4 B)
ADDR = 0x1, SIZE = 1 B, LEN = 8 beats
有效范围 = 0x1 .. 0x8(8 B)
Step 1 之后
generic Addr = 0x1
generic Length = 8 B
覆盖的 word = @0x0, @0x4, @0x8
fragment 数 = 1(本 cacheable / bufferable 例子)
计算(推导)
word 数 = floor(0x8 / 4) − floor(0x1 / 4) + 1 = 2 − 0 + 1 = 3generic interface 用 byte address + byte length 表达有效范围;word 容器数由首尾有效 byte 所在 word 的索引差加 1 决定。推导
保持原状的条件
ASIZE == initiator word width:不是 narrow,Step 1 bypass。- single-beat partial access 不属于这里的 multi-beat packing:即使
minNarrowBurstSize = None,原文仍说明 single-beat partial access 可保持支持。[pp.105, 135] - AXI non-modifiable narrow 且
splitNonModifiableNarrow = True:不走普通 packing 路径,而按 beat 拆分。[p.135]
设计意义
它把 AHB / AXI 的 narrow 语义归一化为 generic interface 的 precise byte 语义,使后续的 decode、boundary、target capability 与 response processing 不必理解每种 socket 的 narrow 编码。它不是普通 datapath width conversion;真正的 initiator / target 宽度差异在 Step 4–6 才参与决策。
Step 2 · 形成 precise burst
把“第一个 request phase 尚不知道最终长度”的 imprecise burst 切成长度已承诺的 precise fragments,后续 generic NIU 才能安全地 decode、分配 context、packetize 并接收 response。
发生位置
依据:p.17,“Step 2: Splitting into precise bursts”。
适用条件
| Protocol / 类型 | 触发条件 | 结果 |
|---|---|---|
| AHB | non-exclusive undefined-length INCR | 以 rdSplit / wrSplit 为上限形成 precise fragments |
| AHB | 任意 defined-length burst,且 useEarlyBurstTermination = True | 因可能提前终止而按 imprecise 路径处理 |
| OCP | MBurstLength > 1 且 burstprecise = 0 | 按 2-word fragment 拆分,最后可剩 1 个 word。原文例子:4 个 word、MBurstLength = 3,3,3,1 → 两个 2-word fragment。 |
| Read | cacheable AHB INCR | 允许 prefetch 到 rdSplit 边界,未请求的数据被丢弃。narrow INCR 为例外,按两拍一组拆分。 |
| Write | cacheable AHB INCR | 不足 wrSplit 的尾部以 BE = 0 padding,不写入无效 byte |
| Non-cacheable | 依 AHB NIU 参数 | 可按 word 或 single beat 拆分;non-cacheable 事务不做 prefetch |
依据:pp.17, 25, 101–105, 193。
关键配置
| 参数 | 层级 | 控制内容 | 取值 / 条件 |
|---|---|---|---|
useEarlyBurstTermination | Specification → Interface → NIU → conversion | AHB defined-length burst 是否允许提前终止;undefined INCR 本来就可随时结束 | Boolean(只对 defined-length 生效) |
forceCacheable | 同上 | 是否把所有 AHB transaction 按 cacheable 路径处理 | Boolean |
rdSplit | Architecture → Datapath NIU → NIU | cacheable non-narrow AHB INCR read 的 split 粒度(word 数) | 1, 2, 4, 8, 16, 32 words |
wrSplit | 同上 | cacheable non-narrow AHB INCR write 的 split / padding 粒度(word 数) | 1, 2, 4, 8, 16, 32 words |
burstprecise | OCP protocol Burst 参数 | OCP burst length 是否 precise | 0 触发 imprecise split;target 侧 OCP burst 始终 precise |
转换前后地址 0x100 为教学设定
数值来自原文(rdSplit = 4,32-bit AHB,实际发出 5 个 word);起始地址 0x100 为教学设定。
| 字段 | 转换前 | 转换后:Step 2 |
|---|---|---|
| Address | 0x100 | F0 = 0x100;F1 = 0x110 |
| Known length at first phase | 未知 | 每个 fragment = 4 words = 16 B |
| Requested words | 5 | 仍只有 W0–W4 属于 initiator request |
| Target-fetched words | 尚未确定 | 8 个 word(F0 的 4 个 + F1 的 4 个) |
| Returned to initiator | 5 个 word | 5 个 word;多取的 3 个 word 由 NIU 丢弃,不暴露为额外 AHB transfer |
| Request count | 1 个 imprecise burst stream | 2 个 precise generic request |
可视化:precise / imprecise 与 read prefetch
F0 = W0–W3,F1 = W4–W7
原文:rdSplit = 4 时,5-word cacheable INCR read 被拆成两个 4-word transaction,共取回 8 个 word。[p.17]
数值例子
展开数值过程
输入
protocol = AHB, 32-bit(word = 4 B)
ADDR = 0x100
HBURST = INCR(undefined length)
actual = 5 words(W0–W4)
rdSplit = 4 words
Fragment 0
ADDR = 0x100
Length = 16 B(0x100..0x10F)
Fragment 1
ADDR = 0x110
Length = 16 B(0x110..0x11F)
requested = 第一个 word(0x110..0x113)
prefetched = 其余 3 个 word,响应被丢弃
字节统计
requested = 5 × 4 = 20 B
prefetched = 8 × 4 = 32 B
returned = 20 B依据:原文直接给出“5 words → 两个 4-word transaction,共 8 words”;AHB 章节补充说明多余 prefetch 数据被丢弃。[pp.17, 101]
写入的对称情况不是“读回来再丢”:若 5-word write 使用 wrSplit = 4,F1 的后 3 个 word 以 byte enable 0 padding,target-facing 表示占 4 个 word,但只有第一个 word 有效。推导依据 pp.17, 102, 105。
保持原状的条件
- AHB SINGLE、INCR4/8/16、WRAP4/8/16,且
useEarlyBurstTermination = False:长度从第一个 phase 已知,通常 bypass。 - OCP
burstprecise = 1,或单-word transaction:bypass。 - AXI burst 本身是 precise,不进入 Step 2。
设计意义
generic NIU 必须在发出 request packet 时就知道 byte range,才能做 address decode、split、buffer / context 记账。Step 2 用有限的 precise window 隔离了 AHB / OCP 的“长度以后才知道”问题;代价是 read 可能 prefetch,write 可能以 BE = 0 padding。
Step 3 · MRMD 转为 SRMD
把“每个 data word 都带 request phase”的 socket protocol 归一化为 generic interface 的“一个 request + 多个 data word”。
发生位置
依据:p.18,“Step 3: MRMD to SRMD conversion”。
适用条件
- AHB 多-word transaction,且在 Step 1 / 2 之后仍是 burst。
- OCP 且静态
burstsinglereq = 0(MRMD),Step 1 / 2 之后仍是多-word burst。 - read 与 write 都涉及 request 表示:write data word 保留;read data 仍按原 transaction 返回。
- 若 Step 1 / 2 已把 transaction 化为 single-word fragment,则没有多余的 request phase 可丢,Step 3 实质 bypass。
关键配置
| Item | 路径 | 含义 |
|---|---|---|
burstsinglereq_tie | OCP protocol configuration | 0 = MRMD,1 = SRMD;原文说明该信号只支持 tie-off,不作为动态 socket 信号出现 |
| FlexNoC 转换参数 | 不适用 | Step 3 没有单独开关,是 generic SRMD 契约要求的 protocol 转换 |
依据:pp.18, 186, 189, 193。
转换前后原文例子
| 字段 | 转换前:32-bit AHB INCR4 | 转换后:Step 3 |
|---|---|---|
| Request phases | 4 | 1 |
| First address | A0 | A0 |
| Later addresses | A0+4、A0+8、A0+12 | 不再作为独立 generic request phase |
| Length | 4 × 4 B | 16 B |
| Data words | D0、D1、D2、D3 | D0、D1、D2、D3,全部保留 |
| Splitting | 无 | 无;这是 representation conversion |
可视化:MRMD 与 SRMD
“later request phases are dropped”只表示它们不再被编码为 generic request;不表示后续 data 或有效地址范围被丢弃。[p.18]
数值例子
展开数值过程
输入(原文例子)
AHB word width = 4 B
HBURST = INCR4
ADDR = 0x200
phases = 0x200, 0x204, 0x208, 0x20C
输出(generic)
Addr = 0x200
Length = 4 × 4 B = 16 B
requests = 1
data words = 4依据:p.18。原文例子:32-bit AHB 无 early burst termination 时,INCR4 结果为单个 request phase,地址为首拍地址,长度 16 B。
保持原状的条件
- AXI burst 已经是单地址 request + 多个 data / response beat,Step 3 bypass。
- OCP
burstsinglereq = 1已是 SRMD,bypass。 - single-word fragment 没有后续 request phase,bypass。
设计意义
SRMD 是 protocol-independent 的 transaction 表示。把 MRMD 的差异收敛在 specific NIU 中之后,Step 4 只需处理一个 byte range,不必理解 AHB 的 NONSEQ / SEQ 或 OCP 的多 request framing。
03Step 4:按目标能力切分
Step 4 · 地址译码与目标相关切分
前三步统一请求表示。Step 4 选择 target,并检查目标能够接受的地址范围、burst 类型与长度。条件不满足时,NIU 将请求切成 fragment。
每个 fragment 都要满足 mapping、目标边界、burst 能力、读响应交织粒度和 target word 占用量的限制。切出的 fragment 或 remainder 按各子规则重新检查。
发生位置与判断顺序
依据:pp.18–20,“Step 4: Address decoding and target-based splitting”。原文说明硬件可以并行实现这些判断以缩短 critical path,但列出的顺序代表概念优先级。
适用条件
- 所有 transaction 都经过 address decode;未映射的地址返回 DEC 错误。
- INCR / WRAP 使用本节完整流程;read 与 write 都受 decode、boundary 与 maximum burst 限制。
minInterleaveSize子规则(4C)只针对 read burst。- FIXED、2D、exclusive / locked 等特殊类型不能自由 split;非法 split 会生成 in-band error。[pp.18–19, 28–34, 40–41]
关键配置
| 参数 / 输入 | 配置层级 | 控制内容 |
|---|---|---|
| Address map / mapping | Specification → Mappings | target 选择、mapping size、enclosed mapping;address modifier(如 address space / mode)参与 decode |
maxWrap | Specification → Interface → NIU → generic → Burst | target 可生成 / 接受的最大 WRAP 字节数;设为 None 的用法见 Step 4A |
useBurstAlign | 同上 | 为 True 时,INCR burst 的地址按其长度(2 的幂)对齐 |
OCP burst_aligned | OCP protocol Burst 参数组 | OCP target 是否只接受自然对齐的 INCR burst |
minInterleaveSize | Specification → Interface → NIU → generic → Ordering | read response 交织粒度:0 不交织;wData/8 为 word(默认);或 wData/8 的更大 2 的幂 |
crossBoundary | Specification → Interface → NIU → generic → Burst | burst 不得跨越的 2 的幂字节边界 |
wLen1 | 同上 | 最大 transfer size = 2^wLen1 字节(p.18 的概要行写作 wLen,正文与参数定义使用 wLen1) |
| Per initiator-target split limit | Architecture → Datapath NIU → Splitting | 可进一步压低某个 initiator–target pair 的 burst 字节上限 |
| Reorder read-data buffer limit | Architecture → Datapath NIU → NIU | 配有 reorder buffer 时,read fragment 不能超过相关 read data buffer 的容量 |
依据:pp.18–20, 47–52, 62–63, 69。p.19 使用 nBytePerReadDataBuffer,p.63 的 reorder buffer 段落使用 nBytePerReadBuffer(参数定义见 p.69)。原文未说明两者是否为 alias,本文保留两种拼写。
转换前后(通用)
| 字段 | Before Step 4 | 转换后:Step 4 |
|---|---|---|
| Address | global generic address | 每个 fragment 的 address;target NIU 之后还会生成 local target address |
| Length | 一个 precise byte length | 1..N 个 fragment 长度;总有效 byte range 保持一致(非法 / 错误路径除外) |
| Burst | INCR / WRAP | 可保持;WRAP 也可能先转为两个 INCR fragment |
| Target | 未 decode | 每个 fragment 有确定的 target mapping / route;跨 mapping 时可落到不同 target |
| Request count | 1 | 1..N |
| Data | 一个 logical transaction | 按 fragment range 分配;write BE 与 read reassembly 保持原有效 byte 语义 |
| Re-entry | 不适用 | remainder 或两侧 fragment 按各子规则重新进入 Step 4 |
决策流:Step 4 的判断顺序
未映射 → 标记 ERR(DEC);访问类型不符 → ERR(UNS)
是 → 两段 INCR fragment,各自重入 Step 4
是 → 对齐的第一段 + remainder,重入 Step 4
minInterleaveSize > wData/8,且 size 超过粒度、start 未对齐?是 → 两段 INCR;第一段终点按 INCR / WRAP 的子规则确定(余下部分不再因 4C 切分)
是 → 到边界的第一段 + remainder,重入 Step 4
是 → 能放入的前缀 + remainder,重入 Step 4
依据:pp.18–20(五项子规则的顺序与重入规则);decode 错误代码见 pp.38–41。4C 的条件为依原文 read 子规则整理的判断表述。
Step 4A – maxWrap
为什么需要
WRAP burst 的地址会在 wrap window 末端回到 base。若 target 不支持这么大的 WRAP,FlexNoC 先把它拆成两个线性的 INCR range,使 target 不必理解原始的大 WRAP。[p.18]
可视化
原始访问顺序(WRAP):0x04 → … → 0x3F → 0x00 → … → 0x03。拆分后两段都是 INCR,且都重新执行 Step 4(它们仍可能遇到 mapping boundary、crossBoundary、burst alignment 或 maximum burst 限制)。[p.18]
转换前后
| 字段 | 转换前 | Fragment 0 | Fragment 1 |
|---|---|---|---|
| Burst | WRAP | INCR | INCR |
| Start | 0x04 | 0x04 | 0x00 |
| Length | 64 B | 60 B | 4 B |
| Address coverage | 0x04..0x3F,然后 0x00..0x03 | 0x04..0x3F | 0x00..0x03 |
| Re-enter Step 4 | – | yes | yes |
依据:p.18 原文例子(64-B WRAP 从 0x4 开始,target maxWrap = 32 → INCR 0x4 + 60 B,再 INCR 0x0 + 4 B)。
不切分的条件
- INCR transaction:不适用。
- WRAP size ≤ target maxWrap:不因 4A 切分。
- start 已按整个 WRAP size 对齐:原文把这种情况视为 INCR,不属于本规则描述的“两段 wrap”。[p.18]
maxWrap 的 None 用法
- 把 target 侧的
maxWrap设为 None 时,initiator NIU 把发往该 target 的 wrapping burst 转为 INCR fragment;实际长度由原始 WRAP 范围与后续 Step 4 约束决定。原文 TIP 建议按系统 cache line 大小设置maxWrap(通常 64 或 128 B),这不是 None 情形的固定切分长度。 - IMPORTANT:initiator 侧的
maxWrap不得设为 None,若对应 IP 可能发出 WRAP。 - target 侧
maxWrap不得大于其所连接 initiator 的最大maxWrap设置。
依据:maxWrap 参数说明(pp.48–49)。
Step 4B – burst alignment
为什么需要
某些 OCP target 只接受“length 为 2 的幂,且 start address 对齐到该 length”的 INCR burst。任意 byte range 必须分解为这种自然对齐块。[p.18;OCP burst_aligned 见 p.190]
可视化
16 B 从 0x04 开始:第一轮(原文)得到 4 B + 12 B;12 B 的第二段(0x08 起)会再次被拆分。第二轮(推导)得到 8 B + 4 B,最终为 4 + 8 + 4。推导
数值例子与递归拆分
展开数值过程
输入:Addr = 0x04,Length = 16 B
16 B 对齐要求 start 的低 4 位为 0000
0x04 不满足(低 4 位为 0100)
第一轮(原文)
F0 = 0x04 + 4 B (4 为 2 的幂,0x04 对齐到 4)
R = 0x08 + 12 B → 重入 Step 4
第二轮(推导:对 R 再次应用同一规则)
F1 = 0x08 + 8 B (0x08 对齐到 8)
F2 = 0x10 + 4 B (0x10 对齐到 4)
最终:[0x04..0x07] [0x08..0x0F] [0x10..0x13] = 4 B + 8 B + 4 B依据:原文直接给出第一轮 4 B + 12 B,并明确第二个 fragment 会再次被本步骤拆分;第二轮为依同一规则的推导。[p.18]
转换前后
| 字段 | 转换前 | Final fragments |
|---|---|---|
| Address | 0x04 | 0x04、0x08、0x10 |
| Length | 16 B | 4 B、8 B、4 B |
| Burst | INCR | INCR × 3 |
| Request count | 1 | 3 |
| Re-entry | – | remainder 反复重入 Step 4 |
不切分的条件
若 Length 是 2 的幂且 Address % Length == 0,或 target 不要求 burst-aligned,则 4B 不改变 transaction。
Step 4C – minInterleaveSize
为什么需要
minInterleaveSize 描述 target 的 read response 交织粒度(以字节计)。它不是 target data word 宽度,也不是普通的 maximum burst size。当 target 的 minInterleaveSize 大于 wData/8,且 read burst 比该粒度更大、start 又未对齐时,initiator generic NIU 先把开头切到下一个 interleave 边界,避免一个 fragment 从粒度中间跨入下一个粒度。[pp.18–19, 51–52]
上述“切到下一个 interleave 边界”针对 INCR;WRAP 使用下文的单独规则。FlexNoC 5.5.0-1 参数定义把多-word interleave 支持限定在 AXI / ACE-Lite target NIU,因此本节 16-B datapath、64-B interleave 的教学例子假定 target 为 AXI / ACE-Lite。[pp.51–52]
可视化:16-B datapath,64-B interleave,读 0x30 + 96 B
教学例子(依 pp.18–19 的约束构造):target datapath 16 B,minInterleaveSize 64 B,read Addr = 0x30,Length = 96 B(0x30..0x8F)。F1 内部的 0x80 是粒度边界,但 4C 只切一次,因此 F1 不会再被 4C 切分。教学例子
数值例子
展开数值过程
target datapath = 16 B (wData/8)
target minInterleave = 64 B (> 16 B,满足 4C 条件)
read Addr = 0x30 (未对齐到 64 B)
read Length = 96 B (0x30..0x8F,大于 64 B)
F0 = 0x30..0x3F = 16 B (到下一个 0x40 边界为止)
F1 = 0x40..0x8F = 80 B (重入 Step 4,不再因 4C 切分)INCR 与 WRAP 的差异
- INCR:第一段从 initial address 到下一个
minInterleaveSize边界,其余为 remainder。 - WRAP:第一段从 initial address 到 wrapping burst address(即 wrap 发生处),其余按 wrapped 地址顺序处理。原文没有给出 WRAP 的数值例子,本文不虚构 fragment 长度公式。[pp.18–19]
转换前后
| 字段 | 转换前 | After 4C |
|---|---|---|
| Type | Read INCR | Read INCR fragment |
| Addr / Length | 0x30 / 96 B | 0x30 / 16 B;0x40 / 80 B |
| Target word | 16 B | 不变 |
| Interleave granularity | 64 B | 不变;不是 word 宽度 |
| Re-entry | – | F1 重入 Step 4,但不再因 4C 切分 |
不切分的条件
- write transaction:原文本小节只定义 read burst 的切分。
- size ≤
minInterleaveSize。 - start 已对齐
minInterleaveSize。 minInterleaveSize ≤ target word bytes:不满足“大于 datapath”的条件。
Step 4D – crossBoundary
为什么需要
保证每个 fragment 全部位于同一个合法的 protocol / mapping 段内。有效 boundary 取以下值中的最小者:target protocol boundary(AXI 为 4 KB,AHB 为 1 KB)、target generic crossBoundary、匹配 mapping 的大小、匹配 mapping 内最小 enclosed mapping 的大小。[p.19]
可视化
原文例子:AXI initiator 发起,AHB target。AXI 的 protocol boundary 为 4 KB,AHB target 的 boundary 为 1 KB;有效 boundary 取较小的 1 KB,所以在 0x400 处切分。F1 重新进入 Step 4。[p.19]
数值例子
展开数值过程
Input: Addr = 0x3F0, Length = 32 B, effective boundary = 0x400
0x3F0 + 32 B = 0x410,覆盖 0x3F0..0x40F
F0 = 0x3F0..0x3FF = 16 B
F1 = 0x400..0x40F = 16 B(重入 Step 4)crossBoundary 与 maximum burst length 不是同一个约束
| 配置 | 保证什么 | 不保证什么 |
|---|---|---|
crossBoundary = 64 B | 每个 fragment 都留在一个 64-B 对齐的窗口内 | fragment 不一定正好 64 B |
wLen1 = 6(最大 64 B) | 每个 fragment 的 length ≤ 64 B | fragment 不跨越 64-B 地址边界 |
降低 crossBoundary 会间接限制最大 fragment 尺寸,但“地址窗口约束”与“长度上限”不是同一个语义。[pp.20–21]
不切分的条件
若首字节与末字节落在同一个 effective boundary 对齐段内,4D 不切分。
Step 4E – target maximum burst size
为什么需要
target 的限制不仅是“有效 byte 不超过多少”,还包括“这些 byte 实际占用多少 target word”。起始地址不对齐时,N 个 byte 可能占用 ceil((offset + N) / target_word_bytes) 个 word,从而超过 target 在一个 burst 中能承载的 word 数。[pp.19–20]
Maximum 的来源与切分规则
- target mapping 的 maximum burst bytes 取以下限制的最小值(2 的幂):
2^(target wLen1);该 initiator–target pair 在Architecture → Datapath NIU → Splitting中的字节上限;配有 reorder buffer 时的 read data buffer 上限(nBytePerReadDataBuffer)。 - 超限时,第一个 fragment 保持原起点,大小不超过
2^wLen1字节,且其数据能放入2^wLen1 / (wData/8)个 target word;余下部分作为 remainder 重入 Step 4。
依据:pp.19–20, 50, 62–63。第 2 条中“能放入多少个 word”的限制,正是 Example 2 得到 112 B + 16 B 的依据。
可视化 1:Example 1 – 64-bit target,32-B maximum
原文例子:128 B 从 0x10 开始,目标为 64-bit 宽(8-B word,共 16 个 word);target 每个 burst 最多 32 B(4 个 word),因此恰好切成 4 个 fragment,起点分别为 0x10、0x30、0x50、0x70。[p.20]
可视化 2:Example 2 – 256-bit target,字节长度未超限,但占用的 word 超限
F0 = 0x10..0x7F(112 B,占 word0–word3);F1 = 0x80..0x8F(16 B,占 word4)。128 B 正好等于 target 的 maximum,但起点未对齐,占用了 5 个 32-B word,超过 4 个 word 的能力。[p.20]
展开数值过程
offset in first target word = 0x10 − 0x00 = 16 B
capacity through four words = 4 × 32 − 16 = 112 B (F0)
remaining = 128 − 112 = 16 B (F1)不切分的条件
若覆盖的 target word 数 × word 字节数不超过 target mapping 的 maximum burst bytes,4E 不切分。对齐的起始地址通常更容易满足,但仍要检查 length 上限。
综合数值例子
下文的 Case C 给出一次 crossBoundary 切分之后又被 maximum burst 连续切分的完整递归树。关键原则是:每个 remainder 都按规则重新进入 Step 4,而不是只检查一次。[pp.18–20]
什么时候 Step 4 基本 1:1 pass-through
- address decode 到唯一 target;
- transaction 不跨越 protocol、generic 或 mapping boundary;
- WRAP 在 target
maxWrap之内; - target 不要求额外的 burst alignment,或 transaction 已满足;
- read interleave 条件不触发;
- target-word occupancy 不超过 burst / data-buffer 限制。
设计意义
Step 4 把“initiator 发得出来”与“target 接得住”解耦:不同 protocol、不同 width、不同 address map、cache-line / DRAM-page boundary、QoS 仲裁粒度,都可以在 initiator generic NIU 转换为 target 可执行的 fragment。它也是 security 与可预测 decode 的边界:跨 mapping 的 request 不会沿用初始 mapping 的 security 属性去访问另一个 mapping。[pp.20–21]
04目标端:对齐与完整示例
Step 5 · 对齐 WRAP 起点
在 request 经 NoC 到达 target 之后,把 WRAP 的起始位置对齐到 target data word,解决 target 比 initiator 更宽时的 WRAP word framing 差异。
发生位置
依据:p.21;pp.73–75。Step 5 发生在 target generic NIU,不在 initiator 侧,也不在 fabric switch 中。
适用条件
| 条件 | 是否转换 |
|---|---|
| INCR | 否 |
| WRAP,且 target word ≤ initiator word | 否(原文 NOTE:仅在 target data word 比 initiator data word 宽时适用) |
| WRAP,且 target word > initiator word | 可能:起始地址对齐到 target wrapAlign(约束为 target word 宽度) |
| Read | request 对齐后,response data 需要反向对齐;需要 nRdWrapAligner 存储 |
| Write | write data 与对齐后的 request framing 保持一致(推导) |
依据:pp.21, 74–75, 81。
关键配置
| 参数 | 层级 | 含义 |
|---|---|---|
wrapAlign | Specification → Interface → NIU → generic → Burst | 所有 wrapping burst 边界的最小对齐(字节);取值 None 或 0–128。Step 5 原文拼写为 WrapAlign,且约束为 target word 宽度。 |
target wData | Specification → Interface → NIU → generic | target word 宽度;Step 5 的对齐粒度受其约束 |
nRdWrapAligner | Architecture → Datapath NIU → NIU | 可同时挂起的、未按 target word 对齐的 WRAP read 数(默认 1,取值 1–4);每个需要临时存一个 data word |
依据:pp.21, 48–49, 81。
若 target 的 maxWrap 不超过 target 数据宽度,target 把 initiator 的 WRAP 当作 INCR 处理,不需要 wrap aligner 硬件;若 maxWrap 超过 target 数据宽度,且连接的 initiator 数据宽度更小,则至少需要一个 wrap aligner。[maxWrap 参数说明,pp.48–49]
转换前后
| 字段 | Before Step 5 | 转换后:Step 5 |
|---|---|---|
| Burst | WRAP | WRAP |
| Logical byte set | 不变 | 不变 |
| Initial address | initiator 视角下的 WRAP 起点 | target 更宽时,对齐到 target wrapAlign |
| Data order | initiator word framing | target word framing;read response 之后再做逆对齐 |
| Fragment count | 不变 | 不变;Step 5 是对齐,不是 Step 4 的切分 |
可视化:32-bit initiator → 64-bit target 的 WRAP推导
推导例子:initiator word 4 B,WRAP4 总长 16 B,起点 0x0C;target word 8 B,wrapAlign = 8 B。原文确定了转换方向、target 更宽的条件、按 target word 对齐,以及 read data 需要临时存储与逆对齐;它没有给出逐 byte 的 RTL 重排。[pp.21, 74–75, 81]
数值例子教学例子
展开数值过程
Input to target generic NIU
initiator word = 4 B
target word = 8 B
WRAP length = 16 B
initial Addr = 0x0C
转换后:Step 5
target framing start = 0x08(8-B 对齐)
wrap window = 0x00..0x0F
fragment count = 不变依据:原文 Step 5 文本没有数值例子(见文末歧义表第 7 条)。
保持原状的条件
- INCR transaction。
- target word 宽度不大于 initiator word 宽度。
- WRAP start 已满足 target
wrapAlign。 - target
maxWrap不超过 target 数据宽度:WRAP 由 target 当作 INCR 处理,无需 wrap aligner(见上方提示)。 - Step 4 已因
maxWrap不足或为 None 而把 WRAP 转为 INCR fragment。
设计意义
只有 target 侧最终知道本地 target word framing 与 response 行为,因此 WRAP alignment 放在 transport 之后。推导若放在 initiator 侧,会过早绑定 target 的宽度,也不利于同一个 initiator 访问不同宽度的 target。
Step 6 · 对齐 target word
把 generic 的 byte-range transaction 转换为 target protocol 能表达的 word-aligned request,同时用 byte enable 保证“只有原有效 byte 被写入”。
发生位置
必须等到 target specific NIU:AXI 允许 unaligned start,而 OCP 等 protocol 可能要求 word-aligned start;同一个 generic byte range 的合法 socket 编码并不相同。[pp.21–22]
适用条件
| 方面 | AXI | OCP / word-aligned protocol |
|---|---|---|
| Start address | 可保留 unaligned start | 对齐(align down)到 target word 边界 |
| Multi-beat size | AMBA NIU 对多拍 transaction 使用 SIZE = word | 依 target protocol 的 word 表示 |
| Last transfer | 可能取整到完整 target word | 若 length 必须是 word 数,则取整 |
| Write validity | WSTRB / byte enable | MByteEn / MDataByteEn 等(支持时)屏蔽无效 byte |
| Read partial | target 可被要求读取所在的 enclosing word / sub-word | response 路径只恢复原 transaction 所需的语义 |
依据:pp.21–22, 26–27, 185, 200–201。
关键配置
Step 6 本身没有统一开关。行为来自 target protocol 与该 socket 的 byte-enable 能力,例如 OCP byteen / mdatabyteen、AHB useBe。若 target 不支持相应的 byte-enable 模式,specific NIU 可能进一步 split 或报错,这属于 protocol-specific 的后续处理。[pp.21–22, 27, 107–110, 200–201]
转换前后原文例子
原文例子:32-bit AXI initiator 发出 cacheable RD narrow burst,4 beats × 1 B,从 0x1 开始、结束于 0x4,目标为 32-bit AXI target。
| 字段 | Socket(narrow RD) | Target-facing:AXI target | Target-facing:OCP target(原文提及的替代情形) |
|---|---|---|---|
| Start address | 0x1 | 0x1(保持) | 0x0(改为 word 对齐) |
| Beats | 4 × 1 B | 2 × 4 B(SIZE = word) | 原文未展开 |
| End of burst | 0x4 | 取整到 0x7 | 原文未单列 |
| Write(若为 WR)的 BE | – | 0x5–0x7 的 BE 为 0 | 0x0 的 BE 为 0 |
依据:p.22,Step 6 原文例子。
可视化:word 对齐与 byte enable教学例子
32-bit 对齐 target,WR,Addr = 0x1,Length = 6 B(有效 byte 为 0x1–0x6)。
representation 扩大到 0x0–0x7(8-B container),但实际有效 byte 仍是 0x1–0x6(6 B)。灰色 x 为 BE = 0 的位置,不写入。BE[3:0] 的最高位对应该 word 中地址最高的 byte。
数值例子教学例子
展开数值过程
输入(generic transaction)
opcode = WR
Addr = 0x1
Length = 6 B
target word = 4 B
Target request word 0
Addr = 0x0
Data bytes = [x, B0, B1, B2]
BE[3:0] = 1110
Target request word 1
Addr = 0x4
Data bytes = [B3, B4, B5, x]
BE[3:0] = 0111推导:BE bit 0 对应该 word 的最低 byte 地址。原文规定了首尾取整规则与 write BE 保留有效 byte;本例是这些规则的直接数值展开。[pp.21–22, 26–27]
保持原状的条件
- target protocol 允许当前的 unaligned address,且 length / size 可直接表达:AXI 是原文给出的 start-address 例外。
- start 已 word 对齐,且 length 是完整的 target word 数。
- transaction 只占一个 target word,且 protocol 编码与 BE 已能直接表达:可能只改变编码,不扩大有效 byte 集合。
设计意义
- transaction representation 被对齐 / 取整:target 看到的是 word container。
- 实际有效 byte 被访问:write BE 决定哪些 byte 真正写入。
扩大 representation 不等于多写数据。若 target 不支持 BE,则要参考 target-specific 的 partial-access 规则,可能进一步 split 或报错,不能假设无效 byte 会自动安全。[pp.22, 26–27]
一个端到端例子
为什么不让一个 transaction 强行触发全部六步
- Step 2 / 3 针对 AHB / OCP initiator 的 imprecise / MRMD;AXI initiator 通常直接 bypass。
- Step 5 只处理 WRAP;Step 4 的 crossBoundary + maximum burst 更适合用 INCR 来说明。
- AXI 协议要求 burst 不跨越 4 KB 边界,原文 p.19 也把 AXI 的 protocol boundary 取为 4 KB。把 AXI burst 构造为跨 4 KB,属于非法输入,不能用来换取“全部触发”。
因此本例选择合法的 AXI narrow INCR write,触发 Step 1、Step 4 与 Step 6;Step 2、3、5 明确 bypass。教学例子
Configuration
| Initiator socket | AXI;data width 128 bit = 16 B;narrow support enabled |
| Input write | Addr = 0x34;AxSIZE = 2(每 beat 2² = 4 B);AxLEN + 1 = 20 beats;Burst = INCR;有效范围 0x34..0x83 = 80 B。假定 AxCACHE[1] = 1、forceSplitNarrow = False、所有 payload byte 的 WSTRB 有效,且其余 mapping / target 约束不追加切分。 |
| Target socket | OCP SRMD;data width 256 bit = 32 B;INCR 支持;write byte enable 支持;crossBoundary = 64 B;maximum burst = 64 B |
该 AXI burst 没有跨越 4 KB 边界,且每个 4-B beat 自身对齐,因此输入合法。
逐步可视化
规则依据分别来自 Step 1、Step 4D / 4E、Step 6 与 partial access / byte enable 章节;原文没有给出这一组合的数值例子。教学例子
流水表
| Stage | Address | Length / valid | Size / word | Burst | # fragments / requests | Data beats / words | 说明 |
|---|---|---|---|---|---|---|---|
| Socket input | 0x34 | 80 B | 4-B narrow beat on 16-B AXI | INCR | 1 | 20 beats | 合法的 AXI narrow burst |
| 转换后:Step 1 | 0x34 | 80 B | 16-B generic word 容器 | INCR | 1 | 跨 6 个 word | narrow 已打包;有效范围不变 |
| 转换后:Step 2 | 同上 | 同上 | 同上 | 同上 | 1 | 同上 | AXI 已 precise,bypass |
| 转换后:Step 3 | 同上 | 同上 | 同上 | 同上 | 1 | 同上 | AXI 已是单 request,bypass |
| 转换后:Step 4 | 0x34;0x40;0x80 | 12 B;64 B;4 B | 已考虑 target 能力 | INCR × 3 | 3 | 逻辑 fragment | 在 64-B 窗口处切分;max 64 B 也满足 |
| 转换后:Step 5 | 同上 | 同上 | 同上 | INCR × 3 | 3 | 同上 | 非 WRAP,bypass |
| 转换后:Step 6 | 0x20;0x40;0x80 | 32-B 容器;64 B;32-B 容器 | 32-B OCP word | INCR;MBurstLength = 1、2、1 | 3 | 1 + 2 + 1 = 4 | BE 保留 12 + 64 + 4 个有效 byte |
| Target socket | 同 Step 6 | 精确 80 个 byte enabled | 256-bit | 同上 | 3 | 4 | 没有多写 byte |
推导:Step 6 的 32-bit BE 掩码可写为 T0 @0x20:BE[31:0] = 0xFFF00000(0x34..0x3F);T1 @0x40:0xFFFFFFFF;T1 @0x60:0xFFFFFFFF;T2 @0x80:0x0000000F(0x80..0x83)。原文没有给出这一组合例子。[pp.16–22, 26–27]
三个典型场景
Case A – 普通 AXI INCR:大多数 transaction 不会被大改 教学例子
AXI64 initiator → AXI64 target:Addr = 0x100,8 beats × 8 B,Length = 64 B,INCR;target maximum burst ≥ 64 B,且无 mapping / boundary crossing。
结果:1 个 socket transaction → 1 个 target transaction。这对应原文 “most transactions are not altered during steps 1 to 3” 的正常路径;Step 4 仍执行 decode,只是结果为 1:1。[p.16]
Case B – 非对齐 WRAP + 宽度转换 教学例子
AXI32 initiator 发出 WRAP4:4-B beat,start = 0x0C,total = 16 B;target 为 OCP64。
target 顺序:word @0x08 → wrap → word @0x00。Step 5 做与 width 相关的 WRAP framing;Step 6 检查 target protocol 编码,但在这个例子里不再追加变化。[pp.21, 73–75]
Case C – crossBoundary + maximum burst 连续切分 教学例子
输入 INCR:Addr = 0x70,Length = 160 B(0x70..0x10F),crossBoundary = 128 B(边界 0x80、0x100),max burst = 64 B。
- Step 4D(第一次):F0 = 0x70 + 16 B(到 0x80);R0 = 0x80 + 144 B,重入。
- Step 4D(对 R0):F1 = 0x80 + 128 B(到 0x100);R1 = 0x100 + 16 B,重入。
- Step 4E(对 F1):F1a = 0x80 + 64 B;F1b = 0xC0 + 64 B。
Interpretation(推导):该数值组合是教学例子;递归行为、boundary 优先的概念顺序与 remainder 重入来自原文 Step 4。[pp.18–20]
05响应恢复与工程参考
切分后的响应恢复
总流程
依据:pp.42, 57, 62–63, 74–75, 206–207。
Split 对 initiator 是否可见
通常 split 是 NIU 内部行为:socket initiator 仍看到原 transaction 的 protocol-level completion / data stream,而不是 Step 4 的 fragment 列表。特例是 protocol 本身的逐 transfer response framing,或 early response policy;但不能把 packet / fragment 数直接当作 socket transaction 数。[pp.57, 61, 206–207]
Transaction ID / context 的作用
- initiator generic NIU 跟踪 pending transaction,以及 flow / sequence / route 的顺序关系。
- target generic NIU 为通过 request-processing 阶段的 transaction 分配 context,用于 response 的 header / context 查找。
- reorder buffer 在分配 buffer 时为 request 分配唯一的 sequence ID,并按 socket ordering 要求重新发出 response。[pp.62–63]
- data reassembly buffer 专门处理小于 initiator datapath word 的 read response fragment。
Not specified原文没有公开 Step 4 fragment 与原 transaction 关联所用的全部内部 RTL 字段名。因此本文只使用“transaction context / flow / sequence / route bookkeeping”,不发明私有标识符。[pp.56–57, 62–63, 73–75]
Read data 如何恢复
若 split fragment 小于 initiator wData,或 target 可以在更细的粒度上交织 response,initiator NIU 需要 reassembly buffer,把 response fragment 拼成 initiator word。buffer 数量由 nReassemblyBuffer 决定,分配策略由 reassemblyBufferAllocation 决定(None / Per transaction / Per OrderId);每个 pending transaction 最多一个 data reassembly buffer。[pp.57, 62]
WRAP 在 Step 5 realign 之后,target generic NIU 的 response 路径还要用临时存储做 read data 的逆对齐;nRdWrapAligner 限制可同时挂起的这类 read 数量。[pp.74–75, 81]
Write response 如何恢复
- 对没有 early response 的 SRMD write:若任一 split fragment 报错,原 socket write response 为 error;若各 fragment 的 error code 不同,采用最先收到的 error code。[p.42]
- target specific NIU 把一个 generic transaction 继续拆成 MRMD 时,会聚合 target 的 write status,在最后一个 response 到达后再向 generic NIU 发出 write response。[pp.22, 42]
- Early-responded write 是例外:socket 已经提前得到 completion,之后到达的 NoC / target error 不能再作为该 socket response 上报。[p.42]
Read error 如何聚合
read error status 以 initiator response word 为粒度聚合:若某个 request 或 fragment 报错,与之关联的 response word 都报告 error;同一个 initiator word 收到不同 error code 时,使用最先收到的 code。发生 error 时 read data 的值不保证。[p.42,“In-band error aggregation and reporting”]
Reassembly 与 reorder buffer 不要混为一谈
| 机制 | 主要问题 | 典型资源 |
|---|---|---|
| Response reassembly | fragment 小于 initiator word,需拼回完整 word / byte 顺序 | nReassemblyBuffer、reassemblyBufferAllocation |
| Reorder buffer | target 的 response 可能乱序,但 socket 要求按 protocol ordering 发回 | read / write buffer、unique sequence ID、nBytePerReadBuffer |
两者可能同时存在:一个解决“拼数据”,另一个解决“发出顺序”。[pp.57, 62–63]
六步处理速查
| Step | 典型 trigger | Address | Length | Burst type | # requests | Read / Write 差异 |
|---|---|---|---|---|---|---|
| 1 Narrow packing | ASIZE < initiator word | start 保持 | beats × ASIZE → byte length | 通常保持 | 通常 1;例外按 beat split | write 保留 BE;read 之后可能取整 |
| 2 Precise split | imprecise AHB / OCP | 各 fragment 地址依次后移(按 split 粒度) | 固定到 split 粒度 | 通常 INCR | 增加 | read prefetch;write BE = 0 padding |
| 3 MRMD → SRMD | AHB / OCP MRMD 多-word | first address 保持 | 汇总总 bytes | 保持 | request phase 减为 1 | data word 全部保留 |
| 4 Target split | decode / wrap / align / boundary / max | fragment 起点改变 | 分割 | WRAP 可转 INCR | 1 → N | minInterleaveSize 规则专指 read;其余多数读写相同 |
| 5 WRAP align | target 更宽 + WRAP | 对齐到 target word | 保持 | WRAP | 保持 | read 需要逆对齐 buffer;write data 同步旋转 |
| 6 Word align | target protocol 要求 | 可 align down | 可 round up | 依 target 编码 | 通常保持;后续 Step 7 可再变 | write 用 BE 屏蔽;read 可能扩大 target 侧的 read 表示 |
常见误解
| 误解 | 正确说法 |
|---|---|
| narrow packing 就是 initiator / target width conversion | 它先解决同一 initiator interface 上 ASIZE < word width 的 narrow 表示;target 宽度在 Step 4–6 才参与。 |
crossBoundary = 64 等价于 wLen1 = 6 | 前者限制 64-B 对齐的地址窗口;后者只限制 length ≤ 64 B。 |
| Step 6 round 到两个 word 就会多写 byte | write BE 可以让 container 外围的 byte 无效;representation 扩大不等于有效写入扩大。 |
| split 一次后就结束 | 多个子规则明确要求 remainder / fragment 重新进入 Step 4。 |
| 128-B request、target max 128 B,所以一定不 split | 若起始地址不对齐,可能占 5 个 target word,超过 4-word 能力。 |
minInterleaveSize 就是 target word width | 它是 response interleave 粒度,可以是 word、0,或 word 的更大 2 的幂倍数。 |
| split fragment 数就是 initiator 看到的 transaction 数 | NIU 在 response 路径上 reassemble / aggregate,通常对 socket 隐藏内部 fragmentation。 |
| Step 6 是所有 target 的最后一步 | 原文 p.22 还有 Step 7;burstless / MRMD / limited-burst target 可以继续转换。 |
文档歧义与未明确项
| # | 位置 | 原文现象 | 本文处理 |
|---|---|---|---|
| 1 | p.17 | Step 1 的说明写作 “Step 5: Word alignment”,但链接与标题指向 Step 6(p.21) | 使用 Step 6(与实际标题一致) |
| 2 | p.18 | Step 4 概要行写 wLen,正文与参数定义使用 wLen1 | 使用 wLen1 作为字节上限参数 |
| 3 | p.19 / p.63 / p.69 | nBytePerReadDataBuffer(p.19)与 nBytePerReadBuffer(p.63 使用,p.69 定义)拼写不同 | Not specified:原文未说明是否为 alias;两种拼写都保留并标注 |
| 4 | p.16 | forceCacheable 与 AHB / AXI 一并列在 Step 1 概要中,但 protocol-specific 参数只为 AHB 定义 | 只按 AHB 处理,不套到 AXI |
| 5 | p.21 / p.48 | Step 5 写作 WrapAlign,参数定义写作 wrapAlign | 使用 wrapAlign;引用 Step 5 原文时保留 WrapAlign |
| 6 | p.22 | Step 6 之后还有 Step 7(Burst splitting / SRMD → MRMD) | 报告范围以 Step 1–6 为主线,并在开头披露 Step 7 边界 |
| 7 | Step 5 | 原文没有 Step 5 的数值例子 | 32 → 64-bit WRAP 图标为 Interpretation,数值为教学例子 |
| 8 | Step 4 | 原文未公开 Step 4 fragment 与 parent transaction 的完整内部 context 字段名 | Not specified:不以 RTL 常识补造字段名 |
来源:Arteris《NIU Transaction Handling》,FlexNoC 5.5.0-1。文内页码指向该版本。本文按用户提供的工程教程整理;推导与教学例子均保留标记,不构成 RTL 或运行时证明。