『chisel』通过最小项目理解 Chisel 项目结构

news/2024/10/4 19:59:17/文章来源:https://www.cnblogs.com/Chorolop/p/18447183

本文写于 2024年10月4日,此时 chisel 最新版本为 6.5.0 。

Overview

Chisel (Constructing Hardware In a Scala Embedded Language) 是新兴的硬件描述语言,是采用Scala作为基础、利用chisel第三方库的Domain Specific Language。本文记录了一次从github上的模板工程开始跑通一个最小Chisel工程以获得Verilog的过程。

获取 Github repo

首先通过这个链接获取 Github 项目模板并跟随指引部署到自己的 Github 仓库:Chisel Project Template
我把基于这个模板新建的repo命名为: chisel_helloworld 。这个仓库包含很多东西,其中我们需要关注的内容有:

chisel_helloworld
├── ...
├── README.md
├── src
│   ├── main
│   │   └── scala
│   │       ├── gcd
│   │       │   ├── DecoupledGCD.scala
│   │       │   └── GCD.scala
│   │       └── misc
│   │           └── Hello.scala
│   └── test
│       └── scala
│           └── gcd
│               └── GCDSpec.scala
├── build.sbt
└── build.sc

其中 src/main/scala/misc/Hello.scala 是我添加的文件,其内容为:

package misc/** This code is a minimal hardware described in Chisel.* * Blinking LED: the FPGA version of Hello World*/
import chisel3._/*** The blinking LED component.*/
class Hello extends Module {val io = IO(new Bundle {val led = Output(UInt(1.W))})val CNT_MAX = (50000000 / 2 - 1).Uval cntReg = RegInit(0.U(32.W))val blkReg = RegInit(0.U(1.W))cntReg := cntReg + 1.Uwhen(cntReg === CNT_MAX) {cntReg := 0.UblkReg := ~blkReg}io.led := blkReg
}/*** An object extending App to generate the Verilog code.*/
object Hello extends App {emitVerilog(new Hello())
}

这份代码来自 chisel-example 。我修改了两处:

  • 第一行的 package misc :在同一个 package 里面可以有很多份代码,会在后面再讨论这件事情
  • 倒数第二行的 emitVerilog(new Hello()) :顾名思义,这里是构建产生 .vverilog 文件的语句,其完整API路径是 chisel3.emitVerilog ,由于我们有一个 import chisel3._ 因此这里可以直接使用

构建项目得到 verilog 文件

Scala的构建工具有两个,一个是 SBT ,另一个是 mill 。从上面的文件目录树里可以看到有 build.sbtbuild.sc 两个文件,前者是 SBT 的配置文件,后者是 mill 的配置文件。只要有 build.sbt 就可以使用 SBT 进行构建;使用 mill 的项目则常常同时具有 build.sbtbuild.sc 。这两个文件是项目配置文件,打开 build.sbt 就能看到所用 Scala 以及 Chisel 的版本信息。
上面这个项目中的 build.sbt 文件长这样:

// See README.md for license details.ThisBuild / scalaVersion     := "2.13.12"
ThisBuild / version          := "0.1.0"
ThisBuild / organization     := "com.github.playasmegumin"val chiselVersion = "6.2.0"lazy val root = (project in file(".")).settings(name := "chisel_helloworld",libraryDependencies ++= Seq("org.chipsalliance" %% "chisel" % chiselVersion,"org.scalatest" %% "scalatest" % "3.2.16" % "test",),scalacOptions ++= Seq("-language:reflectiveCalls","-deprecation","-feature","-Xcheckinit","-Ymacro-annotations",),addCompilerPlugin("org.chipsalliance" % "chisel-plugin" % chiselVersion cross CrossVersion.full),)

可以看到这里的 Chisel 版本是 6.2.0 。Chisel 的版本迭代非常快,在跑网络上的 demo 时如果出现编译问题请查看对应版本的 Chisel API ,链接在这: Docs - chisel-lang
因为没搞明白 mill 怎么使,这里我用的是 SBT ,直接在项目根目录运行 sbt run 即可。

$ sbt run
[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 17.0.12)
[info] loading settings for project chisel_helloworld-build from plugins.sbt ...
[info] loading project definition from /home/duzelong/ysyx/chisel/chisel_helloworld/project
[info] loading settings for project root from build.sbt ...
[info] set current project to chisel_helloworld (in build file:/home/duzelong/ysyx/chisel/chisel_helloworld/)
[info] compiling 1 Scala source to /home/duzelong/ysyx/chisel/chisel_helloworld/target/scala-2.13/classes ...Multiple main classes detected. Select one to run:[1] gcd.GCD[2] misc.HelloEnter number:

因为在 src/main/scala 下面有两个 “包” :

└── src   └── main       └── scala           ├── gcd           │   ├── DecoupledGCD.scala           │   └── GCD.scala           └── misc               └── Hello.scala

