chisel入门踩坑

chisel入门踩坑

为什么最近会开始搞chisel,原因见前一篇blog。chisel是Berkeley出品的一款嵌入在Scala中用来描述硬件的语言,现在已经出到第三版——chisel3了。据我所知,在2005年csdn上面就有人分享自己进行chisel实验的过程。
说实话看Berkeley原版资料虽然准确但实在让人头大,尤其是当文档庞杂而散乱的时候更是这样。发现前面提到的那个05年chisel的时候很开心,按照他写的步骤一点点来。结果各种报错——chisel每代更新的函数还有用法都挺多的(说明这个语言正在蓬勃发展,是好事O(∩_∩)O哈哈~)
发现偷懒的路子走不通之后只能耐着性子慢慢磨。仔细一找,发现在Berkeley给出的文档中居然有“Short Guide to Chisel in Chinese”。感谢Sand River的翻译!!!

这份文档介绍的比较粗略,不过作为入门文档还是可以的。而贴心的Berkeley人虽然木有专门写书来介绍chisel(要知道C/C++这些出名很大程度上是人家写出来的书好啊,至少我是这么认为的),但是给出了学习源码。
tutorialsrc/main/scala是一个个chisel工程(对应到VHDL上就是一个个*.vhdl),src/test/scala是一个个测试文件(虽然也是chisel写成的*.scala)。这两个文件夹下都有三个子文件夹,分别是problems, solutions, examples,即练习题、答案和高级例程。
跑完了tutorial给出的HelloWorld测试后开始正式学习的时候总要脱离测试环境嘛。
在另外一个地方新建自己的WorkSpace(一直保持这样的好习惯),console里输入sbt。这个时候会等很久,他要从Berkeley的源码网站上下载好多东西,我曾经试图想些什么办法把这个过程省略掉,比如手动复制这些文件;或者改成从国内下载源下载来加速,结果差点根本下不下来了。整了半天最终不敢乱动了,等等就行,别彻底不能玩了就尴尬了。
我们这里举一个简单的例子来说。Berkeley给的例子是Mux2,咱们这里就用Max2好了。两个例子可以稍微对照一下,看着更清楚。
需要用到的文件分别是src/main/scala/solutions/Max2.scala及其对应的测试文件src/test/scala/solutions/Max2Test.scala。直接按它给出的来跑不通。因为作为一个独立的scala文件,缺少main入口函数。
原始Max2.scala文件如下:

// See LICENSE.txt for license details.
package solutions

import chisel3._

// Problem:
//
// Implement a test for this module. Please edit:
// .../chisel_tutorial/src/test/scala/problems/Max2.scala
//
class Max2 extends Module {
  val io = IO(new Bundle {
    val in0 = Input(UInt(8.W))
    val in1 = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  io.out := Mux(io.in0 > io.in1, io.in0, io.in1)
}

已经描述出了电路的结构,这里我们把入口函数补上就可以了。

object Max2 {
  def main(args: Array[String]): Unit = {
    if (!Driver(() => new Max2())(c => new Max2Tests(c)))
    System.exit(1)
  }
}

至于这个入口函数怎么来的呢?除了前两行和第四行固定格式之外,关键是第三行这个Driver(() => new Max2())(c => new Max2Tests(c))先new出来Max2类的对象,再用它调用定义在Max2Test.scala文件中的Max2Tests类中new出来了一个方法(说起来有点绕)。总之就是new出来了一个Max2类的对象来调用了Max2Tests方法。
另外还需要一个import包。最终程序也贴一下吧:

package solutions

import chisel3._
import chisel3.iotesters.{PeekPokeTester, Driver}

// Problem:
//
// Implement a test for this module. Please edit:
// .../chisel_tutorial/src/test/scala/problems/Max2.scala
//
class Max2 extends Module {
  val io = IO(new Bundle {
    val in0 = Input(UInt(8.W))
    val in1 = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  io.out := Mux(io.in0 > io.in1, io.in0, io.in1)
}
//object Max2 extends App {    
//  if (!Driver(() => new Max2())(c => new Max2Tests(c)))
//    System.exit(1)
//}

object Max2 {
  def main(args: Array[String]): Unit = {
    if (!Driver(() => new Max2())(c => new Max2Tests(c)))
    System.exit(1)
  }
}

里面有注释掉了一部分程序。它是说按照注释段的内容(即extends App/Application)来代替main也是可以的。不得不说scala非常的自由。
之后直接把Max2Test.scala粘贴到刚刚的workspace里,在sbt里直接run就行了。
另外注意到这两个scala文件都打包在了solutions里面,所以在sbt里运行的时候也可以run-main solutions.Max2
篇幅已经很长了,具体语法细节就不再赘述,反正在Berkeley给出的文档了里面都有(没有想象中那么详细就是了),而且还是中英文双版本。
下次遇到文档中没有说清楚或者是人家说过但是我忽略了或没有找到的也会记录下来。
Reference:全是链接(markdown链接功能很方便O(∩_∩)O哈哈~),就不再一一打出来了。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值