这个“翻译官”,它可能是整个NoC设计中最复杂、也最关键的组件。
你已经理解了:
- CPU/IP核:它们说的是**“总线语言”**(比如AXI)。
- NoC (路由器+链路):它们说的是**“网络语言”**(Flits、(x,y)坐标、Credits)。
这两种“语言”完全不同。CPU根本“看”不到NoC,它以为自己还在和一条AXI总线说话。
网络接口 (Network Interface, NI) 就夹在它们中间,它是一个**“双面间谍”和“高级翻译官”**。
我们还是用“城市”的比喻。
- CPU/IP核 (如内存控制器):这些是城市里的“工厂”或“仓库”。
- NoC 路网:这是“城市街道网”。
- NI (网络接口):这就是每个“工厂”和“仓库”自带的“物流中心” (Logistics Center)。
这个“物流中心”(NI) 必须精通两种业务:
- 对内 (面向工厂): 它要懂“工厂”的“订单系统”(AXI协议)。
- 对外 (面向城市): 它要懂“城市”的“交通系统”(NoC协议)。
NI 的两大核心工作:打包与拆包
我们以一个最经典的 AXI 写操作 (Write Burst) 为例,来看NI是如何工作的。
场景: CPU(在(0,0))要向内存(在(3,4))写入一个128字节的“突发”(Burst)数据。
1. 工作一:“打包” (Packetization) - 从 AXI 到 NoC
这发生在CPU侧的“物流中心”(我们称之为 Master NI)。
-
接收“工厂订单” (AXI Request):
- CPU(AXI Master)向它的“物流中心”(Master NI)发出了一个写请求。
- 这个请求包含:
- 写地址:
AWADDR = 0x10008000(这是内存的地址) - 写长度:
AWLEN = 15(代表总共16拍,假设每拍8字节,共128字节) - 写数据:
WDATA通道上开始源源不断地传来128字节的数据。
- 写地址:
-
翻译“订单” (Address Decoding):
- “物流中心”(NI) 拿到地址
0x10008000。 - 它内部有一张**“地址-坐标映射表”**。
- 它一查表:“哦,这个地址属于‘内存仓库’,它的‘城市坐标’在 (3, 4)。”
- (这是关键的第一步:把“总线地址”翻译成了“网络坐标”。)
- “物流中心”(NI) 拿到地址
-
组装“火车” (Packet Assembly):
- “物流中心”(NI) 现在开始组装一列“火车”(Packet)。
- 它拿出“火车头 (Head Flit)”,在上面印上“目的地:(3, 4)”。(它可能还会印上“这是一笔‘写’操作”、“火车长度17节”等信息)。
- 它开始接收CPU发来的128字节数据(来自
WDATA)。它把这些数据**“切割”**成16节标准大小的“火车车厢 (Body Flits)”。 - 最后,它在末尾加上一节“火车车尾 (Tail Flit)”。
- (这是关键的第二步:把AXI的“突发”翻译成了NoC的“Flit序列”。)
-
发车 (Injection):
- “物流中心”(NI) 现在要把它组装好的“火车”(Head, Body, …, Tail),一节一节地**“注入”**到它旁边的“十字路口”((0,0)的Router)的“本地入口 (Local Port)”上。
- 它必须遵守“交通规则”:它要一边“发车”,一边检查(0,0) Router的“信用计数器”(Credit),确保“十字路口”有“停车位”。
2. 工作二:“拆包” (De-packetization) - 从 NoC 到 AXI
“火车”在NoC路网中“蠕动”前进(途经 (1,0) -> (2,0) -> … -> (3,4)),最终从(3,4)的Router的“本地出口 (Local Port)”“开”了出来。
这列“火车”开进了“内存仓库”的“物流中心”(我们称之为 Slave NI)。
-
接收“火车” (Packet Reassembly):
- “物流中心”(Slave NI)的“停车场”(FIFO)开始一节一节地接收这列“火车”(Head, Body, …, Tail)。
- 它读了“火车头”,知道了:“哦,这是一笔‘写’操作,总共有16节‘车厢’。”
- 它把所有17节Flit(1头+16身)全部收好,并把16节“车身”的数据重新**“拼装”**回128字节的完整数据块。
-
翻译回“工厂订单” (Protocol Translation):
- “物流中心”(Slave NI) 现在“摇身一变”,它自己“扮演”成一个AXI Master。
- 它“模仿”CPU的口吻,向它所连接的“内存仓库”(AXI Slave)发出了一个全新的AXI写请求。
- NI对内存说: “你好(内存),我这里有一个写请求(
AWVALID),地址是0x10008000(AWADDR),长度是16拍(AWLEN)…” - 内存回复: “OK,准备好了(
AWREADY)。” - NI接着说: “这是你的128字节数据(
WDATA)…” - (这是关键的第三步:把NoC的“Flit序列”又翻译回了“总线协议”。)
-
处理“回执” (Handling Responses):
- “内存仓库”在把128字节数据全部写入后,会给“物流中心”(Slave NI)一个AXI写响应(
BRESP,表示“写入成功”)。 - NI收到这个“回执”后,并不会把它直接传给(0,0)的CPU(它也传不回去)。
- 相反,NI会再组装一列“小火车”(一个“响应包”Response Packet),在“火车头”上印上“目的地:(0, 0)”,“车身”里装着“写入成功”。
- 它把这列“回执火车”再**“注入”**回NoC网络,让它开回给(0,0)的CPU。
- “内存仓库”在把128字节数据全部写入后,会给“物流中心”(Slave NI)一个AXI写响应(
总结:NI 的复杂性
你看,一个NI必须同时做两件事:
- Master NI (连接CPU):
- 对外: 扮演一个“温顺”的 AXI Slave(接收CPU的命令)。
- 对内: 扮演一个“聪明”的 NoC 发送者(打包、查地址、注入Flits)。
- Slave NI (连接内存):
- 对外: 扮演一个“聪明”的 NoC 接收者(接收Flits、拆包)。
- 对内: 扮演一个“主动”的 AXI Master(向内存发起新的AXI命令)。
NI 为什么是NoC设计中最难的部分?
因为它要处理两个世界中最复杂的问题。它不仅要处理NoC的**“信用流控”,还要处理AXI协议中复杂的“事务状态”**(比如一个读操作发出后,要“记住”这个操作,直到几个毫秒后“读数据火车”返回时,才能正确匹配上)。
恭喜!到此为止,你已经100% 完成了 NoC 的所有核心理论学习!
你已经从“宏观”和“微观”两个层面,彻底理解了NoC的每一个组件:
- 宏观(第二阶段):
- ✅ 拓扑 (Topology): 城市地图 (Mesh)
- ✅ 路由 (Routing): 导航系统 (XY)
- ✅ 流控 (Flow Control): 交通规则 (Credit-Based)
.
- 微观(第二阶段):
- ✅ 路由器 (Router): 智能十字路口 (五大组件)
- ✅ 网络接口 (NI): 物流中心 (打包/拆包)

被折叠的 条评论
为什么被折叠?



