最近在學習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進行仿真及波形查看