Chisel3 - Tutorial - Stack

https://mp.weixin.qq.com/s/-AVJD1IfvNIJhmZM40DemAgit

 
實現後入先出(last in, first out)的棧。
 
參考連接:
https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/Stack.scala
 
1. 引入Chisel3
 
 
2. 繼承自Module類
 
棧的深度做爲參數傳入。
 
3. 定義輸入輸出接口
 
建立各項輸入輸出接口。
 
val dataIn = Input(UInt(32.W))
a. 使用32.W表示位寬爲32位;
b. 使用UInt建立無符號整型數;
c. 使用Input/Output表示接口方向;
d. val 關鍵字代表定義的變量是所屬匿名Bundle子類的數據成員;
 
4. 內部鏈接
 
若是push置位,則把輸入寫入棧內存,並增長棧指針;
若是pop置位,則把棧內存寫入輸出,並減少棧指針;
 
1) 建立棧空間:val stack_mem = Mem(depth, UInt(32.W))
空間大小爲depth。Mem建立一塊可讀寫內存。
 
2) 建立棧指針寄存器:val sp = RegInit(0.U(log2Ceil(depth+1).W))
棧指針根據棧的深度來決定寬度,初始化值爲0.
 
3) 建立輸出寄存器:val out = RegInit(0.U(32.W))
該寄存器直接輸出到io.dataOut輸出端口。
 
5. 生成Verilog
 
 
能夠直接點運行符號運行。
 
也能夠使用sbt shell執行:
 
生成Verilog以下:
 
6. 測試
 
 
 
7. 附錄
 
Stack.scala:
 
import chisel3._
import chisel3.util.log2Ceil
 
class Stack(val depth: Int) extends Module {
val io = IO(new Bundle {
val push = Input(Bool())
val pop = Input(Bool())
val en = Input(Bool())
val dataIn = Input(UInt(32.W))
val dataOut = Output(UInt(32.W))
})
 
val stack_mem = Mem(depth, UInt(32.W))
val sp = RegInit(0.U(log2Ceil(depth+1).W))
val out = RegInit(0.U(32.W))
 
when (io.en) {
when(io.push && (sp < depth.asUInt)) {
stack_mem(sp) := io.dataIn
sp := sp + 1.U
} .elsewhen(io.pop && (sp > 0.U)) {
sp := sp - 1.U
}
when (sp > 0.U) {
out := stack_mem(sp - 1.U)
}
}
 
io.dataOut := out
}
 
object StackMain {
def main(args: Array[String]): Unit = {
chisel3.Driver.execute(Array("--target-dir", "generated/Stack"), () => new Stack(8))
}
}
相關文章
相關標籤/搜索