Chisel實驗筆記(一)
最近在學習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
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進行模擬及波形檢視