Chisel在Nutshell中的应用PPT课件_第1页
Chisel在Nutshell中的应用PPT课件_第2页
Chisel在Nutshell中的应用PPT课件_第3页
Chisel在Nutshell中的应用PPT课件_第4页
Chisel在Nutshell中的应用PPT课件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Chisel 在 Nutshell 中的应用 中科院计算所 王凯帆 2021.8.25内容lNutShell: 使用 Chisel 开发的开源处理器l结合 NutShell 的 Chisel 开发经验分享lChisel 开发思路与流程lNutShell 中使用到的一些 Chisel 特性lChisel 开发过程中的注意事项23NutShell: 使用 Chisel 开发的开源处理器NutShell: 总览lDeveloped by 5 undergraduates in 4 monthslUse online differential testing framework to speed up

2、 developmentlSupport SDRAM, SPI flash, UART1lSupport Linux 4.18.0 KernellSupport Debian 11 / Fedora 32 in simulation/FPGA environmentlSMIC 110nml10mm2l200mw350MHz TypicallTQFP1001 We used peripheral devices from OpenCores community.4lOnly optimize TLB and compressed instruction decoder specially:lxc

3、7z020-1-clg400 60MHzlxczu3cg-sfvc784-1-e 200MHzlSMIC 110nm 350MHz5NutShell: 频率* Source: http:/ timing report for Pynq boardNutShell: 设计l单发射顺序核l使用 Chisel 开发l支持 RV64IMAC, Zifence, Zicsrl支持 M/S/U 特权级l2 位饱和计数器的分支预测l512 项 BTB, 16 项 RASl支持 Sv39 虚拟内存规范l支持 L1/L2 缓存67Chisel 开发思路与流程 结合 NutShell8Step 1:确定架构l学习

4、了很多 Chisel 语法,怎么开始写自己的 CPU 呢?lChisel 教会你快速描述电路,但 Chisel 无法教会你电路应该长什么样l单周期 - 多周期 - 流水线 - 多发射 - 乱序执行 l更抽象的硬件描述语言无法让你摆脱架构设计lChisel 可以加快开发效率,但无法加快设计效率l体系结构的知识决定了处理器的上限timelineVerilog WorkflowChisel Workflow9Step 2:模块分解l作为一个系统,CPU 应该像积木一样被构造出来l自顶向下,尽可能地编写具有独立功能的最小模块然后进行组装l便于解耦、复用、调试l物理&逻辑上,处理器都是分层、分模

5、块的10Step 3:参数定义l参数是处理器开发中的“元数据”l良好的参数设计可以对处理器做灵活配置,做设计空间探索等lChip = Chip Generatorl常见参数l功能开关、数据位宽、资源大小、地址空间l参数传递方式l实例化传参(&隐式传参)l全局参数l*CDE & Diplomacy11Step 4:接口定义l接口是模块之间交流的“语言”l首先根据数据通路添加主干接口,之后根据需求再补充l优化接口的定义l对象化接口,构建具有层次化的接口l考虑接口的复用l在接口定义中可添加函数以方便开发或调试l位宽!位宽!12Step 5:模块组装l自顶向下使用模块来构建理想的结构l

6、对应“模块分解”这一步l多做“调包侠”l组合电路的组装 vs 时序电路的组装l相同接口使用 连接lPipeline 抽象l推荐优先进行模块组装再进行模块开发l先完成、再完美,避免开发过程中迷失方向、重复开发l可使用“fake module”加快系统集成速度13Step 6:模块开发l学习 Chisel 描述电路的用武之地l组合电路l可以使用一些 Chisel 内置的组件加速开发(Queue,Arbiter)l区分 Scala 数据类型/Chisel 数据类型,注意其转换l对于结构化的数据多使用 for/map 等语法l时序电路l关注一些方便的固定写法l状态机l流水线l14Step 6:测试与调

7、试l单元测试(ChiselTest)& 集成测试(Difftest)l波形调试l工业界传统的调试方法,保留的信息最丰富,但需要人工提取语义l日志调试l在代码中插入 printf 以打印自定的语义信息,甚至可以有条件打印l* 性能调优l通过集成测试不代表整个系统是 bug-free 的l隐蔽的性能 Bug 可能会存在(分支预测、替换策略)l使用性能计数器最大化发现异常15NutShell 中使用到的一些 Chisel 特性16抽象!复用!l函数式编程范式l抛弃流式程序的思想l使用函数来“描述电路的映射关系”l面向对象编程范式l封装、解耦、继承 17使用 MaskedRegMap 来描述

