最近在学习Risc-v,其中伯克利大学开源了一款兼容Risc-v指令集的处理器Rocket,而Rocket处理器是采用Chisel编写的,所以要学习Chisel,Chisel的简单介绍如下:
Chisel (Constructing Hardware In a Scala Embedded Language).
Chisel is a hardware construction language embedded in the high-level programming language Scala
可以认为与VHDL、Verilog HDL功能相同,都是用来编写实现硬件电路的,但是Chisel由于基于Scala,所以具有Scale的一些特性,可能便于开发。采用Chisel编写的代码,会被编译为verilog文件,还有C++文件,其中后者可以直接进行模拟。
本文主要以一个实验说明Chisel的使用步骤,实验平台是Ubuntu14.04(64位)。
(1)安装sbt
在http://www.scala-sbt.org/下载sbt0.13.8,解压到一个路径下,比如/home/riscv/riscv/sbt,将其中的bin路径添加到环境变量PATH中,如下:
gedit ~/.bashrc
在最后一行添加如下:
exportPATH=/home/riscv/riscv/sbt/bin/:$PATH
保存,然后记得source,如下:
source ~/.bashrc
(2)建立Chisel工程
新建一个文件夹chisel_max,在其中新建文件max2.scala、build.sbt,其中build.sbt的内容如下(注意两行之间空一行):
resolvers ++= Seq("scct-github-repository" at "http://mtkopone.github.com/scct/maven-repo" ) libraryDependencies += "edu.berkeley.cs" %% "chisel" % "latest.release"
max2.scala的内容如下,这是一个比较器,从两个8位的输入中,选择一个较大的数,作为输出:
import Chisel._ class Max2 extends Module { val io = new Bundle { val in0 = UInt(INPUT, 8) val in1 = UInt(INPUT, 8) val out = UInt(OUTPUT, 8) } io.out := Mux(io.in0 > io.in1, io.in0, io.in1) } object Hellp { def main(args: Array[String]) : Unit={ val margs=Array("--backend","v","--compile") chiselMain(margs, () => Module(new Max2())) } }
(3)编译得到verilog文件
在终端下进入上面的chisel_max目录,输入sbt,会下载相关的依赖包,等待较长的时间,如果期间长时间没有反应,那么可以按Ctrl+C,然后重新输入sbt,最后会给出>符号,表示可以进行下一步了,此时输入run,即可得到对应的verilog文件。
得到的verilog代码位于文件Max2.v中,内容如下:
module Max2( input [7:0] io_in0, input [7:0] io_in1, output[7:0] io_out ); wire[7:0] T0; wire T1; assign io_out = T0; assign T0 = T1 ? io_in0 : io_in1; assign T1 = io_in1 < io_in0; endmodule
上面的verilog代码实现的正是比较器的功能。
接下来可以仿真,下一篇将讲解如何使用Icrus verilog、Gtkwave进行仿真及波形查看