diff --git "a/_posts/2024-10-10-\347\216\257\345\242\203\351\205\215\347\275\256.md" "b/_posts/2024-10-10-\347\216\257\345\242\203\351\205\215\347\275\256.md" index 33d5cc1..d0a771a 100644 --- "a/_posts/2024-10-10-\347\216\257\345\242\203\351\205\215\347\275\256.md" +++ "b/_posts/2024-10-10-\347\216\257\345\242\203\351\205\215\347\275\256.md" @@ -5,6 +5,8 @@ tags: [] img_path: --- 0️⃣ 一些基本的东西 +- [CHISEL框架1](https://github.com/light-ly/chisel-template) +- [CHISEL框架2,elaborator独立出来了适合写多个lab](https://github.com/alexfanqi/chisel-playground) - [wnlen/clash-for-linux: clash-for-linux (github.com)](https://github.com/wnlen/clash-for-linux) - [jekyll-compose的使用方法](https://github.com/jekyll/jekyll-compose) - [写作语法示例](https://pansong291.github.io/chirpy-demo-zhCN/posts/writing-syntax-example/) @@ -106,6 +108,7 @@ img_path: /assets/img/CALCM/CONNECT/ | 阿尔弗雷德 | 玛丽亚·安德斯 | 德国 | | 岛屿贸易 | 海伦·贝内特 | 英国 | | 意大利食品杂志 | 乔瓦尼·罗韦利 | 意大利 | + * 指定写代码的文件名 ```sass @import "colors/light-typography", diff --git "a/_posts/\345\215\217\350\256\256\347\261\273/2024-10-20-CHI.md" "b/_posts/\345\215\217\350\256\256\347\261\273/2024-10-20-CHI.md" new file mode 100644 index 0000000..f706310 --- /dev/null +++ "b/_posts/\345\215\217\350\256\256\347\261\273/2024-10-20-CHI.md" @@ -0,0 +1,10 @@ +--- +layout: post +title: AMBA CHI +date: 2024-10-20 21:55 +0800 +categories: [spec文档阅读, protocol] +tags: [] +img_path: /assets/img/chi/ +--- + + diff --git "a/_posts/\351\241\271\347\233\256\345\255\246\344\271\240/2024-10-21-Constellation.md" "b/_posts/\351\241\271\347\233\256\345\255\246\344\271\240/2024-10-21-Constellation.md" new file mode 100644 index 0000000..9ff341b --- /dev/null +++ "b/_posts/\351\241\271\347\233\256\345\255\246\344\271\240/2024-10-21-Constellation.md" @@ -0,0 +1,303 @@ +--- +layout: post +title: Constellation +date: 2024-10-21 22:19 +0800 +categories: [项目学习, 开源项目] +tags: [] +img_path: /assets/img/pj/ +--- + +[refrence — Constellation文档 ](https://constellation.readthedocs.io/en/latest/Configuration/Topologies.html#terminal-router-topologies) + +NoC 的物理规格本身分为五个部分:topology、Channels、ingresses、egresses、routerParams + +## 物理spec +### topology +`PhysicalTopology`是一个描述有向图的案例类,其中节点表示路由器,边表示单向通道。 + +```scala +trait PhysicalTopology { + // Number of nodes in this physical topology + val nNodes: Int + + /** Method that describes the particular topology represented by the concrete + * class. Returns true if the two nodes SRC and DST can be connected via a + * directed channel in this topology and false if they cannot. + * + * @param src source point + * @param dst destination point + */ + def topo(src: Int, dst: Int): Boolean //为1代表有向连接 + + /** Plotter from TopologyPlotters.scala. + * Helps construct diagram of a concrete topology. */ + val plotter: PhysicalTopologyPlotter +} +``` +{: file='constellation/src/main/scala/topology/topologies.scala'} + +- Terminal Router Topologies在原有路由基础上包装进一步拓扑,`TerminalRouter`拓扑必须与`TerminalRouting`路由关系包装器一起使用 + +![terminal_topology]({{ page.img_path }}terminal.png){: width="972" height="589" } + + + +- Hierarchical分层拓扑,`HierarchicalTopology`拓扑必须与`HierarchicalRouting`路由关系包装器一起使用 + +![Hierarchical]({{ page.img_path }}Hierarchical.png){: width="972" height="589" } + + +### Channels + +PhysicalTopology指向的每条edge都会调用函数来确定通道参数 + +```scala +case class UserChannelParams( + virtualChannelParams: Seq[UserVirtualChannelParams] = + Seq(UserVirtualChannelParams()), + channelGen: Parameters => ChannelOutwardNode => ChannelOutwardNode = + p => u => u, + crossingType: ClockCrossingType = NoCrossing,//Currently unsupported + useOutputQueues: Boolean = true, + srcSpeedup: Int = 1, + destSpeedup: Int = 1 +) { + val nVirtualChannels = virtualChannelParams.size +} + +case class UserVirtualChannelParams( + bufferSize: Int = 1 +) +``` +{: file='constellation/src/main/scala/channel/parameters.scala'} + +virtualChannelParams包含一个对象的列表,其中的每一个元素代表一个虚拟通道,并且该对象保存该虚拟通道的缓冲区条目数 + +channelGen仅用于指定在通道中添加额外的pipeline buffers + +srcSpeedup表示一个周期内可能进入通道的flits数量。当`srcSpeedup` > 1 时,发生器将有效增加通道的输入带宽。 + +destSpeedup表示一个循环中可能退出通道的 flits 数量。增加这个压力会给目的路由器的路由资源和交换机带来压力。 + +### Terminals + `UserIngressParams`和`UserEgressParams`案例类指定入口和出口终端的位置 + +还可以显示指定负载,Constellation 将自动生成宽度转换器以进一步分段或合并 flits。 +```scala +ingresses = Seq(UserIngressParams(0), payloadBits=128)), +egresses = Seq( UserEgressParams(1), payloadBits=128)), +routers = (i) => UserRouterParams(payloadBits=64), + +//可以指定其内部的payloadWidth,宽度需要是彼此的倍数 + routerParams = (i) => UserRouterParams(payloadWidth = + if (i == 1 or i == 2) 128 else 64), +) +``` + +![payload]({{ page.img_path }}payload.png){: width="972" height="589" } + +前提是终端有效负载宽度是路由器有效负载宽度的倍数或因子。谨慎使用有效负载宽度转换器。例如,每片 64 位的 3 片数据包,如果放大为每片 128 位的 2 片数据包,则将被缩小为每片 64 位的 4 片数据包 + +### Routers +`RouteComputer`对应RC阶段 + +`VirtualChannelAllocator`对应VA阶段 + +Flits 在SA阶段向`SwitchAllocator`请求访问路由器中的crossbar switch。该阶段还检查下一个虚拟通道是否有一个空的缓冲区槽来容纳该 flit。 + +A flit traverses(遍历) the crossbar switch in the ST stage. + +流量控制是基于信用的,离开`InputUnit` flit 将信用向后发送到其源路由器上的`OutputUnit` 。 + +--- + +>终端 Ingress 和 Egress 点视为`InputUnits`和`OutputUnits`的特殊instances +{: .prompt-tip } + +当启用`coupleSAVA`时,释放的虚拟通道将在同一周期立即可用。然而, `coupleSAVA`可以在高基数路由器上引入长组合路径 + +![coupleSAVA]({{ page.img_path }}coupleSAVA.png){: width="972" height="589" } + +[Virtual Channel Allocator请查阅](https://constellation.readthedocs.io/en/latest/Configuration/Routers.html) + +- `PIMMultiVCAllocator`为可分离分配器实现并行迭代匹配 + +- `ISLIPMultiVCAllocator`实现可分离分配器的 ISLIP 策略 + +- `RotatingSingleVCAllocator`在传入请求之间轮换 + +- `PrioritizingSingleVCAllocator`根据路由关系给出的优先级,将某些 VC 优先于其他 VC + + +## Flows Specification + +```scala + // (blocker, blockee) => bool + // If true, then blocker must be able to proceed when blockee is blocked + vNetBlocking: (Int, Int) => Boolean = (_, _) => true, + flows: Seq[FlowParams] = Nil, +``` +{: file='constellation/src/main/scala/NOC/Parameters.scala'} + +`NoCParams`的`flows`是`classes FlowParams`的一个列表,每个flowuniquely identifies its source ingress terminal, destination egress terminal, and the virtual subnetwork identifier. + + +Virtual subnetworks are used to delineate between different channels of a actual messaging protocol, and is necessary for avoiding protocol-deadlock.`vNetId`字段可用于指定flow的虚拟子网标识符 + +`vNetBlocking`功能指示哪些虚拟子网必须在某些其他虚拟子网被阻止时进行转发。如果`vNetBlocking(x, y) == true` ,则来自子网`x`的数据包必须继续转发,而子网`y`的数据包则停滞。 + + +## Routing Configuration + +```scala +abstract class RoutingRelation(topo: PhysicalTopology) { + // Child classes must implement these + def rel (srcC: ChannelRoutingInfo, + nxtC: ChannelRoutingInfo, + flow: FlowRoutingInfo): Boolean + + def isEscape (c: ChannelRoutingInfo, + vNetId: Int): Boolean = true + + def getNPrios (src: ChannelRoutingInfo): Int = 1 + + def getPrio (srcC: ChannelRoutingInfo, + nxtC: ChannelRoutingInfo, + flow: FlowRoutingInfo): Int = 0 +``` +{: file='constellation/src/main/scala/routing/RoutingRelations.scala'} + +ChannelRoutingInfo唯一标识 +```scala +case class ChannelRoutingInfo( + src: Int,//channel的source physical node,如果这是入口通道,则该值为-1 + dst: Int, + vc: Int,//virtual channel index within the channel + n_vc: Int//该物理通道中可用的虚拟通道的数量 +) { +``` +{: file='constellation/src/main/scala/routing/Types.scala'} + +> In the current implementations, packets arriving at the egress physical node are always directed to the egress. Thus, `ChannelRoutingInfo` for the egress channels are not used.到达出口物理节点的数据包总是被定向到出口,这种限制阻碍了偏转路由算法的实现 + {: .prompt-tip } + +Flow Identifier唯一标识可能穿过 NoC 的potential flow, or packet + +```scala +case class FlowRoutingInfo( + ingressId: Int,//ingress index of the flow + egressId: Int, + vNetId: Int,//virtual subnetwork identifier of this flow + ingressNode: Int,//the physical node of the ingress of this flow. + ingressNodeId: Int,//物理节点上所有入口中入口的索引 + egressNode: Int, + egressNodeId: Int, + fifo: Boolean +) { +``` +{: file='constellation/src/main/scala/routing/Types.scala'} + +![flowrouting]({{ page.img_path }}flowrouting.png){: width="972" height="589" } + +这里我没有怎么看懂他的例子 + +### 组合路由 +在`constellation/src/main/scala/routing/RoutingRelations.scala`中有多种routing relations,为所包含的拓扑生成器提供无死锁路由,这里面有组合路由,可以这样用: + +```scala +//a Mesh2DEscapeRouting algorithm with two escape channels using dimension-orderd routing +EscapeChannelRouting( + escapeRouter = Mesh2DDimensionOrderedRouting(), + normalRouter = Mesh2DMinimalRouting(), + nEscapeChannels = 2 +) +``` +{: file='constellation/src/main/scala/routing/RoutingRelations.scala'} + +### Terminal Router Routing + +```scala +topolog = TerminalRouter(BidirectionalLine(4)) //Terminal Router Topologies +routing = TerminalRouterRouting(BidirectionalLineRouting())//`TerminalRouterRouting`路由关系 +``` +{: file='constellation/src/main/scala/routing/RoutingRelations.scala'} + +![TerminalRouterRouting]({{ page.img_path }}TerminalRouterRouting.png){: width="972" height="589" } + + +[terminal的topo描述](#terminal) + +### Hierarchical Topology Routing + +![Hierarchicalrouting]({{ page.img_path }}Hierarchicalrouting.png){: width="972" height="589" } + +[Hierarchical的topo描述](#Hierarchical) + +虚拟子网路由关系--看不懂 + + + +## Protocol + +### Abstract Protocol Interface + +```scala +trait ProtocolParams { + val minPayloadWidth: Int// flits 传输此协议所需的最小有效负载宽度 + val ingressNodes: Seq[Int]//所有入口终端的物理节点目的地的有序列表 + val egressNodes: Seq[Int] + val nVirtualNetworks: Int//该协议中虚拟子网的数量,通常是协议通道的数量 + val vNetBlocking: (Int, Int) => Boolean//该协议中虚拟子网之间的阻塞/非阻塞关系 + val flows: Seq[FlowParams]// possible flows for the protocol + def genIO()(implicit p: Parameters): Data//返回整个互连的协议级 IO + def interface( + terminals: NoCTerminalIO,//为NoC 提供接口 + ingressOffset: Int, + egressOffset: Int, + protocol: Data)(implicit p: Parameters)//为协议提供接口 +} +``` +{: file='constellation/src/main/scala/protocal/Protocol.scala'} + +### Standalone Protocol NoC + +```scala +case class ProtocolNoCParams( + nocParams: NoCParams,//参数化network + protocolParams: Seq[ProtocolParams]//参数化协议接口 +) +class ProtocolNoC(params: ProtocolNoCParams)(implicit p: Parameters) extends Module { + val io = IO(new Bundle { + val ctrl = if (params.nocParams.hasCtrl) Vec(params.nocParams.topology.nNodes, new RouterCtrlBundle) else Nil + val protocol = MixedVec(params.protocolParams.map { u => u.genIO() }) + }) +``` +{: file='constellation/src/main/scala/protocal/Protocol.scala'} + +> 通过将多个`ProtocolParams`传递给`protocolParams`可以在共享互连上支持多个协议 +{: .prompt-tip } + +### AXI4 + +```scala +case class AXI4ProtocolParams( + edgesIn: Seq[AXI4EdgeParameters], + edgesOut: Seq[AXI4EdgeParameters], + edgeInNodes: Seq[Int], + edgeOutNodes: Seq[Int], + awQueueDepth: Int +) extends ProtocolParams { +//AXI4EdgeParameters类的定义可以在 Rocketchip 中找到。 +// edgesIn和edgesOut是向内和向外 AXI-4 边缘的有序列表(分别来自主设备和从设备) +// edgeInNodes和edgeOutNodes将主节点和从节点映射到物理节点索引 +``` +{: file='constellation/src/main/scala/protocal/AXI4.scala'} + +### Diplomatic Protocol +没看懂。待定 + +NoC 集成的示例可以在 Chipyard 的`MultiNoCConfig`中的`NoCConfigs.scala`文件中找到 + + Constellation 还支持无死锁的共享全局互连。追求这种集成风格的配置应该设置`GlobalNoCParams`字段 `constellation.soc.WithGlobalNoC` 。 + +全局共享 NoC 配置的一个示例是 Chipyard 中`NoCConfigs.scala`中的`SharedNoCConfig` 。 diff --git "a/_posts/\351\241\271\347\233\256\345\255\246\344\271\240/2024-10-21-chipyard-Customization.md" "b/_posts/\351\241\271\347\233\256\345\255\246\344\271\240/2024-10-21-chipyard-Customization.md" new file mode 100644 index 0000000..424c0c6 --- /dev/null +++ "b/_posts/\351\241\271\347\233\256\345\255\246\344\271\240/2024-10-21-chipyard-Customization.md" @@ -0,0 +1,24 @@ +--- +layout: post +title: chipyard Customization +date: 2024-10-21 13:51 +0800 +categories: [项目学习, 开源项目] +tags: [] +img_path: /assets/img/pj/ +--- + +## 6.1 定义core + +```scala +class DualLargeBoomAndSingleRocketConfig extends Config( + new boom.v3.common.WithNLargeBooms(2) ++ // add 2 boom cores + new freechips.rocketchip.rocket.WithNHugeCores(1) ++ // add 1 rocket core(first ID) + new chipyard.config.WithSystemBusWidth(128) ++ + new chipyard.config.AbstractConfig) +``` +{: file='chipyard/src/main/scala/config/HeteroConfigs.scala'} + +## 6.2 SoCs with NoC-based Interconnects +将片上网络集成到 Chipyard SoC 的主要方法是将标准 TileLink 基于交叉开关的总线之一(系统总线、内存总线、控制总线等)映射到 Constellation 生成的 NoC。 + +我们先来看constellation的配置文档 diff --git a/assets/img/pj/Hierarchical.png b/assets/img/pj/Hierarchical.png new file mode 100644 index 0000000..3380b6b Binary files /dev/null and b/assets/img/pj/Hierarchical.png differ diff --git a/assets/img/pj/Hierarchicalrouting.png b/assets/img/pj/Hierarchicalrouting.png new file mode 100644 index 0000000..3388667 Binary files /dev/null and b/assets/img/pj/Hierarchicalrouting.png differ diff --git a/assets/img/pj/TerminalRouterRouting.png b/assets/img/pj/TerminalRouterRouting.png new file mode 100644 index 0000000..4166ef1 Binary files /dev/null and b/assets/img/pj/TerminalRouterRouting.png differ diff --git a/assets/img/pj/coupleSAVA.png b/assets/img/pj/coupleSAVA.png new file mode 100644 index 0000000..b8c6d58 Binary files /dev/null and b/assets/img/pj/coupleSAVA.png differ diff --git a/assets/img/pj/flowrouting.png b/assets/img/pj/flowrouting.png new file mode 100644 index 0000000..c0ba4e8 Binary files /dev/null and b/assets/img/pj/flowrouting.png differ diff --git a/assets/img/pj/payload.png b/assets/img/pj/payload.png new file mode 100644 index 0000000..5ef4e74 Binary files /dev/null and b/assets/img/pj/payload.png differ diff --git a/assets/img/pj/terminal.png b/assets/img/pj/terminal.png new file mode 100644 index 0000000..81cdd77 Binary files /dev/null and b/assets/img/pj/terminal.png differ