Chisel入门(一)------搭建Chisel开发环境

0 概述

    之前在windows环境下简单学习了Scala的基本语法,并在windos环境下安装了JVM环境和Scala编译器,运行了一些简单的Scala程序。今天开始正式搭建Chisel开发环境和学习Chisel,同时为了有利于后续的学习和开发,也是因为Chisel的工作环境对windows不太友好,所以后续的开发都会在linux上进行。

    我这里选择的是使用的VMware搭建的虚拟机环境,版本为ubuntu 22.04,如果不确定版本号的可以使用

lsb_release -a

进行查询。虚拟机的安装等等网上资源很多就不赘述了。

1 安装sbt

     sbt(scala build tool)的Github网址:sbt Reference Manual — sbt Reference Manual (scala-sbt.org)

有兴趣的,可以在主页上查看,上边介绍的也很详细。大概的安装步骤包括:

  • 安装JDK(推荐使用JDK8, 11或17版本)
  • 安装sbt并运行
  • 建立一个简单的“hello world”工程
  • 学习如何使用sbt
  • 到.sbt的构建定义下去了解更多关于构建的更多信息

1.1 安装JDK

    安装JDK有两种方法,第一种方式是通过AdoptOpenJDK来安装,需要输入命令

sudo apt install openjdk-8-jdk git make gtkwave

即可。

    另一种方法是通过SDKMAN来安装和管理多个JDK版本,这也是sbt官网推荐的方法,它最大的好处就是可以使用sdk来直接安装sbt,非常的方便,但是经过多次尝试,一直无法成功安装SDKMAN,尽管SDKMAN和现有网站资料上都给出了一些教程,但都不外乎

curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk version

sdk list java            //查询sdk支持的java版本
sdk install java         //安装最新的java版本
sdk install java ****    //安装指定版本

这些,在亲自尝试了多次之后:

    首先是发现22.04版本没有预装curl,安装后再次运行遇到了各种各样的报错信息,先是无法连接github.com,增加hosts之后仍报错

curl: (56) Recv failure: Connection reset by peer 

多次尝试无果后改为第一种直接安装JDK 8的方式,随后再单独安装sbt,如果有安装成功SDKMAN的非常希望可以给出一些建议,指出问题,感激不尽!

1.2 安装sbt

    这里选择使用deb的形式安装,这里sbt - Download (scala-sbt.org)

也给出了其他安装更详细的教程。

echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | sudo tee /etc/apt/sources.list.d/sbt.list
echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | sudo tee /etc/apt/sources.list.d/sbt_old.list
curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo apt-key add
sudo apt-get update
sudo apt-get install sbt

这里,作者亲自一一尝试过是可以完成安装的!

1.3 运行Scala程序

    运行第一个Scala程序,从Hello world开始,新建一个文件夹中新建一个文件可以叫“hello.scala”,里边输入

object HelloScala extends App{
println("Hello Chisel World!")
}

然后在当前文件夹下运行

sbt run

第一次运行可能需要花费比较长的时间,我这里话费了大概25分钟左右,因为第一次需要下载和编译很多链接,等之后几次再编译就快很多了。

 可以看到,这里已经输出了Hello Chisel World,说明sbt已经成功安装完成了。

    同时要注意,这仅仅是一个Scala代码并不是一个完整的Chisel代码,Chisel也仅是Scala中的一个库,要想正确使用并运行Chisel,还需要进行一些操作,如下。

2 安装一个开发工具

    前边反复说到,Chisel其实就是Scala中的一个库,所有Scala的语法都能在Chisel上运行,而且Chisel也是依赖于Scala的编译工具的,所以实际上所有可用于Scala编写管理的开发工具都适用于Chisel,可以是使用一个文本编译器如gvim或vscode这类,也可以选择可以联想语法的IDEA。这其中安装一个自己比较喜欢的就可以了。

2.1 安装IDEA

    网络上相关资源已经非常多了,给一个我觉得还不错的链接:Linux系统安装IDEA保姆级教程_linux安装idea_囧囧JOJO的博客-CSDN博客

2.2 安装VSCODE

    同样,VSCODE的安装也非常的多:linux安装vscode_wasApp的博客-CSDN博客

3 运行一个Chisel的“Hello World”

    之前学习C语言之类的软件描述语言的第一个程序一般都是“Hello World”,而使用硬件如单片机或FPGA则常常是点亮一个LED灯,所以本小节简单运行一个使用Chisel语言描述的LED闪烁程序。

3.1 下载实例程序

    schoeberl/chisel-examples: Chisel examples and code snippets (github.com)

是官方收集的一个Chisel实例程序集合,我们首先要做的就是从Github上下载示例程序

git clone https://github.com/schoeberl/chisel-examples.git

之后进入示例程序:

cd chisel-examples/hello-world/

然后可以使用VSCODE等文本编译器在src/main/scala中查看源码,

/*
 * This code is a minimal hardware described in Chisel.
 * 
 * Blinking LED: the FPGA version of Hello World
 */

import chisel3._

/**
 * The blinking LED component.
 */

class Hello extends Module {
  val io = IO(new Bundle {
    val led = Output(UInt(1.W))
  })
  val CNT_MAX = (50000000 / 2 - 1).U

  val cntReg = RegInit(0.U(32.W))
  val blkReg = RegInit(0.U(1.W))

  cntReg := cntReg + 1.U
  when(cntReg === CNT_MAX) {
    cntReg := 0.U
    blkReg := ~blkReg
  }
  io.led := blkReg
}

/**
 * An object extending App to generate the Verilog code.
 */
object Hello extends App {
  (new chisel3.stage.ChiselStage).emitVerilog(new Hello())
}

3.2 运行示例程序

    由于现有的大部分EDA软件并没有很好的支持Chisel,所以要想让编写的Chisel代码能够在FPGA或EDA软件上编译综合等,需要先将Chisel代码专为你verilog代码,在hello-world文件下打开命令行:

sbt run

等待运行完成后会在当前目录下生成一个Hello.v文件,即Chisel代码对应的verilog文件:

module Hello(
  input   clock,
  input   reset,
  output  io_led
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
`endif // RANDOMIZE_REG_INIT
  reg [31:0] cntReg; // @[Hello.scala 19:23]
  reg  blkReg; // @[Hello.scala 20:23]
  wire [31:0] _cntReg_T_1 = cntReg + 32'h1; // @[Hello.scala 22:20]
  assign io_led = blkReg; // @[Hello.scala 27:10]
  always @(posedge clock) begin
    if (reset) begin // @[Hello.scala 19:23]
      cntReg <= 32'h0; // @[Hello.scala 19:23]
    end else if (cntReg == 32'h17d783f) begin // @[Hello.scala 23:28]
      cntReg <= 32'h0; // @[Hello.scala 24:12]
    end else begin
      cntReg <= _cntReg_T_1; // @[Hello.scala 22:10]
    end
    if (reset) begin // @[Hello.scala 20:23]
      blkReg <= 1'h0; // @[Hello.scala 20:23]
    end else if (cntReg == 32'h17d783f) begin // @[Hello.scala 23:28]
      blkReg <= ~blkReg; // @[Hello.scala 25:12]
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  cntReg = _RAND_0[31:0];
  _RAND_1 = {1{`RANDOM}};
  blkReg = _RAND_1[0:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule

运行到这里就已经说明Chisel代码已经可以运行了,接下来的主要任务就是熟悉sbt、熟悉idea、熟悉Chisel语法以及学习其他相关知识。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值