第⼗六章Chisel⼊门——搭建开发环境⽤于编写Chisel的Scala内容已经全部讲完了,下⾯就可以正式进⼊Chisel的学习之旅了。有兴趣的读者也可以⾃⾏深⼊研究Scala 的其它⽅⾯,不管是⽇后学习、⼯作,或是研究Chisel发布的新版本,都会有不少的帮助。
在学习Chisel之前,⾃然是要先讲解如何搭建开发环境。因为⽬前还没有Windows系统的开发环境,所以读者最好有⼀个Linux系统的虚拟机,或者Mac OS的电脑。在这⾥,笔者以使⽤⼴泛的Ubuntu 16.04作为开发平台进⾏讲解。
⼀、Chisel的安装步骤
⾸先⾃然是要保证已经安装好了Scala。对于如何安装Scala,这⾥就不再赘述,可以参考第⼆章。接下来,执⾏以下安装步骤:
①安装Sbt。以下所有安装都只需要默认版本,通过命令安装即可。如果需要特定的版本,读者可以⾃⾏下载安装包安装。打开终端,执⾏命令:
esperanto@ubuntu:~$ sudo apt-get install sbt
等待安装完成后,可以⽤命令查看sbt的版本:
esperanto@ubuntu:~$ sbt sbtVersion
[info] Loading project definition from /home/esperanto/project
[info] Set current project to esperanto (in build file:/home/esperanto/)
[info] 1.2.6
②安装Git,系统可能已经⾃带了。执⾏命令:
esperanto@ubuntu:~$ sudo apt-get install git
esperanto@ubuntu:~$ git --version
git version 2.7.4
③安装Verilator。执⾏命令:
esperanto@ubuntu:~$ sudo apt-get install verilator
esperanto@ubuntu:~$ verilator -version
Verilator 3.904 2017-05-30 rev verilator_3_904
④从GitHub上克隆⼀个chisel-template⽂件夹。在想要安装chisel的⽬录下执⾏命令:
这个⽂件夹就是⼀个⼯程⽂件,它已经⾃带了Chisel 3.1.3。如果读者不想使⽤新版本的Chisel,那么在这个⼯程⽂件下编写代码也已经⾜够了。如果想⽤更新的版本,则继续下⾯的步骤。
⑤安装Firrtl。在想要安装chisel的⽬录下执⾏命令:
克隆完成后,cd命令会把终端路径切换到firrtl⽂件夹下,在该路径下执⾏编译命令:
esperanto@ubuntu:~/firrtl$ sbt compile
编译完成后,执⾏测试命令:
esperanto@ubuntu:~/firrtl$ sbt test
测试通过后,执⾏汇编命令:
esperanto@ubuntu:~/firrtl$ sbt assembly
汇编完成后,推送到本地缓存:
esperanto@ubuntu:~/firrtl$ sbt publishLocal
测试步骤容易出错,多半是虚拟机的⽹络不好导致克隆下来的⽂件有缺失。如果上述步骤都正确完成了,则可以查看firrtl的版本:
esperanto@ubuntu:~/firrtl$ cd ~/.ivy2/local/edu.berkeley.cs/ && ls
chisel3_2.12 firrtl_2.12
⑥安装chisel3,步骤与firrtl类似。在想要安装chisel的⽬录下执⾏以下命令:
esperanto@ubuntu:~/chisel3$ sbt compile
esperanto@ubuntu:~/chisel3$ sbt test
esperanto@ubuntu:~/chisel3$ sbt publishLocal
esperanto@ubuntu:~/chisel3$ cd ~/.ivy2/local/edu.berkeley.cs/ && ls
如果所有命令都成功,就能看见chisel3的缓存。
⑦仍然把第④步克隆的chisel-template⽂件夹作为⼯程⽂件,但是⾥⾯的build.sbt⽂件改成以下内容:
// build.sbt
def scalacOptionsVersion(scalaVersion: String): Seq[String] = {
Seq() ++ {
// If we're building with Scala > 2.11, enable the compile option
// switch to support our anonymous Bundle definitions:
// github/scala/bug/issues/10047
CrossVersion.partialVersion(scalaVersion) match {
case Some((2, scalaMajor: Long)) if scalaMajor < 12 => Seq()
case _ => Seq("-Xsource:2.11")
}
}
}
def javacOptionsVersion(scalaVersion: String): Seq[String] = {
Seq() ++ {
// Scala 2.12 requires Java 8. We continue to generate
// Java 7 compatible code for Scala 2.11
// for compatibility with old clients.
CrossVersion.partialVersion(scalaVersion) match {
case Some((2, scalaMajor: Long)) if scalaMajor < 12 =>
Seq("-source", "1.7", "-target", "1.7")
case _ =>
Seq("-source", "1.8", "-target", "1.8")
}
}
}
name := "MyChisel"
version := "3.2-SNAPSHOT"
scalaVersion := "2.12.6"
crossScalaVersions := Seq("2.11.12", "2.12.4")
resolvers += "My Maven" at "raw.githubusercontent/sequencer/m2_repository/master"
// bug fix from github/freechipsproject/chisel3/wiki/release-notes-17-09-14
scalacOptions ++= Seq("-Xsource:2.11")
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.2-SNAPSHOT"
libraryDependencies += "edu.berkeley.cs" %% "chisel-iotesters" % "1.2.+"
libraryDependencies += "edu.berkeley.cs" %% "chisel-dot-visualizer" % "0.1-SNAPSHOT"
libraryDependencies += "edu.berkeley.cs" %% "rocketchip" % "1.2"
scalacOptions ++= scalacOptionsVersion(scalaVersion.value)
javacOptions ++= javacOptionsVersion(scalaVersion.value)
⼆、Chisel的使⽤⽅法
克隆的chisel-template⽂件夹可以修改成想要的名字。该⽂件夹下的src⽂件夹⽤于存放⼯程的源代码。src⽂件夹下⼜有main和test两个⽂件夹,其中main⽤于存放Chisel的设计部分,test⽤于存放对应的测试⽂件和⽣成电路的主函数。main⽂件夹下⼜有resources和scala两个⽂件夹,其中scala⽂件夹⾥可以创建⾃定义的⼯程⽂件进⾏编写,也可以继续创建多个⽂件夹来按模块存储不同功能的设计⽂件,⽽resources⽂件夹⽤于存放与Chisel互动的Verilog等外部⽂件。test⽂件下只有⼀个scala⽂件夹,在scala⽂件夹⾥创建⾃定义的测试⽂件和主函数⽂件。
在编写代码时,可⽤的编辑器可以选择⾃带的gedit。笔者习惯使⽤Visual Studio Code,因为可以⼀边写代码⼀边使⽤集成终端,⽽且应⽤商店⾥可以下载到Chisel语法的扩展应⽤。
也可以使⽤IDE⼯具IntelliJ IDEA。⾸先需要安装好Scala插件,然后在开始界⾯选择导⼊⼯程,并把chisel-template指定为⼯程⽂件夹,在下⼀个页⾯选择“Import project from external model”并从列表⾥选择Sbt为外部模型,最后确定即可。
三、编写⼀个简单的电路
在chisel-template/src/main/scala⽂件夹⾥创建⼀个⽂件,命名为AND.scala,输⼊以下内容并保存:
// AND.scala
package test
import chisel3._
perimental._
class AND extends RawModule {
val io = IO(new Bundle {
val a = Input(UInt(1.W))
val b = Input(UInt(1.W))
val c = Output(UInt(1.W))
})
io.c := io.a & io.b
}
在chisel-template/src/test/scala⽂件夹⾥创建⼀个⽂件,命名为ANDtest.scala,输⼊以下内容并保存:
scala不是内部或外部命令// ANDtest.scala
package test
import chisel3._
object testMain extends App {
}
在chisel-template⽂件夹下(与⽂件build.sbt同⼀路径)打开终端,执⾏命令:
esperanto@ubuntu:~/chisel-template$ sbt "test:stMain --target-dir generated/and"
当最后输出success时,就会在当前路径⽣成⼀个generated⽂件夹,⾥⾯有⼀个and⽂件夹。and⽂件夹⾥包含了三个最终输出的⽂件,打开其中的AND.v⽂件,可以看到⼀个与门的Verilog代码:
module AND(
input io_a,
input io_b,
output io_c
);
assign io_c = io_a & io_b;
endmodule
对于⼩规模电路,可以直接⽤Chisel写testbench⽂件,然后联合Verilator⽣成C++⽂件来仿真,输出波形图。该⽅法会在后续章节介绍。对于⼤规模电路,Verilator仿真很吃⼒,建议还是⽤⽣成的Verilog⽂件在专业EDA⼯具⾥仿真。当前Chisel不⽀持UVM,也没有⼯具⽀持Chisel,所以尽量⽤别的⼯具做测试。
四、总结
本章介绍了Chisel开发环境的搭建,搭建完毕后就可以⽤Chisel代码⽣成电路了。后续章节将逐步讲解Chisel的语法,由于内容较为分散,不能很快就完成模块级的讲解,所以前⾯的内容⽆法及时运⾏验证,读者只需要理解⽂中提供的⽰例即可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论