所以这里 SBT 给了我们两个选项,一个是 gcd 包的 GCD ,另一个是 misc 包的 Hello 。这里需要辨析一下,包的归属和目录结构没有什么关系,主要是在 GCD.scalaHello.scala 分别用 package gcdpackage misc 定义了各自所属的包名。文件夹结构可以随你喜欢的设置,不会有很大的影响。一开始我还尝试了这样的放置方法:

└── src   └── main       └── scala           ├── gcd           │   ├── DecoupledGCD.scala           │   └── GCD.scala           └── Hello.scala

也并不影响文件和 package 的从属关系,这个 package 事实上很像命名空间。如果采用下面的目录结构,同时删除 src/main/scala/Hello.scalapackage misc

└── src   └── main       └── scala           ├── gcd           │   ├── DecoupledGCD.scala           │   └── GCD.scala           ├── misc           │   └── Hello.scala           └── Hello.scala         

则运行 sbt run 后会显示:

$ sbt run
[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 17.0.12)
[info] loading settings for project chisel_helloworld-build from plugins.sbt ...
[info] loading project definition from /home/duzelong/ysyx/chisel/chisel_helloworld/project
[info] loading settings for project root from build.sbt ...
[info] set current project to chisel_helloworld (in build file:/home/duzelong/ysyx/chisel/chisel_helloworld/)
[info] compiling 1 Scala source to /home/duzelong/ysyx/chisel/chisel_helloworld/target/scala-2.13/classes ...Multiple main classes detected. Select one to run:[1] Hello[2] gcd.GCD[3] misc.HelloEnter number:

可见,在不同包里的 Hello 模块不会互相冲突,但是如果两个 Hello.scala 中都有 package misc ,则会下面的结果:

