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

没有更多推荐了,返回首页