59
UCB CS294-88: Declarative Design Chisel Overview Jonathan Bachrach EECS UC Berkeley January 24, 2013

UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

UCB CS294-88: Declarative Design

Chisel Overview

Jonathan Bachrach

EECS UC Berkeley

January 24, 2013

Page 2: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Chisel 1Constructing Hardware In Scala Embedded Language

Embed a hardware-description language in Scala, using Scala’sextension facilitiesChisel is just a set of class definitions in Scala and when you write aChisel program you are actually writing a Scala programA hardware module is just a data structure in ScalaClean simple set of design construction primitives for RTL designFull power of Scala for writing hardware generatorsDifferent output routines can generate different types of output (C,FPGA-Verilog, ASIC-Verilog) from same hardware representationCan be extended above with domain specific languages (such asdeclarative cache coherence specifications)Can be extended below with new backends (such as quantum)Open source with lots of librariesOnly 5200 lines of code in current version!

Page 3: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Chisel Workflow 2

Chisel Program

C++ Code FPGA Verilog ASIC Verilog

Scala / JVM

C++ Compiler FPGA Tools ASIC Tools

C++ Simulator FPGA Emulation GDS Layout

Page 4: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

The Scala Programming Language 3

Compiled to JVMGood performanceGreat Java interoperabilityMature debugging, execution environments

Object OrientedFactory Objects, ClassesTraits, overloading etc

FunctionalHigher order functionsAnonymous functionsCurrying etc

ExtensibleDomain Specific Languages (DSLs)

Page 5: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Scala Collections 4

// Array’s

val tbl = new Array[Int](256)

tbl(0) = 32

val y = tbl(0)

val n = tbl.length

// ArrayBuffer’s

val buf = new ArrayBuffer[Int]()

buf += 12

val z = buf(0)

val l = buf.length

// List’s

val els = List(1, 2, 3)

val a :: b :: c :: Nil = els

val m = els.length

Page 6: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Scala Iteration 5

val tbl = new Array[Int](256)

// loop over all indices

for (i <- 0 until tbl.length)

tbl(i) = i

// loop of each sequence element

for (e <- tbl)

tbl(i) += e

// nested loop

for (i <- 0 until 16; j <- 0 until 16)

tbl(j*16 + i) = i

// create second table with doubled elements

val tbl2 = for (i <- 0 until 16) yield tbl(i)*2

Page 7: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Scala Functional 6

// simple scaling function, e.g., x2(3) => 6

def x2 (x: Int) = 2 * x

// produce list of 2 * elements, e.g., x2list(List(1, 2, 3)) => List(2, 4, 6)

def x2list (xs: List[Int]) = xs.map(x2)

// simple addition function, e.g., add(1, 2) => 3

def add (x: Int, y: Int) = x + y

// sum all elements using pairwise reduction, e.g., sum(List(1, 2, 3)) => 6

def sum (xs: List[Int]) = xs.foldLeft(0)(add)

Page 8: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Scala Object Oriented 7

object Blimp {

var numBlimps = 0

def apply(r: Double) = {

numBlimps += 1

new Blimp(r)

}

}

Blimp.numBlimps

Blimp(10.0)

class Blimp(r: Double) {

val rad = r

println("Another Blimp")

}

class Zep(r: Double) extends Blimp(r)

Page 9: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Scala Console 8

> scala

scala> 1 + 2

=> 3

scala> def f (x: Int) = 2 * x

=> (Int) => Int

scala> f(4)

=> 8

Page 10: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Chisel Example 9

class Mux2 extends Component {

val io = new Bundle{

val sel = Bits(INPUT, 1)

val in0 = Bits(INPUT, 1)

val in1 = Bits(INPUT, 1)

val out = Bits(OUTPUT, 1)

}

io.out := (io.sel & io.in1) |

(~io.sel & io.in0)

}

Mux2~

&

&

|Bits

Bits

Bits

in0

in1

sel

Bits

out

Page 11: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Literals 10

Bits(1) // decimal 1-bit literal from Scala Int.

Bits("ha") // hexadecimal 4-bit literal from string.

Bits("o12") // octal 4-bit literal from string.