$ sbt run
[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 17.0.12)
[info] loading settings for project chisel_helloworld-build from plugins.sbt ...
[info] loading project definition from /home/duzelong/ysyx/chisel/chisel_helloworld/project
[info] loading settings for project root from build.sbt ...
[info] set current project to chisel_helloworld (in build file:/home/duzelong/ysyx/chisel/chisel_helloworld/)
[info] compiling 1 Scala source to /home/duzelong/ysyx/chisel/chisel_helloworld/target/scala-2.13/classes ...
[info] compiling 2 Scala sources to /home/duzelong/ysyx/chisel/chisel_helloworld/target/scala-2.13/classes ...
[error] /home/duzelong/ysyx/chisel/chisel_helloworld/src/main/scala/misc/Hello.scala:14:7: Hello is already defined as class Hello
[error] class Hello extends Module {
[error]       ^
[error] /home/duzelong/ysyx/chisel/chisel_helloworld/src/main/scala/misc/Hello.scala:34:8: Hello is already defined as object Hello
[error] object Hello extends App {
[error]        ^
[error] two errors found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 2 s, completed 2024年10月4日 下午7:29:02

就是很经典的符号冲突错误。
接上面的步骤,我们运行 sbt run 后选择 misc.Hello ,则有:

$ sbt run
[info] welcome to sbt 1.9.7 (Eclipse Adoptium Java 17.0.12)
[info] loading settings for project chisel_helloworld-build from plugins.sbt ...
[info] loading project definition from /home/duzelong/ysyx/chisel/chisel_helloworld/project
[info] loading settings for project root from build.sbt ...
[info] set current project to chisel_helloworld (in build file:/home/duzelong/ysyx/chisel/chisel_helloworld/)
[info] compiling 2 Scala sources to /home/duzelong/ysyx/chisel/chisel_helloworld/target/scala-2.13/classes ...Multiple main classes detected. Select one to run:[1] Hello[2] gcd.GCD[3] misc.HelloEnter number: 3
[info] running misc.Hello 
[success] Total time: 10 s, completed 2024年10月4日 下午7:31:03

然后会在根目录里发现多了一个 Hello.sv ,里面就是我们需要的 Verilog 代码,至此本文的目的就达成了。

Others

当然这里还有其他几个值得细究的点。

在哪里都能运行 sbt run 吗?

目前看来是不行,如果在 src/ 目录下运行 sbt run 就会有这样的后果:

src$ sbt run
[warn] No sbt.version set in project/build.properties, base directory: /home/duzelong/ysyx/chisel/chisel_helloworld/src
[info] welcome to sbt 1.10.2 (Eclipse Adoptium Java 17.0.12)
[info] set current project to src (in build file:/home/duzelong/ysyx/chisel/chisel_helloworld/src/)
[error] java.lang.RuntimeException: No main class detected.
[error] 	at scala.sys.package$.error(package.scala:30)
[error] stack trace is suppressed; run last Compile / bgRun for the full output
[error] (Compile / bgRun) No main class detected.
[error] Total time: 1 s, completed 2024年10月4日 下午7:32:24

看来在哪里运行 sbt runSBT 就会把哪里当作项目的根目录。

生成 Hello.sv 的位置可以改吗?

在项目根目录运行 sbt run 的时候就会在根目录生成 Hello.sv 。我猜测是直接把输出文件生成在了运行 sbt run 的目录。但是实际上只能在项目根目录运行 sbt run ,因此我的猜测没什么意义。
如果要修改生成 verilog 文件的路径,可能需要深入 SBT 的构建脚本,那就之后再看。

生成 verilog 文件的项目组件是什么?

似乎是用 FIRRTL 生成的,可以再看看。这块应该是 Chisel 自身的特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808046.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息学奥赛复赛复习11-CSP-J2020-04方格取数-动态规划、斐波那契数列、最优子结构、重叠子问题、无后效性

PDF文档公众号回复关键字:202410041 P7074 [CSP-J2020] 方格取数 [题目描述] 设有 nm 的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的…

python相平面 图形

二阶非线性自治系统绘制相平面图。假设我们有一个简单的阻尼摆系统,其状态方程可以表示为: \[ dx1/dt = x2 \\dx2/dt = -cx2 - gsin(x1) \] import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint # 定义系统的状态方程 def pendu…

帝国CMS7.2/7.5移动端/手机端/多终端访问设置图文教程

​随着PC互联网与移动互联网的不断融合、以及各类移动访问终端增加,网站移动互联越来越重要了,所以帝国CMS7.2/7.5版本在原来版本的多访问终端功能基础上,做出更多的改进,让网站多种移动访问端制作更加方便。下面我们来讲解帝国CMS7.2版本的“多终端访问功能”使用:新增网…

这可能是最全的输入法教程了

这个教程能让你打字速度更快,体验更好输入法是我们离不开的软件,如果要评选用户最常使用的工具类应用,输入法一定名列前茅。 由于输入法实在太常用了,我们往往会忽略它:我用自带的输入法就行,打几个字,用的着琢磨吗? 实则不然,输入法软件有很多,也有很多进阶用法,这…

【极客大挑战2023】- Re -点击就送的逆向题 WriteUp

这道题给了一个.s文件 解决方案有两个: 1.利用gcc编译成可执行文件,然后反编译生成伪代码 2.直接分析汇编(我不会。。。) 1.利用gcc编译成可执行文件 linux执行gcc -o 1.s 1 IDA打开,分析并编写,注意一定要在字符串末尾加上\0结束符!!!点击查看代码 #include <stdi…

day11[Lagent 自定义你的 Agent 智能体]

环境配置 开发机选择 30% A100,镜像选择为 Cuda12.2-conda。 首先来为 Lagent 配置一个可用的环境。Lagent Web Demo 使用 使用 Lagent 的 Web Demo 来体验 InternLM2.5-7B-Chat 的智能体能力 先使用 LMDeploy 部署 InternLM2.5-7B-Chat,并启动一个 API Server然后,我们在另…

补题报告4

背景 CSP-J模拟赛 考得最好的一次得分 \(T1\): \(AC\) \(T2\): \(AC\) \(T3\): \(0\) \(T4\): \(20\)\(T1\) 三个 (\(Three\)) 赛时\(AC\) 概述 \(A,B,C\)三种微生物,他们会繁殖,在每分钟: 每个 \(A\) 可繁殖出一个\(A\),一个\(B\),一个\(C\) 每个 \(B\) 可繁殖出两个\(A\…

9-贪心算法

参考:代码随想录 题目分类大纲如下:贪心算法理论基础 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心的套路(什么时候用贪心) 贪心算法并没有固定的套路,说白了就是常识性推导加上举反例。靠自己手动模拟,如果模拟可行,就可以试一试贪心策略…

【VMware VCF】使用 SoS 实用程序检查 VCF 环境的运行状态以及收集组件的日志信息。

VMware Cloud Foundation 解决方案中有一个叫 Supportability and Serviceability(SoS)可支持性和可维护性的实用程序,可能你在初始构建 VCF 管理域的时候使用过这个工具,当时使用这个工具在 VMware Cloud Builder 虚拟机中将用于部署的 VCF 管理域的 Excel 参数表转换为 J…

PbootCMS数据库配置,修改为Mysql数据库,配置Mysql出错解决办法

如果你在将PbootCMS从SQLite切换到MySQL时遇到了连接问题,可以按照以下步骤进行排查和解决: 步骤 1: 修改数据库连接驱动类型 确保你正确地修改了数据库连接驱动类型。PbootCMS支持多种数据库驱动,你可以逐一尝试不同的驱动类型。 步骤 2: 修改数据库服务器地址 将数据库服务…

pbootcms模板后台编辑器无法上传图片提示:后端配置项没有正常加载,上传插件不能正常使用!

针对 PbootCMS 中 UEditor 编辑器单图片上传按钮无反应以及多图片上传提示“后台配置项返回格式出错,上传功能将不能正常使用!”的问题,可以按照以下步骤进行排查和修复。 1. 修改时区设置 首先,根据你提供的信息,时区设置可能存在问题。请按照以下步骤修改时区设置:打开…

第八届2024御网杯WP

WEBinput_data使用工具https://github.com/kost/dvcs-ripper./rip-svn.pl -u http://101.200.58.4:10005/.svn下载下来.svn目录然后查看结构发现几个文件cd进去目录,然后cat 文件名字即可看到 flag{5674938f-803d-4c41-8f84-a77f5164bb4f}Flag: flag{5674938f-803d-4c41-8f84…