香山 XSNoCTop 完整指南:Core+L2 如何接入外部 CHI 片上网络
香山 XSNoCTop 完整指南CoreL2 如何接入外部 CHI 片上网络【免费下载链接】XiangShanOpen-source high-performance RISC-V processor项目地址: https://gitcode.com/GitHub_Trending/xia/XiangShan香山XiangShan开源 RISC-V 处理器的默认 SoC 顶层 XSTop 把 L3 缓存 OpenLLC 直接封装在芯片内部适合单芯片演示但当你面对多芯片、多核集群形态时核内的 L2 需要直接和外部片上网络NoC说 CHI 协议SoC 顶层就不该再大包大揽而应只交出干净的核侧接口并把时钟、复位、电源管理做好。XSNoCTop就是为这种形态准备的另一个 SoC 顶层它不实例化片上 L3把 CoreL2 整体挂到外部 CHI 网络上同时接管跨时钟域、中断汇聚与核低功耗三件事。它是什么一个核侧插座而不是另一条总线XSNoCTop 与 XSTop 是并列的两种顶层选择由配置项UseXSNoCTop切换见 Top.scala。它的职责边界很清晰对外的唯一数据通路是一个 CHIPortIOio_chiL2 的所有一致性流量从这里进出核侧的完整包装是XSTileWrap注释里写明了它的设计意图——本模块内的一切都位于核时钟域和更高电压域即 XSNoCTop 是核与 SoC/NoC 之间的一道电气和时序边界其余全部是管理信号多域时钟/复位、CLINT/PLIC/NMI/Debug 中断、IMSICRISC-V AIA 的中断控制器握手、RISC-V trace 接口、DFT 与低功耗控制。架构全景trait 拼装出来的顶层XSNoCTop本体只有几十行真正的逻辑分布在 XSNoCTop.scala 的一组 trait 上末尾按职责装配class XSNoCTop()(implicit p: Parameters) extends BaseXSSoc with HasXSTile // 实例化 XSTileWrap核心L2与中断节点 with HasSeperatedBusOpt // 可选的独立外设总线TL 或 AXI with HasIMSIC // IMSIC 总线顶层 with HasTraceIO // RISC-V trace 接口Trait职责HasAsyncClockImp声明 noc / soc / clint 三组时钟与复位并各自生成同步复位HasXSTileCHIImp把核侧 CHI 口接到io_chi中间可选跨时钟域桥HasSeperatedBusOpt给 Debug、Timer 等 SoC 外设留一条独立 TL/AXI 通道HasIMSICImp把imsic_bus_top的 MSI 直通核含 TEE IMSICHasClintTimeImpCLINT 时间信号跨域送进核HasCoreLowPowerImpWFI 时钟门控 断电状态机见下文HasTraceIO把核的 trace 组信号打平输出给外部编码器数据流向可以概括为一张图核侧 CHI 源核时钟域→ 异步桥 → 外部 NoC其余接口IMSIC、分离总线、时间信号都工作在 SoC 时钟域靠异步队列/同步器与核域隔离。每个核的 L2 还需要一个 CHI 节点号nodeID的位宽按外部 NoC 的规模issue 参数查NodeIDWidthListB 型 7 位、C 型 9 位、E.b 型 11 位由 SoC 外部在实例化时逐核赋值。 三个时钟域CHI 接口如何跨域XSNoCTop的 IO 里同时出现三组时钟/复位分别对应三个域XSNoCTop.scala 的HasAsyncClockImpval noc_clock socParams.EnableCHIAsyncBridge.map(_ IO(Input(Clock()))) val noc_reset socParams.EnableCHIAsyncBridge.map(_ IO(Input(AsyncReset()))) val soc_clock IO(Input(Clock())) // 核默认工作在这个域 val soc_reset IO(Input(AsyncReset())) val clint_clock IO(Input(Clock())) // 时间信号独立域 val clint_reset IO(Input(AsyncReset()))noc 域外部 NoC 的频率CHI 流量的最终落点soc 域XSNoCTop内部模块IMSIC、分离总线的 xbar 等默认工作域clint 域时间戳信号通常来自独立低频时钟单独走一条异步通道。CHI 通路的跨域由一对异步 FIFO 桥完成且做成可关断的选项socParams.EnableCHIAsyncBridge match { case Some(param) withClockAndReset(noc_clock.get, noc_reset_sync.get) { val time_sink Module(new CHIAsyncBridgeSink(param)) time_sink.io.async core_with_l2.module.io.chi io_chi time_sink.io.deq } case None io_chi core_with_l2.module.io.chi // 同频同域时直连 }源端CHIAsyncBridgeSource位于核时钟域的 XSTileWrap宿端位于 noc 域核侧 CHI 口的类型也随之从PortIO变为AsyncPortIO。三条异步通道的默认参数SoC.scala 的SoCParamsKey通道用途depth同步级数EnableCHIAsyncBridgeCHI 全通道163EnableClintAsyncBridge64 位时间戳83SeperateBusAsyncBridge独立外设总线13CHI 带宽大、事务长队列给到 16 级时间戳是单拍数值8 级足够分离总线只承载外设 MMIO 的低频流量1 级即可。三处同步逻辑统一采用 3 级AsyncResetSynchronizerShiftReg——这是整个文件里反复出现的模式也是用确定的同步深度换亚稳态风险收敛的直接体现。 低功耗WFI 时钟门控与七态断电状态机低功耗分两层都实现在HasCoreLowPowerImp第一层是 WFI 时钟门控由WFIClockGate配置开关。核心执行wfi后若没有任何待处理事件核L2 时钟整体关掉事件源共 8 路msip / mtip / meip / seip / nmi_31 / nmi_43 / debug / msi_infoIMSIC 消息到达外加 CHI 的flitpend有 snoop/rsp/dat 数据挂起。对应状态机是四态的LowPowerState.scalasNORMAL → sGCLOCK门控→sAWAKE被中断唤醒或sFLITWAKE被 CHI 流量唤醒→ 回sNORMAL。这层不需要 SoC 参与纯核侧自治。第二层是完整断电流程只有配置EnablePowerDown才存在状态机定义为一行枚举val sIDLE :: sL2FLUSH :: sWAITWFI :: sEXITCO :: sWAITQ :: sQREQ :: sPOFFREQ :: Nil Enum(7)状态含义离开条件sIDLE正常工作核 CSR 发起 L2 flushsL2FLUSH把 L2 脏数据刷回l2_flush_done拉高sWAITWFI等核进入 WFIcpu_wfisEXITCO与 NoC 侧电源控制器握手syscoreq/syscoack 握手释放sWAITQ等网络侧 Q 通道CHI 电源控制!QACTIVEsQREQ请求接受!QACCEPTnsPOFFREQ终端态通知 SoC 断电靠上电复位流程恢复两个值得注意的细节进入sPOFFREQ时拉高o_cpu_no_op通知 SoC并在该状态用pwrdownGateClock配合 SoC 复位把时钟彻底关断——恢复路径不复位状态机而是交给 SoC 的上电序列这与 SoC 侧soc_rst_n/iso_en复位与隔离控制配合形成完整电源时序另外所有跨入核域的握手信号flush 请求/完成、WFI、CHI 应答都先过 3 级同步器再参与状态判断保证状态机不会采样到亚稳值。为什么这么设计四个可见的取舍异步桥做成Option同频时零成本。EnableCHIAsyncBridge: Option[AsyncQueueParams]的取值决定 CHI 口是AsyncPortIO还是PortIO、桥是否存在。核与 NoC 同频时省掉一对跨域 FIFO 的面积和延迟异构频率时只改配置顶层结构不变。三条异步通道共用同一套Option模式是这个文件最一致的抽象。私有 CLINT 必须配分离总线。SoC.scala里有一条硬性约束UsePrivateClint true时SeperateBus不能为 NONE。原因是核内实例化的 Timer 需要一条 MMIO 地址通路而核的主数据通路已被外部 NoC 独占只剩 SeperateBus 可用——配置项之间用require表达依赖而不是留到综合时才发现端口悬空。SeperateBus 同时支持 TL 和 AXI。TL 是核的原生总线代价为零AXI 则要在 xbar 后面串一个TLToAXI4转换器见HasSeperatedBusOpt。选哪种取决于 NoC 外部外设如 Debug 模块用哪种总线转换器面积换接口自由度。nodeID 位宽不写死。NodeIDWidthList把核在 NoC 里是第几个节点、总共多少个节点这类拓扑信息参数化同一份核代码能挂进不同规模的 NoC7/9/11 位对应不同代际。这是面向多形态部署的典型解耦拓扑属于系统不属于核。权衡的另一面是复杂度三组时钟、每条边都要过同步器、低功耗握手横跨核/NoC/SoC 三方调试面明显大于 XSTop。香山给出的对策是配套了XSNoCDiffTop见下节——把 difftest 接口直接做进这个顶层让最难的跨域路径也在仿真中被逐拍核对。 上手入口配置项、文档与验证路径切换顶层用 XSNoCTopConfig 替代DefaultConfig它只改一个参数UseXSNoCTop trueTop.scala生成时按该参数实例化XSNoCTop或XSTop。关键参数集中在 SoC.scala 的SoCParamsKey——EnableCHIAsyncBridge深度/同步级数、UsePrivateClint、WFIClockGate、EnablePowerDown、SeperateBus/SeperateBusRanges、NodeIDWidthList、NumHart默认 64。ArgParser.scala与YamlParser.scala提供了命令行/yaml 两个修改入口无需改代码。核侧实现跨域桥源端、中断IntBuffer、时间异步队列都在 XSTileWrap.scala。仿真验证XSNoCDiffTopConfig在 XSNoCTop 之上挂 difftest 接口Top.scala中还会额外生成XSDiffTopChecker.sv双核 checker 模块用于 CI 交叉核对。项目文档README.md 有整体构建与运行说明CHI 桥接口类型PortIO/AsyncPortIO定义在XSCache子模块的xscache.chi包中。小结XSNoCTop 的价值在于把核和系统的边界画得足够干净一条 CHI 口出去三组时钟域管住时序一套七态状态机管住电源剩下的拓扑规模节点数、位宽、核数全部参数化。读这份代码的顺序建议是先看BaseXSSoc/BaseXSSocImp的骨架再按 trait 逐个看边最后回到类尾的装配清单——它本身就是一张目录。【免费下载链接】XiangShanOpen-source high-performance RISC-V processor项目地址: https://gitcode.com/GitHub_Trending/xia/XiangShan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

日新闻

周新闻

月新闻