Bits("b1010") // binary 4-bit literal from string.

Fix(5) // signed decimal 4-bit literal from Scala Int.

Fix(-8) // negative decimal 4-bit literal from Scala Int.

UFix(5) // unsigned decimal 3-bit literal from Scala Int.

Bool(true) // Bool literals from Scala literals.

Bool(false)

Page 12: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Literals 11

Bits("h_dead_beef") // 32-bit literal of type Bits.

Bits(1) // decimal 1-bit literal from Scala Int.

Bits("ha", 8) // hexadecimal 8-bit literal of type Bits.

Bits("o12", 6) // octal 6-bit literal of type Bits.

Bits("b1010", 12) // binary 12-bit literal of type Bits.

Fix(5, 7) // signed decimal 7-bit literal of type Fix.

UFix(5, 8) // unsigned decimal 8-bit literal of type UFix.

Page 13: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Literal Node Construction 12

UFix(1)

UFix(1)

Page 14: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Algebraic Construction 13

UFix(1) + UFix(1)

UFix(1)

UFix(2)

+

Page 15: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Combinational Circuits 14

(sel & in1) | (~sel & in0)

~

in0 &

in1 &

sel |

Page 16: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Fan Out 15

val sel = a | b

val out = (sel & in1) | (~sel & in0)

~

in0 &

in1 &

|a

b

| outsel

Page 17: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Wires 16

val sel = Bits()

val out = (sel & in1) | (~sel & in0)

sel := a | b

~

in0 &

in1 &

|a

b

| outBitssel

Page 18: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Bitwise operators 17

Valid on Bits, Fix, UFix, Bool.

// Bitwise-NOT

val invertedX = ~x

// Bitwise-AND

val hiBits = x & Bits("h_ffff_0000")

// Bitwise-OR

val flagsOut = flagsIn | overflow

// Bitwise-XOR

val flagsOut = flagsIn ^ toggle

Page 19: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Equality comparison 18

Valid on Bits, Fix, UFix, and Bool. Returns Bool.

// Equality

val equ = x === y

// Inequality

val neq = x != y

where === is used instead of == to avoid collision with Scala.

Page 20: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Shifts 19

Valid on Bits, Fix, and UFix.

// Logical left shift.

val twoToTheX = Fix(1) << x

// Right shift (logical on Bits & UFix, arithmetic on Fix).

val hiBits = x >> UFix(16)

where logical is a raw shift and arithmetic performs top bit sign extension.

Page 21: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Bitfield manipulation 20

Valid on Bits, Fix, UFix, and Bool.

// Extract single bit, LSB has index 0.

val xLSB = x(0)

// Extract bit field from end to start bit pos.

val xTopNibble = x(15,12)

// Replicate a bit string multiple times.

val usDebt = Fill(3, Bits("hA"))

// Concatenates bit fields, w/ first arg on left

val float = Cat(sgn,exp,man)

Page 22: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Logical Operations 21

Valid on Bools.

// Logical NOT.

val sleep = !busy

// Logical AND.

val hit = tagMatch && valid

// Logical OR.

val stall = src1busy || src2busy

// Two-input mux where sel is a Bool.

val out = Mux(sel, inTrue, inFalse)

Page 23: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Arithmetic operations 22

Valid on Nums: Fix and UFix.

// Addition.

val sum = a + b

// Subtraction.

val diff = a - b

// Multiplication.

val prod = a * b

// Division.

val div = a / b

// Modulus

val mod = a % b

where Fix is a signed fixed-point number represented in two’scomplement and UFix is an unsigned fixed-point number.

Page 24: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Arithmetic comparisons 23

Valid on Nums: Fix and UFix. Returns Bool.

// Greater than.

val gt = a > b

// Greater than or equal.

val gte = a >= b

// Less than.

val lt = a < b

// Less than or equal.

val lte = a <= b

Page 25: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Bitwidth Inference 24

operation bit widthz = x + y wz = max(wx, wy)

z = x - y wz = max(wx, wy)

z = x & y wz = min(wx, wy)

z = x | y wz = max(wx, wy)

z = Mux(c, x, y) wz = max(wx, wy)

z = w * y wz = wx + wy

