zoukankan      html  css  js  c++  java
  • Rocket

    https://mp.weixin.qq.com/s/OH_Z1gdSUpfgM-tjx0OlrA

     
    追溯配置信息的源头。
     
    0. HasRocketCoreParameters
     
    HasRocketCoreParameters中使用从HasTileParameters中继承的implicit Parameters p获取各个配置项的值。
     
    这个p是抽象的,在HasRocketCoreParameters被混入(mixin)的类中实现或者推断(infer)。
     
     
    1. class Rocket
     
     
    class Rocket的主要构造方法有一个参数列表提供了implicit Parameters p,这个p可以被推断(infer)为HasRocketCoreParameters中的p。
     
     
    2. RocketTileModuleImp
     
     
    Rocket类在RocketTileModuleImp类中实例化,这里为Rocket类的主要构造方法的implicit Parameters p参数提供的实参为outer.p。
     
    下一节追溯RocketTileModuleImp在哪里实例化并传入outer。
     
    PS. 这里讲一个Intellij IDEA的细节。
     
    按住Ctrl,鼠标左键点击outer.p中的p,跳转到如下位置:
     
    outer是RocketTile的实例:
    他的方法列表里也有一个implicit p: Parameters。
     
    那么为什么点击outer.p的p定位到的不是RocketTile类的p呢?
     
    看一下Structure窗口。
    LazyModule的如下:
    这里的p作为一个数据成员存在;
     
    RocketTile的如下:
    没有p;
     
    如果把RocketTile的定义改一下:
     
    这说明类的主要构造方法的参数列表中,以var/val关键字修饰的是类的成员,不带的不是。
     
    那么RocketTile类主要构造方法(primary constructor)参数列表中的implicit p: Parameters就不是覆盖父类的数据成员,而只是一个参数。向当前范围(scope)内提供一个Parameters变量,这个变量可以被推断(infer)为HasTileParameters中的p。
     
     
    3. RocketTile
     
    RocketTileModuleImp在RocketTile类中实例化:
     
    RocketTile类的定义如下:
     
    他也有一个implicit p: Parameters参数。
     
     
    4. HasRocketTiles
     
     
    RocketTile在HasRocketTiles中实例化,使用的tp来自于:
     
    这个p来自于BaseSubsystem。
     
     
    5. BaseSubsystem
     
     
     
    6. RocketSubsystem
     
    BaseSubsystem的p来自于其子类,如RocketSubsystem:
     
     
    7. ExampleRocketSystem
     
    RocketSubsystem的p来自于其子类,如ExampleRocketSystem:
     
     
    8. TestHarness
     
    ExampleRocketSystem在TestHarness中实例化:
     
    TestHarness找不到被引用的地方。
     
     
    9. Makefrag
     
    TestHarness在Makefrag这个Makefile文件中使用:
     
    同时注意这里的CONFIG被赋值为DefaultConfig,这是一个配置类。
     
     
    这里调用Generator中的main函数,并把MODEL(TestHarness)和CONFIG(DefaultConfig)作为参数传入。
     
     
    10. GeneratorApp
     
    Generator中没有配置相关的内容,其继承自GeneratorApp:
     
    把传入的参数封装成ParsedInputNames:
     
    1) 先看CONFIG,亦即DefaultConfig
     
     
    fullConfigClass是DefaultConfig加上包名的路径,即:freechips.rocketchip.system.DefaultConfig。
     
    这里加载这个类、实例化,并类型转换成为Parameters对象params。
     
    2) 再看MODEL,亦即TestHarness
     
     
    fullTopModuleClass是TestHarness加上包名的路径,即:freechips.rocketchip.system.TestHarness。
     
    elaborate中就比较熟悉了:
     
    调用chisel3.Driver.elaborate()返回一个Circuit实例。
     
    top是一个无参但返回RawModule的函数:
    a. 加载TestHarness类:Class.forName(fullTopModuleClassName)
    b. 获取参数为Parameters的构造方法:getConstructor(classOf[Parameters])
    c. 调用该构造方法,把params作为参数传入:newInstance(params)
     
    即相当于:new TestHarness(params);
     
    11. 总结
     
    可以发现,配置的源头是用户传入的配置类的类名。
     
     
    12. Scala:构造方法中的implicit参数列表
     
    CoreModule类只定义了一个参数列表,为什么要多加一个空的参数列表呢?
     
     
    这在Scala语言规范中有讲:
    If a class has no formal parameter section that is not implicit, an empty parameter section () is assumed.
    也就是说,即便没有明写非implicit参数列表(formal parameter section),也默认有一个。实例化时需要加上。
     
    参考如下链接:
     
     
     
     
  • 相关阅读:
    nginx default setting
    ubuntu dotnet core run 十月第一弹
    vwmare 十月第 1 弹
    学习 lind 语 里的一些组件使用。
    学习  解决用户验证、单点登录、api访问控制的开源框架 的 十月 第一弹:
    学习 lind api 十月 第5弹
    Data for the People: How to Make Our Post-Privacy Economy Work for You
    iframe高度的自适应
    dtree在ie6下点击页面报错
    前台页面分页对总页数的判断
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10356265.html
Copyright © 2011-2022 走看看