吃透Chisel语言.09.Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行

2023-11-05

Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行

上一大部分介绍了Chisel的基础语法,但除了教程开始的Demo以外,我们还没有开始写Chisel代码,这对于学习编程语言来说是大忌。不过好在Chisel基础语法部分内容并不算多,眼睛过一遍可能也掌握个大差不差了。但不能总这样,所以这一部分就来讲讲如何开始我们的Chisel项目。

如何开始Chisel项目

那么构建Chisel项目我们需要了解哪些东西呢?

首先,我们得知道怎么编译Chisel程序吧?其次,我们得知道怎么用Chisel代码生成Verilog代码来在FPGA上执行吧?再者我们还得知道怎么写测试来调试和验证我们的代码是否正确吧?

Chisel是用Scala写的,所以支持构建Scala项目的过程应该在Chisel项目上也适用。而Scala上一个流行的构建工具就是sbt,它是Scala interactive Build Tool的缩写。这个sbt不仅能够驱动编译和测试过程,还能够给Scala和Chisel下载正确版本的库,也就是有包管理的功能。

目前Chisel流行的项目构建工具就是sbt和mill,我们这里用sbt构建我们的项目。

关于sbt和build.sbt配置文件

Scala库中与Chisel和Chisel tester相关的部分是在构建过程从一个Maven仓库中下载下来的,而这些库是通过build.sbt文件引用的。Chisel项目中一个典型的build.sbt文件内容如下:

// See README.md for license details.

ThisBuild / scalaVersion     := "2.13.8"
ThisBuild / version          := "0.1.0"
ThisBuild / organization     := "com.github.github3rr0r"

val chiselVersion = "3.5.1"

lazy val root = (project in file("."))
  .settings(
    name := "OhMyChisel",
    libraryDependencies ++= Seq(
      "edu.berkeley.cs" %% "chisel3" % chiselVersion,
      "edu.berkeley.cs" %% "chiseltest" % "0.5.1" % "test"
    ),
    scalacOptions ++= Seq(
      "-language:reflectiveCalls",
      "-deprecation",
      "-feature",
      "-Xcheckinit",
      "-P:chiselplugin:genBundleElements",
    ),
    addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full),
  )


我们可以在build.sbt文件中配置latest.release来指定使用最新的Chisel版本,但是这样做的缺点就是每次都会从在线的Maven仓库中再搜索,如果没有联网的话就会构建失败。所以最好的做法还是在build.sbt中指定特定的Chisel版本,其他的Scala库也一样。

比如上面给出的典型build.sbt文件中,Scala版本指定为"2.13.8",Chisel版本指定为"3.5.1"chiseltest版本指定为"0.5.1"。指定版本不仅仅避免了没网时的尴尬,同时也保持了较好项目稳定性,比如由于Chisel发展较快,所以API不兼容的情况就在Chisel上时有发生。

Chisel项目源代码组织结构

sbt继承了Maven构建自动化工具的源代码组织结构约定,同时Maven也是开源Java库的仓库的管理者,Chisel在Maven仓库中的仓库在这里:Maven Repository: edu.berkeley.cs » chisel3 (mvnrepository.com)

下面这张图展现了典型的Chisel项目源代码组织结构:

在这里插入图片描述

project文件夹就是项目根目录,你也可以起其它名字,这个根目录就包含了build.sbt,也有可能会包含一个用于构建过程的Makefile文件,还有可能会有README文件和LICENSE文件。

项目根目录中的src文件夹包含了全部的源代码,其中划分了main文件夹和test文件夹,前者包含了所有的硬件源码,后者包含了所有的测试器代码。Chisel是从Scala继承的,Scala又是从Java继承了源码软件包的组织结构。包(Package)可以把我们的Chisel代码组织为命名空间,包也可以包含子包。

项目根目录下的target文件夹包含了类字节码文件和其他生成的文件,通常我们不在这个文件夹放我们生成的Verilog文件,而是在根目录下的generated文件夹下生成Verilog文件。

为了在Chisel中利用命名空间的便利性,我们需要声明我们在某个包下定义了一个类,比如下面的例子就是在mypack包中定义了一个Abc类:

package mypack

import chisel3._

class Abc extends Module {
    val io = IO(new Bundle{})
}

需要注意的是,这里我们导入了chisel3这个包来使用Chisel中的类。

那现在我们想在其他上下文中(即不同的包命名空间)使用模块Abc,那么我们就需要导入mypack包中的组件:

import mypack._

class AbcUser extends Module {
    val io = IO(new Bundle{})
    val abc = new Abc()
}

上面两段代码中的下划线_表示通配符,意思是包里面所有的类都会导入。

也可以不从mypack导入所有的类型,而是使用完整名称mypack.Abc来指示mypack包中的Abc