z = x << n wz = wx + maxNum(n)

z = x >> n wz = wx - minNum(n)

z = Cat(x, y) wz = wx + wy

z = Fill(n, x) wz = wx * maxNum(n)

Page 26: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Functional Abstraction 25

def mux2 (sel: Bits, in0: Bits, in1: Bits) =

(sel & in1) | (~sel & in0)

val out = mux2(k,a,b)

~

b &

k &

a | out

Page 27: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Bundles 26

class MyFloat extends Bundle {

val sign = Bool()

val exponent = UFix(width = 8)

val significand = UFix(width = 23)

}

val x = new MyFloat()

val xs = x.sign

UFix

UFix

Bool

sig

exp

sig

Page 28: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Vecs 27

// Vector of 3 23-bit signed integers.

val myVec = Vec(3) { Fix(width = 23) }

can be used as Scala sequencescan also be nested into ChiselBundles

Fix

Fix

Fix

2

1

0

Page 29: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Static Vec Element Access 28

val myVec = Vec(3) { Fix(width = 23) }

// Connect to one vector element chosen at elaboration time.

val fix0 = myVec(0)

val fix1 = myVec(1)

fix1 := data1

myVec(2) := data2

Fix

Fix

Fix

2

1

0

data2

data1 fix1

fix0

Page 30: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Dynamic Vec Element Access 29

val myVec = Vec(3) { Fix(width = 23) }

// Connect to one vector element chosen at runtime.

val out0 = myVec(addr0)

val out1 = myVec(addr1)

myVec(addr2) := data2

Fix

Fix

Fix

2

1

0

addr2

data2 deselector

selector

addr0

out0

selector

addr1

out1

Page 31: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Ports 30

Data object with directions assignedto its members

class FIFOIO extends Bundle {

val data = Bits(INPUT, 32)

val valid = Bool(OUTPUT)

val ready = Bool(INPUT)

}

Direction assigned at instantiationtime

class ScaleIO extends Bundle {

val in = new MyFloat().asInput

val scale = new MyFloat().asInput

val out = new MyFloat().asOutput

}

Bool

Bool

UFix

ready

valid

data

Page 32: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Component 31

inherits from Component,contains an interface storedin a port field named io, andwires together subcircuits inits constructor.

class Mux2 extends Component {

val io = new Bundle{

val sel = Bits(INPUT, 1)

val in0 = Bits(INPUT, 1)

val in1 = Bits(INPUT, 1)

val out = Bits(OUTPUT, 1)

}

io.out := (io.sel & io.in1) |

(~io.sel & io.in0)

}

Mux2~

&

&

|Bits

Bits

Bits

in0

in1

sel

Bits

out

Page 33: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Chisel Workflow 32

Mux2.scala bytecodes

Mux2.cpp

scalacompiler

jvmchiselbuilder

jvm cpp backend

Mux2g++

+

1 2

Mux2.v

jvm verilog backend

verificationvcs

simulation

exec

net list + power, area, and speed estimates

dc

Page 34: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

State Elements 33

Reg(in)

Regin

Page 35: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Rising Edge 34

def risingEdge(x: Bool) = x && !Reg(x)

Reg

x

!

&&

Page 36: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Counter 35

def counter(max: UFix) = {

val x = Reg(resetVal = UFix(0, max.getWidth))

x := Mux(x == max, UFix(0), x + UFix(1))

x

}

RegMux

UFix(0)

===

maxUFix(1)

+

UFix(0)

reset

tst

consequent

alternate

Page 37: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

What is Chisel? 36

Chisel is just a set of class definitions in Scala and when you write aChisel program you are actually writing a Scala program,Chisel programs produce and manipulate a data structure in Scalausing a convenient textural language layered on top of Scala,Chisel makes it possible to create powerful and reusable hardwarecomponents using modern programming language concepts, andthe same Chisel description can generate different types of output

Page 38: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Conditional Updates 37

When describing state operations, we could simply wire register inputs tocombinational logic blocks, but it is often more convenient:

to specify when updates to registers will occur andto specify these updates spread across several separate statements

val r = Reg() { UFix(16) }

when (c === UFix(0) ) {

r := r + UFix(1)

}

