joe 发表于 2021-8-17 21:07:24

chisel组合逻辑电路

组合逻辑,没有时钟的电路,最简单的是布尔算式:
val v = (a & b) | c
还可以:
val o = ~v
scala语法中,不能再val v =...,否则就会出现reassignment to val
异常,对v必须要用:=操作符进行连线处理。
Chisel 还支持描述带有条件更新的组合电路。这样的电路被称为 Wire。
然后使用条件运算(例如 when)来描述电路的逻辑。以下代码声明了一个
UInt 类型的 Wire w 并分配了默认值 0。 when 块采用 Chisel Bool 并在
cond 为 true 时将 3 重新分配给 w:
val w = Wire(UInt())
w:=0.U
when(cond){
w:= 3.U
}
可以带有.otherwise:
val w = Wire(UInt())
when(cond){
w:=1.U
} .otherwhen(cond2){
w:=2.U
} .elsewise {
w:=3.U
}
关于when,otherwise,elsewise,还是在我们前帖ALU中做实验:
import chisel3._
class Alu extends Module {
//必须要实现抽象成员io
val io = IO(new Bundle { //匿名Bundle类
    val a = Input(UInt(32.W)) //输入a
val b = Input(UInt(32.W)) //输入b
val k = Input(UInt(2.W)) //控制K
val f = Output(UInt(32.W)) //输出结果f
})
io.f := 0.U//赋初值
//如果换成when和.otherwise
when(io.k === 0.U){
    io.f := io.a + io.b
} .elsewhen(io.k === 1.U){
    io.f := io.a - io.b
} .elsewhen(io.k === 2.U) {
    io.f := io.a | io.b
} otherwise {
    io.f := io.a & io.b
}
}

joe 发表于 2021-8-17 21:08:55

对应产生的verilog代码如下:
module Alu(
input         clock,
input         reset,
input io_a,
input io_b,
inputio_k,
output io_f
);
wire_T = io_k == 2'h0; // @
wire _T_2 = io_a + io_b; // @
wire_T_3 = io_k == 2'h1; // @
wire _T_5 = io_a - io_b; // @
wire_T_6 = io_k == 2'h2; // @
wire _T_7 = io_a | io_b; // @
wire _T_8 = io_a & io_b; // @
wire _GEN_0 = _T_6 ? _T_7 : _T_8; // @
wire _GEN_1 = _T_3 ? _T_5 : _GEN_0; // @
assign io_f = _T ? _T_2 : _GEN_1; // @
endmodule

joe 发表于 2021-8-17 21:13:35

当然,从学习角度来说,本帖可以不用Module,用RawModule可能更好些,因为是组合逻辑,不需要clock和reset
页: [1]
查看完整版本: chisel组合逻辑电路