Chisel and Xiangshan Learning

Chisel 学习

  • chisel-cheatsheet3.pdf
    • chisel基本语法、数据类型的讲解和示例,阅读之后可以熟悉基础的语法知识点。chisel变量命名严格按照面向对象语言设计:类名使用驼峰命名法、变量和函数使用小写字母和下划线方式命名。
    • 不同点是,chisel使用:=进行物理连线的描述,用=来进行变量的定义(和verilog的=、<=表示方式不同),目前没有看到区分组合逻辑部分和时序逻辑部分的表示。
    • 同时chisel里面也定义了一些较为高级的函数、接口(例如,带有握手信号的IO、仲裁器等)
  • Digital Design with Chisel
    • 这本是丹麦大学Martin Schoeberl教授撰写的Cshisel入门书籍
    • 目前有中文版(第几版不太清楚),且目录有点小问题,可以先看中文版,过了一遍之后,再去读英文原版(第四版)Digital Design with Chisel

Ch2 Basic Component

  • Data Type and Contant

    • Chisel 中的有符号数是用补码表示,数据表示的时候,通过用(n.W)的方式规定数据的位宽为n
1
2
3
4
// variable 
val b_data = Bits(3.W) // binary, datawidth is 3 bits
val s_data = SInt(2.W) // signed integer, datawidth is 2 bits
val u_data = UInt(2.W) // unsigned integer, datawidth is 2 bits
  • Update operator
    • Chisel 同样规定了线网类型的变量,以及用来赋值的update operator (:=)。
1
2
val w = Wire(UInt()) 
w := a & b
  • Mux
    • Chisel 自带了多路选择器模块,调用方法:
1
val r = Mux(sel, a, b)
  • Reg
    • Chisel的寄存器有两种定义方法,一种是不带输入端口的,另一种是带的:
1
2
3
4
5
6
7
8
// first case:
val reg = RegInit(0.U(8.W))
reg := d
val q = reg

// second case:
val reg = RegNext(d, 0.U(8.W))
val q = reg
  • Counter
    • 计数器可以用Reg + Mux的方式实现:
1
2
val cntReg = RegInit(0.U(8.W)) 
cntReg := Mux(cntReg === 9.U, 0.U, cntReg + 1.U)