https://mp.weixin.qq.com/s/-AVJD1IfvNIJhmZM40DemA
实现后入先出(last in, first out)的栈。
参考链接:
https://github.com/ucb-bar/chisel-tutorial/blob/release/src/main/scala/examples/Stack.scala
1. 引入Chisel3
2. 继承自Module类
栈的深度作为参数传入。
3. 定义输入输出接口
创建各项输入输出接口。
.W))
a. 使用32.W表示位宽为32位;
b. 使用UInt创建无符号整型数;
c. 使用Input/Output表示接口方向;
关键字表明定义的变量是所属匿名Bundle子类的数据成员;
4. 内部连接
如果push置位,则把输入写入栈内存,并增加栈指针;
如果pop置位,则把栈内存写入输出,并减小栈指针;
.W))
空间大小为depth。Mem创建一块可读写内存。
).W))
栈指针根据栈的深度来决定宽度,初始化值为0.
.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)) } }