class AbcUser2 extends Module {
    val io = IO(new Bundle{})
    val abc = new mypack.Abc()
}

还可以只导入Abc这一个类来创建实例:

import mypack.Abc

class AbcUser extends Module {
    val io = IO(new Bundle{})
    val abc = new Abc()
}

用sbt运行Chisel项目

简简单单一条指令就可以用sbt编译并运行Chisel项目:

sbt run

这条指令会从源代码树编译所有的Chisel代码,并类中搜索包含main方法的对象的类,或者更简单地直接搜索从App拓展的对象。如果找到了多个对象,那就会列举出所有符合条件的对象,我们可以选择一个来执行。我们也可以直接指定执行某个对象,将它作为参数传递给sbt即可:

sbt "runMain mypacket.MyObject"

sbt默认值搜索源码树中的main部分,而不会搜索test部分,这个约定也是从Java和Scala来的。如果要执行基于ChiselTestScalaTest的测试,直接运行这条代码就行:

sbt test

如果我们写一个测试,没有遵循ChiselTest的约定且包含了一个main函数,但是又把它放在了源代码树的test文件夹下,我们可以这么执行:

sbt "test:runMain mypacket.MyMainTest"

结语

这一篇介绍了sbt和怎么用sbt构建、运行Chisel项目,还介绍了Chisel项目的源代码组织结构,差不多就可以实践了。但在开始实践之前我们还有两个问题没有解决,一个是怎么生成Verilog代码,另一个是怎么写测试、运行测试。虽然这篇文章还提到了用sbt运行测试,但是怎么写完全不知道。接下来,我们还会有几篇文章,前一篇介绍Chisel怎么生成Verilog代码以及Chisel的工具流,后面几篇介绍怎么写Chisel测试和调试的四种姿势。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

