Chisel 學習筆記(四)


Chisel中的組合邏輯

Input與Output

Chisel中的所有類都要繼承Module
類中必須要定義io類型,用來表示該模塊的輸入輸出端口
每一個輸入輸出端口,需要說明是有符號數還是無符號數,以及數據位寬

class MyOperatorsTwo extends Module {
  val io = IO(new Bundle {
    val in      = Input(UInt(4.W))
    val out_mux = Output(UInt(4.W))
    val out_cat = Output(UInt(4.W))
  })
}

class MyOperators(val length : Int) extends Module {
  val io = IO(new Bundle {
    val in      = Input(UInt(length.W))
    val out_mux = Output(UInt(length.W))
    val out_cat = Output(UInt(length.W))
  })
}

數據類型與賦值

Chisel中所有的變量只能用val,不能用var
Chisel中的數據類型有UInt,SInt,Bool,並且Chisel中的數據類型只能和Chisel中的數據類型進行運算,因此運算時如果需要操作常數,需寫成2.U的形式

class MyOperators extends Module {
  val io = IO(new Bundle {
    val in      = Input(UInt(4.W))
    val out_add = Output(UInt(4.W))
    val out_sub = Output(UInt(4.W))
    val out_mul = Output(UInt(4.W))
  })

	val s = true.B
  io.out_add := 1.U + 4.U
  io.out_sub := 2.U - 1.U
  io.out_mul := 4.U * 2.U
}

在變量初始化時使用等號,在賦值時使用:=,代表左側變量由右側表達式驅動
另外scala中提供比較常見的如多選器,連接器

  val s = true.B
  io.out_mux := Mux(s, 3.U, 0.U) 
  io.out_cat := Cat(2.U, 1.U) 

對於加法運算,Chisel提供了兩種加法運算,+&表示會保留進位,+不保留進位

控制語句

如果有多條賦值語句驅動相同左側變量,則選擇最后一個,如下

class LastConnect extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(4.W))
    val out = Output(UInt(4.W))
  })
  io.out := 1.U
  io.out := 2.U
  io.out := 3.U
  io.out := 4.U		//編譯器選擇這一條
}

when, elsewhen, otherwise

Chisel中提供條件語句when, elsewhen和otherwise
使用方式和if-else語句一樣
語法如下:

when(someBooleanCondition) {
  // things to do when true
}.elsewhen(someOtherBooleanCondition) {
  // things to do on this condition
}.otherwise {
  // things to do if none of th boolean conditions are true
}

示例如下:

class Max3 extends Module {
  val io = IO(new Bundle {
    val in1 = Input(UInt(16.W))
    val in2 = Input(UInt(16.W))
    val in3 = Input(UInt(16.W))
    val out = Output(UInt(16.W))
  })
    
  when(io.in1 > io.in2 && io.in1 > io.in3) {
    io.out := io.in1  
  }.elsewhen(io.in2 > io.in1 && io.in2 > io.in3) {
    io.out := io.in2 
  }.otherwise {
    io.out := io.in3
  }
}

需要注意的是,Chisel中的條件語句不像scala中的那樣,最后一行為返回值

val result = when(squareIt) { x * x }.otherwise { x }

這樣是不行的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM