【Chisel】2.1创建第一个模块:Chisel官方教学,记录学习。

  1. 前言
  2. 配置环境
  3. 第一个模块

前言

Chisel指的是Constructing Hardware In a Scala Embedded Language(建立在Scala嵌入式语言基础之上的硬件语言)。在学习的过程中,需要充分的理解和区分哪些code是Chisel而哪些是Scala。现在可以简单把Chisel想象成一种更方便写verilog的语言。

配置环境

val path = System.getProperty("user.dir") + "/source/load-ivy.sc"
interp.load.module(ammonite.ops.Path(java.nio.file.FileSystems.getDefault().getPath(path)))

配置环境, 在使用Chisel之前, 需要导入Chisel。

import chisel3._
import chisel3.util._
import chisel3.tester._
import chisel3.tester.RawTester.test
import dotvisualizer._

💡 这里是线上模块的依赖环境的导入,好像只有在Chisel官方的Jupyter notebook上才能跑成功。附上链接:Chisel官方教学

第一个模块

// Chisel Code: Declare a new module definition
class Passthrough extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(4.W))
    val out = Output(UInt(4.W))
  })
  io.out := io.in
}

分解开来解释:

class Passthrough extends Module {

Module 是 Chisel 的内置函数, 用来声明一切的硬件模块。

  • 声明了一个模块,声明为 Passthrough
  val io = IO(...)
  • 声明输入输出接口,类别为val ,这里必须声明为io,并且为IO类别的对象。

这会使能Chisel调用IO(*instantiated_bundle_*)

new Bundle {
    val in = Input(UInt(4.W))
    val out = Output(UInt(4.W))
  }
  • 声明一个硬件结构(struct)类别 Bundle, 内包含两个常量 in 和 out
UInt(4.W)
  • 声明常量的硬件属性, 在这里UInt(4.W)表示这是一个无符号, 位宽为4的整数
io.out := io.in
  • 把输入接口直接连接到输出接口上,在这种情况下,输入io直接决定输出io的值。

注意: := 是 Chisel 的内置语句,表示把右边的信号值直接决定左边的信号值。

这个语句表明了决定了输入输出口。

println(getVerilog(new Passthrough))

💡 这句话对Chisel,Scala和verilog三者关系的理解尤其重要。硬件语言HCLs(Hardware construction language)的好处也在此体现。

比如现在,在声明了Chisel模块过后,可以用Scala语言调用Chisel模块并且将该模块翻译为Verilog语言。这个过程可以看作是进一步的细化,也可以看作是向下一层的编译。(原文使用的:elaboration) 。

可以把Scala看作是一个翻译官,在Chisel和verilog之间起到了桥梁的作用。

C h i s e l S c a l a → v e r i l o g Chisel\underrightarrow{\quad Scala\quad} verilog Chisel Scalaverilog

翻译过来的verilog代码:

module Passthrough(
  input        clock,
  input        reset,
  input  [3:0] io_in,
  output [3:0] io_out
);
  assign io_out = io_in; // @[cmd8.sc 6:10]
endmodule

附上上面对应的Chisel代码参考对比:

// Chisel Code: Declare a new module definition
class Passthrough extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(4.W))
    val out = Output(UInt(4.W))
  })
  io.out := io.in
}

小记:Python是选修的Machine Learning学的。Chisel是选的Microprocessor Design学的。不是Python弃坑了,第一个学到那里作业差不多能应付了,第二个时间实在匀不出来,MD和我之后的工作相关度更大我也更感兴趣,所以Python只能先搁浅一下下咯,要是有空一定填坑。
另外之前做笔记一直用的英语,老师说啥我就记下来了,但是现在感觉上课随便手写一些英文笔记下课再整理成中文更有利于我的记忆,再说万一有小伙伴想看呢,嘿嘿。网上感觉Chisel的资料也很少,要是能帮到大家,那就更好啦。:)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值