Reg

+

===

c

r

Bits(0)

UFix(1)

en

data

Page 39: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Conditional Updates Priority 38

when (c1) { r := Bits(1) }

when (c2) { r := Bits(2) }

Conditional Update Order:

c1 c2 r

0 0 r r unchanged0 1 21 0 11 1 2 c2 takes precedence over c1

Page 40: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Conditional Update Synthesized Hardware 39

Regr

MuxMux

OrOr

e1 e2

c1 c2 out

Bits(0)

Bits(0)

when (c1) { r := e1 }

when (c2) { r := e2 }

en

data

Each when statement adds another level of data mux and ORs thepredicate into the enable chain andthe compiler effectively adds the termination values to the end of thechain automatically.

Page 41: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Targetting Multiple Registers 40

r := Reg(){ Fix(3) }

s := Reg(){ Fix(3) }

when (c1) { r := Fix(1); s := Fix(1) }

when (c2) { r := Fix(2) }

leads to r and s being updated according to the following truth table:

c1 c2 r s

0 0 3 30 1 2 31 0 1 1 r updated in c2 block, s updated using default1 1 2 1

Page 42: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Conditional Update Nesting 41

when (a) { when (b) { body } }

which is the same as:

when (a && b) { body }

Page 43: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Conditional Update Chaining 42

when (c1) { u1 }

.elsewhen (c2) { u2 }

.otherwise { ud }

which is the same as:

when (c1) { u1 }

when (!c1 && c2) { u2 }

when (!(c1 || c2)) { ud }

Page 44: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Switch Statement 43

switch(idx) {

is(v1) { u1 }

is(v2) { u2 }

}

which is the same as:

when (idx === v1) { u1 }

when (idx === v2) { u2 }

Page 45: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Conditional Updates Everywhere 44

Conditional updates also work forwires but must have defaults andfor memory reads and writes as we’ll see soon...

For wires, we can do conditional updates as follows:

val w = Bits(width = 32)

w := Bits(0) // default value

when (c1) { w := Bits(1) }

when (c2) { w := Bits(2) }

which is the same as

val w = Bits(width = 32)

when (Bool(true)) { w := Bits(0) } // default value

when (c1) { w := Bits(1) }

when (c2) { w := Bits(2) }

Page 46: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Finite State Machines 45

Finite state machines can now be readilydefined as follows:

class Parity extends Component {

val io = new Bundle {

val in = Bool(INPUT)

val out = Bool(OUTPUT) }

val s_even :: s_odd :: Nil = Enum(2){ UFix() }

val state = Reg(resetVal = s_even)

when (io.in) {

when (state === s_even) { state := s_odd }

.otherwise { state := s_even }

}

io.out := (state === s_odd)

}

where Enum(2){ UFix() } creates a list of twoUFix() literals.

even

odd

in = 1 in = 1

reset

Page 47: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

ROM 46

val d = Array(UFix(1), UFix(2), UFix(4), UFix(8))

val m = ROM(d){ UFix(width = 32) }

val r = m(counter(UFix(3)))

ROM(d) ROMRead

counter

(UFix(3))

r

Page 48: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Mul Lookup Table 47

class Mul extends Component {

val io = new Bundle {

val x = UFix(INPUT, 4)

val y = UFix(INPUT, 4)

val z = UFix(OUTPUT, 8) }

val muls = new Array[UFix](256)

for (x <- 0 until 16; y <- 0 until 16)

muls((x << 4) | y) = x * y

val tbl = ROM(muls){ UFix(8) }

io.z := tbl((io.x << 4) | io.y)

}ROM(muls)

ROMRead

UFixio.x

UFixio.y

UFixio.z

<<

Bits(4)

|

Page 49: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

RAM 48

RAM is supported using the Mem construct

val m = Mem(32){ Bits(width = 32) }

wherewrites to Mems are positive-edge-triggeredreads are either combinational or positive-edge-triggeredports are created by applying a UFix index

Page 50: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

32-entry Register File 49

val regs = Mem(32){ Bits(width = 32) }

when (wrEn) {

regs(wrAddr) := wrData

}

val iDat = regs(iAddr)

val mDat = regs(mAddr)

