本文共 2406 字,大约阅读时间需要 8 分钟。
0. HasRocketCoreParameters HasRocketCoreParameters中使用从HasTileParameters中继承的implicit Parameters p获取各个配置项的值。 这个p是抽象的,在HasRocketCoreParameters被混入(mixin)的类中实现或者推断(infer)。 class Rocket的主要构造方法有一个参数列表提供了implicit Parameters p,这个p可以被推断(infer)为HasRocketCoreParameters中的p。 Rocket类在RocketTileModuleImp类中实例化,这里为Rocket类的主要构造方法的implicit Parameters p参数提供的实参为outer.p。 下一节追溯RocketTileModuleImp在哪里实例化并传入outer。 PS. 这里讲一个Intellij IDEA的细节。 按住Ctrl,鼠标左键点击outer.p中的p,跳转到如下位置: 他的方法列表里也有一个implicit p: Parameters。 那么为什么点击outer.p的p定位到的不是RocketTile类的p呢? 这说明类的主要构造方法的参数列表中,以var/val关键字修饰的是类的成员,不带的不是。 那么RocketTile类主要构造方法(primary constructor)参数列表中的implicit p: Parameters就不是覆盖父类的数据成员,而只是一个参数。向当前范围(scope)内提供一个Parameters变量,这个变量可以被推断(infer)为HasTileParameters中的p。 RocketTileModuleImp在RocketTile类中实例化: 他也有一个implicit p: Parameters参数。 RocketTile在HasRocketTiles中实例化,使用的tp来自于: BaseSubsystem的p来自于其子类,如RocketSubsystem: RocketSubsystem的p来自于其子类,如ExampleRocketSystem: ExampleRocketSystem在TestHarness中实例化: TestHarness在Makefrag这个Makefile文件中使用: 同时注意这里的CONFIG被赋值为DefaultConfig,这是一个配置类。 这里调用Generator中的main函数,并把MODEL(TestHarness)和CONFIG(DefaultConfig)作为参数传入。 Generator中没有配置相关的内容,其继承自GeneratorApp: 把传入的参数封装成ParsedInputNames: 1) 先看CONFIG,亦即DefaultConfig fullConfigClass是DefaultConfig加上包名的路径,即:freechips.rocketchip.system.DefaultConfig。 这里加载这个类、实例化,并类型转换成为Parameters对象params。 fullTopModuleClass是TestHarness加上包名的路径,即:freechips.rocketchip.system.TestHarness。 调用chisel3.Driver.elaborate()返回一个Circuit实例。 a. 加载TestHarness类:Class.forName(fullTopModuleClassName) b. 获取参数为Parameters的构造方法:getConstructor(classOf[Parameters]) c. 调用该构造方法,把params作为参数传入:newInstance(params) 即相当于:new TestHarness(params); 12. Scala:构造方法中的implicit参数列表 CoreModule类只定义了一个参数列表,为什么要多加一个空的参数列表呢? If a class has no formal parameter section that is not implicit, an empty parameter section () is assumed. 也就是说,即便没有明写非implicit参数列表(formal parameter section),也默认有一个。实例化时需要加上。 转载于:https://www.cnblogs.com/wjcdx/p/10356265.html