吃透Chisel语言.09.Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行 的相关文章

  • Chisel 语言学习 1 基本数据类型和操作

    Chisel 语言学习 1 基本数据类型和操作 系列文章主要用来记录学习Chisel和scala过程中遇到的难点或知识点 目录 用 TOC 来生成目录 Chisel 语言学习 1 基本数据类型和操作 目录 变量的声明与赋值 数据位操作 截取
  • unresolved dependency: edu.berkeley.cs#firrtl_2.12;1.2-SNAPSHOT: not found

    Machine Environment SBT sbt 1 1 1 Scala scala 2 12 4 IntelliJ IntelliJ IDEA 2018 2 5 Community Edition Build IC 182 4892
  • chisel使用自定义/标准库中的函数简化设计(更新)

    主体内容摘自 https blog csdn net qq 34291505 article details 87905379 函数是编程语言的常用语法 即使是Verilog这样的硬件描述语言 也会用函数来构建组合逻辑 对于Chisel这样
  • RISC-V MCU开发 (七):代码调试

    RISC V MCU开发 七 代码调试 MounRiver Studio MRS 配合GD Link WCH Link JLink等在线调试下载器 可支持GDVFx系列 CH56x CH57x CH58x CH32Fx CH32Vx等RIS
  • 计算机体系结构基础知识介绍之简单回顾原码反码补码

    原码 最高位为符号位 0表示正数 1表示负数 例如 X 0b11 3 四比特表示原码 0011 3 X 0b11 3 四比特表示原码 1011 11 反码 最高位为符号位 0表示正数 1表示负数 正数的反码等于本身 负数的反码除符号位外 各
  • 单周期RISC-V架构CPU的设计---设计篇

    目录 一 模块设计 1 pc reg v 1 1 功能说明 1 2 整体框图 1 3 接口列表 1 4 内部信号说明 1 5 关键电路 2 id v 2 1 功能说明 2 2 整体框图 2 3 接口列表 2 4 内部信号说明 2 5 关键电
  • Chisel 手册 英文版

    Chisel Manual Jonathan Bachrach Huy Vo Krste Asanovi EECS Department UC Berkeley jrb huytbvo krste eecs berkeley edu Apr
  • 计算机体系结构基础知识介绍之缓存性能的十大进阶优化之非阻塞缓存(四)

    优化四 非阻塞缓存 提高缓存带宽 对于允许乱序执行的流水线计算机 处理器不需要因数据高速缓存未命中而停止 例如 处理器可以继续从指令高速缓存获取指令 同时等待数据高速缓存返回丢失的数据 非阻塞高速缓存或无锁高速缓存允许数据高速缓存在未命中期
  • Chisel实验笔记(一)

    最近在学习Risc v 其中伯克利大学开源了一款兼容Risc v指令集的处理器Rocket 而Rocket处理器是采用Chisel编写的 所以要学习Chisel Chisel的简单介绍如下 Chisel Constructing Hardw
  • 玄铁C910总览

    一 开源玄铁C910简介 玄铁C910是由平头哥设计并开源的高性能CPU 基于开源的RISC V指令集 主要面向对性能要求严格的边缘计算领域 如边缘服务器 边缘计算卡 高端机器视觉 高端视频监控 自动驾驶 移动智能终端 5G 基站等 玄铁C
  • 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块

    Chisel模块详解 五 Chisel中使用Verilog模块 上一篇文章讲述了用函数实现轻量级模块的方法 可以大幅度提升编码效率 Chisel中也提供了一些好用的函数 方便我们编写代码 也方便Chisel编译器优化生成的硬件电路 在Chi
  • RISC-V 中 JAL 和 JALR 指令的偏移地址

    在 RISC V 规范中 JAL 和 JALR 指令中的立即数被转换为跳转偏移量 如下所示 将给定立即数符号扩展为 XLEN 位 将 LSB 设置为零 我对此有几个问题 问题1 对于 JAL 这给出了一个范围 000000000000 to
  • Chisel 中的矩阵运算

    Chisel是否支持加法 乘法 转置等矩阵运算 如果没有 实施它们的最佳方法是什么 向量怎么样 Chisel 不支持矩阵运算 它是一种用于编写实现此类操作的硬件生成器的 DSL 有关专用数学硬件生成器的示例 请参阅 Hwacha 硬件矢量单
  • 为什么 RV64 为 32 位操作而不是 64 位操作引入新的操作码

    在浏览 RISC V 规范时 我注意到 64 位版本与 32 位版本的不同之处在于 它 将寄存器扩展至 64 位 更改了指令以作用于整个 64 位范围 添加了执行 32 位操作的新指令 这使得 RV32 代码与 RV64 不兼容 但是 如果
  • Chisel 中的 <> 运算符是什么?

    Chisel 教程使用了看似 lt gt 运算符 对我来说完全陌生 它有什么作用 还有 它从哪里来 该运算符在其他 Scala 库甚至其他语言中是否有约定的含义 以下是 Chisel Generator Bootcamp 练习第 3 2 节
  • 裸机 RISC-V CPU - 处理器如何知道从哪个地址开始获取指令?

    我正在设计自己的 RISC V CPU 并且已经能够实现一些指令代码 我已经安装了 RV32I 版本的 GCC 编译器 所以我现在有了汇编器riscv32 unknown elf as可用的 我正在尝试仅用一条指令来汇编一个程序 simpl
  • RISC V手册混淆:指令格式VS立即数格式

    我有一些与 RISC V 手册相关的问题 它有不同类型的指令编码 如R型 I型 就像MIPS编码一样 R type 31 25 24 20 19 15 14 12 11 7 6 0 funct7 rs2 rs1 funct3 rd opco
  • Chisel3:对 Vector IO 的多位切片的部分分配

    可以对向量 IO 进行部分赋值 如下所示 import chisel3 class example 1 extends Module val io IO new Bundle val in1 Input Vec 4 Bool val out
  • 机器模式下mret和ret指令有什么区别?

    当RISC V核心工作在机器模式时 mret和ret指令有什么区别吗 ret is a pseudoinstruction which actually is a jalr instruction while mret is a real
  • RISC-V 调用约定的 ABI 寄存器名称

    我对 RISC V ABI 寄存器名称感到困惑 例如 第 85 页的 RISC V 指令集手册 第一卷 用户级 ISA 版本 2 0 中的表 18 2 指定堆栈指针sp正在注册x14 然而 指令 addi sp zero 0 由 riscv