Mem(32)

MemRead

MemRead

MemWrite

iAddr

mAddr

wrData

wrAddr

wrEn

iDat

mDat

Page 51: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Sequential Read Ports 50Sequential read ports are inferred when:

optional parameter seqRead is set anda reg is assigned to the output of a MemRead

val ram1r1w = Mem(1024, seqRead = true) { Bits(width = 32) }

val dOut = Reg() { Bits() }

when (wrEn) { ram1r1w(wrAddr) := wrData }

when (rdEn) { dOut := ram1r1w(rdAddr) }

Mem(1024) MemReadMemWrite

rdAddr

wrData

wrAddr

wrEn

RegdOut

Page 52: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Single-ported SRAM 51Single-ported SRAMs can be inferred when the read and write conditionsare mutually exclusive in the same when chain

val ram1p = Mem(1024, seqRead = true) { Bits(width = 32) }

val dOut = Reg() { Bits() }

when (wrEn) { ram1p(wrAddr) := wrData }

.elsewhen (rdEn) { dOut := ram1p(rdAddr) }

Mem(1024) MemReadMemWrite

rdAddr

wrData

wrAddr

wrEn

RegiDat

! rdEn&&

Page 53: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Components and Interfaces 52

Suppose we want to break computation into a series of filters (ala Unix):

f1 f2

block

Bool

UFix

valid

data

Bool

UFix

valid

data

Bool

UFix

valid

data

Bool

UFix

valid

data

where data is fed though with an additional valid signal to say whetherdata has not been filtered.

Page 54: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Pass Through Filter 53

We can define a pass through filter component by defining a filter classextending component:

class Filter extends Component {

val io = new FilterIO()

io.out.data := io.in.data

io.out.valid := io.in.valid

}

filter

Bool

UFix

valid

data

Bool

UFix

valid

data

where the io field contains FilterIO.

Page 55: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Small and Odd Filters 54

Suppose we want to write a small and odd filter. We could write these outby hand:

class SmallFilter extends Component {

val io = new FilterIO()

io.out.data := io.in.data

io.out.valid := io.in.valid && (io.in.data < 10)

}

class OddFilter extends Component {

val io = new FilterIO()

io.out.data := io.in.data

io.out.valid := io.in.valid && (io.in.data & 1)

}

Page 56: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Basic Filter Interface 55

class PipeIO extends Bundle {

val data = UFix(OUTPUT, 16)

val valid = Bool(OUTPUT)

}

Bool

UFix

valid

data

Page 57: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Complete Filter Interface 56

From there we can define a filterinterface by nesting two PipeIOs into anew FilterIO bundle:

class FilterIO extends Bundle {

val in = new PipeIO().flip

val out = new PipeIO()

}

where flip recursively changes the“gender” of a bundle, changing input tooutput and output to input.

Bool

UFix

valid

data

Bool

UFix

valid

data

out

in

Page 58: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Bulk Connections 57

We can now compose two filters into a filter block as follows:

class SmallOdds extends Component {val io = new FilterIO()val smalls = new SmallFilter()val odds = new OddFilter()

smalls.io.in <> io.insmalls.io.out <> odds.io.inodds.io.out <> io.out

}

smalls odds

Bool

UFix

valid

data

Bool

UFix

valid

data

Bool

UFix

valid

data

Bool

UFix

valid

data

smallOdds

< 10 & 1

where <> bulk connects interfaces. Note that:bulk connections recursively pattern match names between left andright hand sides finally connecting leaf ports to each other, andafter all connections are made and the circuit is being elaborated,Chisel warns users if ports have other than exactly one connectionto them.

Page 59: UCB CS294-88: Declarative Design [0.2cm] Chisel Overviewinst.eecs.berkeley.edu/~cs294-88/sp13/lectures/chisel-review.pdf · UCB CS294-88: Declarative Design Chisel Overview Jonathan

Assignment for Next Class 58

read Chisel Tutorialcome prepared with

one paragraph summary with the good and the badthree questions

install chisel using chisel installation guide onchisel.eecs.berkeley.edu

check out course websitehttp://inst.eecs.berkeley.edu/ cs294-88/sp13/