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.scalabuild.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進行仿真及波形查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章