ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

香山处理器 XSNoCTop 片上网络:多核 RISC-V 互联的功耗与一致性怎么读?

香山处理器 XSNoCTop 片上网络:多核 RISC-V 互联的功耗与一致性怎么读? 香山处理器 XSNoCTop 片上网络多核 RISC-V 互联的功耗与一致性怎么读【免费下载链接】XiangShanOpen-source high-performance RISC-V processor项目地址: https://gitcode.com/GitHub_Trending/xia/XiangShan香山处理器XiangShan的片上网络顶层 XSNoCTop 是 RISC-V 多核互联的核心模块。本文从四核抢缓存线的场景出发讲 CHI 一致性事务的完整路径、异步时钟域与低功耗状态机以及 AXI、TileLink、CHI 三总线分工。一、四核同时改同一个变量流量为什么不用排队假设四核跑同一个基准测试共享变量 x 的副本散落在各核 L1、L2原始数据在 L3。第 0 核执行一条 store 改写 x另外三核同时各发一条 load。若所有请求挤在同一条总线上串行仲裁四条请求只能排成一列队首动一格、全队才挪一步。香山的做法是拆掉独木桥、改走多车道每个核带 L2、L3 和周边设备都当成独立节点请求带着目的地字段在节点之间转发像立交桥上各走各的匝道。XSNoCTop 就是单个「核 节点」的顶层模块多份这样的模块加上共享 L3拼成完整 SoC。二、架构全景XSNoCTop 在 SoC 里占哪一格先看代码里的事实XSNoCTop.scala 第 473 行的XSNoCTop类体混入HasXSTile、HasSeperatedBusOpt、HasIMSIC、HasTraceIO四个 trait内部 Imp 再混入HasAsyncClockImp、HasXSTileCHIImp、HasCoreLowPowerImp、HasClintTimeImp、HasIMSICImp。每个 trait 对应一块功能读代码就是逐个对号入座。它对外只有几条出口按流量类型分io_chiCHI 网络接口通往 L3OpenLLC和其余核io_sepbus独立总线出口TileLink 与 AXI 二选一imsic_axi4与imsicIMSIC 中断总线的 AXI 口和裸线口trace 与性能计数器接口供调试侧采集生成流程里Top.scala 第 674 行根据UseXSNoCTop开关决定实例化XSNoCTop还是旧的XSTop。开关在配置里行为在 trait 里两层都能对上。三、CHI 一致性事务怎么走完一程CHI 是 AMBA 5 里的 CHI 一致性协议每份数据在缓存中的状态独占、共享、无效由各缓存自己记账家节点Home Node裁决地址归属。挑一个具体事务走完全程——第 1 核 load 变量 x第 1 核 L1、L2 均未命中L2 经io_chi向 CHI 网络发出读请求家节点查到第 0、2 核的 L2 持有 x 的共享副本向它们发 snoop第 0、2 核应答并维持共享态家节点把数据转给第 1 核全程没有中心仲裁点其他事务可以并行在飞正因为状态是分布式维护的事务才能并行流水。这里有个容易忽略的约束HasXSTileCHIImp第 265 行里有一行require(socParams.isOpenLLC, ...)意思是 XSNoCTop 目前只和 XSCache 实现的 OpenLLC 组合。先记住这一点再去读 CHI 部分能少绕弯。四、⚡ 异步桥让核与 NoC 各跑各的频状态机决定什么时候睡先回答「核与 NoC 为什么不必同频」核侧追求最高主频网络与 L3 侧的时钟往往更稳定也更省电。香山的做法是两侧各留独立的时钟与复位HasAsyncClockImp中的noc_clock与soc_clock。配置项EnableCHIAsyncBridge默认开启SoC.scala 第 127 行的默认值是Some(AsyncQueueParams(depth 16, sync 3))。HasXSTileCHIImp检测到该配置后会在核侧 CHI 口与io_chi之间插一级CHIAsyncBridgeSink异步桥HasClintTimeImp给 CLINT 时间源配了同样的异步队列。异步桥解决「不同频怎么握手」低功耗状态机解决「什么时候能睡」。HasCoreLowPowerImp的buildLowPower第 96 行起定义了固定下电流程代码里是sIDLE到sPOFFREQ七个状态每一步都有明确进入条件任何一步不满足就停在原地等不跳步。另有WFIClockGate开关核在 WFI 时直接关核 L2 的时钟中断或 snoop 到来flitpend有效才把时钟放回来省的是「浅睡」阶段的电。五、TileLink、AXI、CHI 三总线怎么分工三总线各管一摊依据是HasSeperatedBusOpt第 289 行与HasIMSIC第 380 行总线出口承担流量CHIio_chi核间一致性流量通往 OpenLLCTileLinkio_sepbusSeperateBus TL外设地址空间核侧走 TL 直接出AXIio_sepbusSeperateBus AXI外设地址空间经TLToAXI4转出注意选 AXI 时并不另起炉灶内部仍是 TileLink出端口前经TLToAXI4()转成 AXI4所以核侧逻辑完全不用改。默认SeperateBus是 NONE即不挂独立总线。可观测性方面HasIMSIC引入imsic_bus_top把 MSI 中断直接送进核的msiInfo接口。因为它不占总线带宽核处于低功耗状态时也能被 IMSIC 唤醒。监控侧HasTraceIO把 RISC-V trace 接口cause、tval、priv、mstatus 与指令组透出到 SoC 外配合XSNoCDiffTop内的 XSLog 收集逻辑性能计数与日志可在验证平台上直接采集。六、 动手读源码三个文件的顺序src/main/scala/top/XSNoCTop.scala从第 473 行class XSNoCTop读起。类体混入的每个 trait 对应本文一节对号入座最快。src/main/scala/system/SoC.scalaSoCParams集中了全部开关——EnableCHIAsyncBridge、EnablePowerDown、WFIClockGate、SeperateBus。知道默认值才知道读代码时哪条分支会走。src/main/scala/top/Configs.scala第 599 行XSNoCTopConfig展示多核 NoC 配置如何叠在DefaultConfig上改核数、开异步桥都从这里入手。回到开头那个场景四核同时改 x流量不再挤一条路而是分散在 CHI 链路上并行推进核空闲时状态机保证它先刷 L2、再等 WFI、最后才下电。下一步建议用仓库里的 Makefile 或 scripts/xiangshan.py 出一版 Kunminghu 配置的 RTL打开XSTop模块把 trait、端口和状态机逐一在网表里找出来。对不上时回到源码看那个 trait比翻协议手册更快。【免费下载链接】XiangShanOpen-source high-performance RISC-V processor项目地址: https://gitcode.com/GitHub_Trending/xia/XiangShan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表