8、CSRlTo implement RISC-V CSR:l不同的 CSR 寄存器有不同的读写副作用l不同的 CSR 寄存器有不同的读写掩码lCSR 寄存器的地址不是连续的l因此,设计 MaskedRegMap 抽象MaskedRegMap(reg address, reg data source (hardware), writemask, write side effect, readmask, read side effect)18Implement CSRs in NutShell使用 MaskedRegMap 来描述 CSRlMaskedRegMap: usageMaskedRegMa

9、p(reg address, reg data source, writemask, write side effect, readmask, read side effect)19使用 MaskedRegMap 来描述 CSRl如何实现 MaskedRegMaplMaskedRegMap.apply()l生成寄存器配置lMaskedRegMap.generate() l根据寄存器配置来真正生成电路 def apply(addr: Int, reg: UInt, wmask: UInt = WritableMask, wfn: UInt = UInt = (x = x), rmask: UIn

10、t = WritableMask) = (addr, (reg, wmask, wfn, rmask)20使用 MaskedRegMap 来描述 CSRl如何实现 MaskedRegMaplMaskedRegMap.apply()l生成寄存器配置lMaskedRegMap.generate() l根据寄存器配置来真正生成电路 chiselMapping.map case (a, r, wm, w, rm) = if (w != null & wm != UnwritableMask) when (wen & waddr = a) r := w(MaskData(r, wdata

11、, wm) 21MaskedRegMap implementation using 27 lines使用 MaskedRegMap 来描述 CSRAXI4 设备中的代码复用l我们设计了很多用于仿真的虚拟设备l使用 MMIO 方式访问l接口为 AXI4 或 AXI4Lite 总线l这些设备处理总线读写请求的逻辑其实是可以复用的lBut how?22AXI4 设备中的代码复用lStep 1: 构建抽象类“AXI4SlaveModule”lIO 和 AXI4 handler 在其中被实现l所有的虚拟设备是这个抽象类的子23AXI4 设备中的代码复用lStep 2: 构建 AXI4 总线的抽象l传入总

12、线类型作为一个参数l对总线类型使用模式匹配的方法来实现差异化的功能24abstract class AXI4SlaveModuleT if (w != null & wm != UnwritableMask) when (wen & waddr = a) r := w(MaskData(r, wdata, wm) Hardwarel类 Verilog 的 Chisell避免逐行翻译 效率没有提高l类软件的 Chisell慎用“var”l寻找一个平衡! l首先时刻记住我们是在描述 RTL 电路l在此基础上,借用高级语言的特性进行更灵活的描述27关注抽象层次l位宽问题28语言上容易

13、陷入的坑valvalidMeta=Cat(0untilnWays).mapw=validArray(Cat(s2_idx,w.U).reverse).asUIntAn I$ with very high miss rate valvalidMeta=Cat(0untilnWays).mapw=validArray(Cat(s2_idx,w.U(log2Ceil(nWays).W).reverse).asUInt建议一律定义 Uint 的位宽l关注 DontCare29语言上容易陷入的坑val bundleA DontCare/ lots of codebundleA.signal1 := tr

14、ue.BbundleA.signal2 := 1.UbundleA.signal4 := 2.U/.bundleA.signalx := 3.U/ bundleA.signal3 is set to false.B/forget.when(bundleA.signal1 & bundleA.signal3) /.不要试图使用 DontCare 的默认值l关注 Cat 与 Map 不匹配问题30语言上容易陷入的坑/ Is there an MSHR free for this request?val mshr_validOH = Cat(mshrs.map(_.io.status.val

15、id)val mshr_free = (mshr_validOH).asUInt & prioFilter).orR()mshr0_valid mshr1_valid mshr2_valid mshr3_validmshr3_valid mshr2_valid mshr1_valid mshr0_validbit 3bit 2bit 1bit 0Cat with no reverseCat with reverse+ .reverselrequire:提早规避违规参数lE.g. 参数之间互相矛盾lassert:增加功能检查点以规避违规电路状态lE.g. 理想的 one-hot 信号并不是 one-hot 的31提早发现错误lChisel Bootcampl(https:/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论