介绍如何构建由模块组成的硬件模型。
 
1. 子模块
 
一个模块可以有一个或多个子模块,创建子模块时,需要使用Module(...)包裹:
 
Module()实现如下:
 
bc是一个call-by-name参数,在第一次引用时调用。
 
1) 在调用bc创建模块之前,先保存Builder的状态。
a. Module()只能用于包裹一个模块的实例化操作:
Builder.readyForModuleConstr在实例化模块之前被置为false:
这个要求模块的实例化必须在Module()以内。子模块在父模块中以Module()包裹实例化,顶层模块如何实例化呢?也需要以Module()包裹,后续再讲。
 
b. 记录当前Builder的状态信息,如当前的val parent = Builder.currentModule为将要实例化的模块的父模块:
 
 
2) 调用bc,创建子模块
 
子模块创建之初,会先要设置Builder的状态,如下注释中所言:
 
实际代码在BaseModule类体中:
 
3) 恢复Builder的状态
 
4) 把创建的模块,转换成为一个component
如果父模块不为空,则使用pushCommand把新创建的模块以DefInstance命令添加到硬件模型中。
 
2. generateComponent
 
a. 处理各模块名字;
b. 定义ModuleIO;
c. 将模块输入输出端口转换为component所需的Port;
d. 定义component:val component = DefModule(this, name, firrtlPorts, invalidateCommands ++ getCommands)
 
 
3. 顶层模块
 
顶层模块也需要使用Module()包裹着创建。
 
如顶层模块Adder4的创建。其创建函数被传给chisel3.Driver.execute方法:
 
 
 
可以看到,这里调用gen()的时候,也包裹在Module()之中。
 
只是这里的Module(gen())也是一个call-by-name参数,并不是直接调用:
这里的Builder即为之前多次提到的Builder。build方法返回顶层模块Circuit。
 
 

Chisel3 - model - 子模块,顶层模块的更多相关文章

  1. Modelsim SE自动化仿真——如何将.do文件中自定义的库链接到testbench顶层模块

    我们用Modelsim SE进行仿真时,为了方便,一般会编写.do文件来启动当前仿真.关于.do文件的编写,一般网上都有成型的模板,我们只要稍微改几个参数,就可以符合我们的仿真需求了.但是如果仿真时需 ...

  2. Chisel3 - model - Builder

    https://mp.weixin.qq.com/s/THqyhoLbbuXXAtdQXRQDdA   介绍构建硬件模型的Builder.   1. DynamicContext   ​​ 动态上下文 ...

  3. Chisel3 - model - IO ports

    https://mp.weixin.qq.com/s/fgCvIFt0RdEajhJVSy125w   介绍模块的输入输出端口的定义与管理.     1. _ports   1) 模块的输入输出端口, ...

  4. Chisel3 - model - when

    https://mp.weixin.qq.com/s/YGTXky4wff7LXUphUxISQg   介绍创建模块判断逻辑的when命令.   1. when/elsewhen/otherwise ...

  5. Chisel3 - model - connect

    https://mp.weixin.qq.com/s/w8NqM3GVlF0NydpsB65KPg   介绍创建模块顺序逻辑的connect命令.     0. 这里先简单对 "=" ...

  6. Chisel3 - model - DefWire, Reg, Memory, Prim

    https://mp.weixin.qq.com/s/KkkqvekWHG6yrqwHUECRIw   介绍如何定义Wire/Reg/Memory/Prim.   1. DefWire   Wire( ...

  7. Chisel3 - model - UserModule commands

    https://mp.weixin.qq.com/s/0ECca6XyFyEri0B4ckOZ4A   介绍UserModule类中,如何管理构建硬件模型所需的命令.   ​​   1. _comma ...

  8. Chisel3 - model - Hardware Model

    https://mp.weixin.qq.com/s/x6j7LZg7i7i_KcNEA8YCQw   Chisel作为领域专用语言(DSL),用于构建硬件模型.待硬件模型建立后,再基于模型进行仿真. ...

  9. Python2.5-原理之模块

    此部分来自于<Python学习手册>第五部分 一.模块(21章) 模块是最高级别的程序组织单元,它将程序代码和数据封装起来以便重用..模块往往对应于python程序文件.每个文件就是一个模 ...

随机推荐

  1. Qt 操作sql server数据库

    添加qtsql的库 连接数据库 QSqlDatabase_db = QSqlDatabase::addDatabase("QODBC"); _db.setHostName(); _ ...

  2. FAXCOM和FXSCOMEX 传真编程

    需要引用的dl,如下信息,早起使用的是FXSCOM.DLL,现在微软提供了相应的扩展,其程序集为,FXSCOMEX.dll FXSCOMEX.dll 提供跟加健全的方法,可以说所有关于传真的操作都在这 ...

  3. 使用 python 进行 面部合成

    完整代码已上传至GitHub: https://github.com/chestnut-egg/Face 一. 准备工作 1. 此程序使用的是 Face++ 的API,所以需要去Face++官网注册账 ...

  4. 08JAVA基础关键字(final、static)以及抽象类和接口

    一.关键字 1.final 修饰类 修饰变量 修饰成员方法 该类为最终类,不能被继承 该变量为常量 该成员方法不能被重写 2.static (1).生命周期 随着类的加载而加载 (2).特点 被本类所 ...

  5. linux --运行模式

    运行模式也可以称之为运行级别 在Linux中存在一个进程:init (initialize:初始化)init 的进程id 是1 ps -ef | grep init 该进程存在一个对应的配置文件 in ...

  6. 基于VUE实现的h5网页Web出库单入库单打印设计

    经过将近一个月的研发,初步实现了打印单据的自定义设计,样子还有点丑陋,但是功能基本都实现了,实现了以下功能: 1.表头表尾支持动态添加行.添加列.合并单元格(可多行多列合并). 2.表头表尾分别布局, ...

  7. vue 路由钩子。

    一.全局钩子 你可以使用 router.beforeEach 注册一个全局的 before 钩子: const router = new VueRouter({ ... }) router.befor ...

  8. Gitlab 安装、升级、备份、恢复、汉化等

    一.Gitlab安装 1. 基于yum方式安装Gitlab 安装步骤如下 (1)配置yum源 # vim /etc/yum.repos.d/gitlab-ce.repo (2)复制如下内容并保存(注意 ...

  9. Oracle 大数据查询优化方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. java中字符串截取

    1.使用StringUtils,需要导包 String strs = "abcdef1003535197"; System.out.println("=====2==== ...