随机推荐

  • 安装和使用Atom编辑器

    atom编辑器是一个Github出品的现代的 可扩展的编辑器 和古老的Vim Emacs相比 atom具有诸多优点 一是出现较晚 可以使用最新出现的各种技术 二来atom使用web技术构建而成 广大的web开发者可以很容易的为atom编写扩
  • shell脚本指定环境启动jar包

    路径说明 opt路径下配置脚本api run sh 并在该路径下创建文件夹envment 上传jar包至envment下 opt api run sh envment java jar 启动命令 sh opt api run sh rest
  • 【第19例】IPD开发流程

    目录 前言 专栏目录 详细内容 华为流程体系列表 CSDN学院 作者简介 前言 今天 IPD体系进阶100例 就更新到了第 19 例 在 第16例 中讲到了 IPD
  • Slowloris dos攻击的原理及防护

    反射攻击已经成为DDoS攻击的主要方式 在一些博客中也有论述 最为常用的当属ddos反射放大攻击 但是如今 受政策影响 反射式攻击放缓 2018年 平均每个月反射攻击下降了0 93万次 非反射攻击增加了0 35万次 Slowloris do
  • 计算机网络 IP多播

    IP 多播的基本概念 IP 多播 multicast 以前曾译为组播 已成为互联网的一个热门课题 目的 更好地支持一对多通信 一对多通信 一个源点发送到许多个终点 例如 实时信息的交付 如新闻 股市行情等 软件更新 交互式会议及其他多媒体通
  • vue 列表中默认显示几条数据,点击展示全部

    思路 1 获取接口数据的时候 给每一条数据都新增一个showmore false 变量 2 显隐展示 新增一个常量默认展示几条 判断showmore false 展示几条 为true展示全部 3 点击每一项的时候 展示隐藏问题 使用this
  • 第一篇 Spring Cloud Alibaba入门

    1 为什么会出现Spring Cloud Alibaba 1 1Spring Cloud Netflix项目进入维护模式 官网说明地址 https spring io blog 2018 12 12 spring cloud greenwi
  • 目标检测任务简述

    目标检测竟然也可以说是一个比较上游的任务了 以此为基础的下游任务可以是环境感知 自动驾驶 人体关键点检测等 与图像分类的区别 目标检测物体数量不固定 位置不固定 大小不固定 分类一般都是一张图片中是一个物体 位置在正中间 大小占整张图片的大
  • 腾讯云服务器opencloudos8.6 安装 redis

    下载 先检查安装redis的gcc环境有没有 说明gcc已经自己就装有了 下面是安装gcc 的指令 除了这个之外 也可以使用 gcc安装 yum y install gcc automake autoconf libtool make 自动
  • c++11 std::lock函数模板总结

    一 std lock概念 可以一次锁住两个或者两个以上的互斥量 最少锁两个 优点 它不存在这种因为多个线程中因为锁的顺序问题导致死锁的风险问题 std lock 不会存在死锁的原因 比如std lock g i mutex g j mute
  • STL ---- list 使用

    目录 初始化 追加和删除 迭代器 常用的常量 插入数据 删除数据 其他函数 初始化 使用assign函数初始化 l num assign 3 5 l data assign 1 2 3 4 或者定义的时候就初始化 list
  • sqlilab学习打卡

    less 46 order by 如题 显然这一类题目的注入点在order by处 分别测试了sort 1 2 3 4 发现有回显有报错信息 不过这一关回显的内容不是可以被利用的地方 因此只能使用报错注入 盲注 因为之前从来没有接触过这类
  • Unity3D中的Coroutine详解

    本文太乱 推荐frankjfwang的 全面解析Coroutine技术 Unity中的coroutine是通过yield expression 来实现的 官方脚本中到处会看到这样的代码 疑问 yield是什么 Coroutine是什么 un
  • ESXI 中的虚拟机导出到本地

    ovftool exe工具 在windows如已经安装vmware workstation 在安装目录下有个OVFTool目录直接可使用 例如 C Program Files x86 VMware VMware Workstation OV
  • circos - Session 2 - Lesson 2 - Histograms

    create data track draw a histogram which is a plot type track Two kinds of data tracks plots and links create an image w
  • c/c++游戏逆向驱动开发,游戏辅助保护盾

    功能介绍 1 降低游戏权限 提升游戏权限 禁止游戏后台截图 2 保护进程 隐藏进程 进程内存不被读取 如图 部分功能展示 程序降权 NTSTATUS ChangeHandleAccessState ULONG ulProcessId ULO
  • C++,对于数据结构相同但数据处理方式不同的两种类,可以用虚函数列表地址进行区分和相互转化。

    举个简单的例子 一个数据可能是整型的 也可能是浮点数 在运行过程中 类型有可能发生变化 如果统一用浮点数表示 那么整型的取值范围就会变小 如果要兼顾整型的取值范围 一般来说 就得使用更多的空间来表示浮点数或者数的类型 今天突发奇想 直接用虚
  • 思维导图在Ubuntu下的安装与使用

    FreeMind是一款跨平台的 基于GPL协议的自由软件 用Java编写 是一个用来绘制思维导图的软件 其产生的文件格式后缀为 mm 可用来做笔记 脑图记录 脑力激汤等 Ubuntu下只需要在终端输入 sudo apt get instal
  • 设置docker容器镜像加速器(阿里云)

    为了加速Docker容器的拉取 我们可以设置Docker容器镜像加速器 以阿里云镜像加速器为例 您可以按照以下步骤进行设置 1 登录阿里云容器镜像服务 登录阿里云容器镜像服务 注册账号并登录 进入容器镜像服务管理控制台 2 获取镜像加速器地
  • 吃透Chisel语言.09.Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行

    Chisel项目构建 运行和测试 一 用sbt构建Chisel项目并运行 上一大部分介绍了Chisel的基础语法 但除了教程开始的Demo以外 我们还没有开始写Chisel代码 这对于学习编程语言来说是大忌 不过好在Chisel基础语法部分