文章目录
1. scala
1.1. yield
2. chisel
2.1. chisel位操作
2.1.1. 位拼接
2.1.1.1. 从Input中取某些位
val sel = Input(UInt(2.W))
val m = VecInit(Seq.fill(3)(Module(new Mux2).io))
m(2).sel := io.sel(1)
2.1.1.2. ref [1]
val a_address = Cat((mask zip (in.haddr >> log2Ceil(beatBytes)).asBools).filter(_._1).map(_._2).reverse)
in.r.bits.id := Cat(out.r.bits.echo(AXI4ExtraId), out.r.bits.id)
Cat(in.ar.bits.id, UInt(0, width=1))
Cat(in.ar.bits.id, r_count(in.ar.bits.id)(logFlight-1,0), UInt(0, width=1))
2.1.1.3. io.out(i):=Cat(1.U,2.U)
2.1.2. chisel中的位
从右往左数的,表示为 x n − 1 ⋯ x 1 x 0 x_{n-1}\cdots x_1x_0 xn−1⋯x1x0
io.out(i):=io.data(i)(2,0),表示2到0一共3比特
2.2. when 语句
when(io.data(i)(0)===0.B){
2.3. 减法
加减法可以防溢出
2.4. Vec
对于Vec类型输出,测试代码中peek只能到该向量,而不能写为c.io
val x=peek(c.io.u)
3. firrtl
3.1. firrtl在基于chisel的项目开发中的意义
3.1.1. 后端实现和eco的问题
- 通常前端和后端使用网表作为中间沟通语言
- 前端设计基本定型后后端flow就会跑起来,从floor plan和时钟方案都会希望网表保持基本不动
- 当后端flow基本确定之后,前端的任何修改都会以eco的形式存在,即直接修改网表,保证后端flow的可用性
3.2. node
3.3. tail
node _T = add(io.value1, io.value2) @[Adder.scala 14:25]
node _T_1 = tail(_T, 1) @[Adder.scala 14:25]
4. 参考文献
[1] rocket-chip