|
一般来说,条件分支判断用if,else,在chisel中是否还是这样呢?
在chisel中不能再用scala语言级的if,else条件分支判断,只能用when,elsewhen,otherwise来代替。实验如下:
import chisel3._
class ParamAdder(n:Int) extends Module {
val io = IO(new Bundle {
val a = Input(UInt(n.W))
val b = Input(UInt(n.W))
val c = Output(UInt(n.W))
})
io.c := io.a + io.b
}
class TestParamAdderModule extends Module {
val io = IO(new Bundle {
val a8 = Input(UInt(8.W))
val b8 = Input(UInt(8.W))
val out8 = Output(UInt(8.W))
val a16 = Input(UInt(16.W))
val b16 = Input(UInt(16.W))
val out16 = Output(UInt(16.W))
val o = Output(UInt(8.W))
})
val add8 = Module(new ParamAdder(8))
val add16 = Module(new ParamAdder(16))
add8.io.a := io.a8
add8.io.b := io.b8
io.out8 := add8.io.c
add16.io.a := io.a16
add16.io.b := io.b16
io.out16 := add16.io.c
def myMux[T <: Data] (sel:Bool,a:T,b:T): T = {
val ret = WireDefault(a)
when(sel) {
ret := a
} otherwise {
ret := b
}
ret
}
io.o := myMux(add8.io.a === 10.U, add8.io.a, add8.io.b)
}
上面代码的when(sel){...}是很正常的逻辑处理,生成的也是assign io_o = _T ? add8_io_a : add8_io_b;这样的MUX代码,具体如下:
module ParamAdder(
input [7:0] io_a,
input [7:0] io_b,
output [7:0] io_c
);
assign io_c = io_a + io_b; // @[ParamAdder.scala 10:8]
endmodule
module ParamAdder_1(
input [15:0] io_a,
input [15:0] io_b,
output [15:0] io_c
);
assign io_c = io_a + io_b; // @[ParamAdder.scala 10:8]
endmodule
module TestParamAdderModule(
input clock,
input reset,
input [7:0] io_a8,
input [7:0] io_b8,
output [7:0] io_out8,
input [15:0] io_a16,
input [15:0] io_b16,
output [15:0] io_out16,
output [7:0] io_o
);
wire [7:0] add8_io_a; // @[ParamAdder.scala 22:20]
wire [7:0] add8_io_b; // @[ParamAdder.scala 22:20]
wire [7:0] add8_io_c; // @[ParamAdder.scala 22:20]
wire [15:0] add16_io_a; // @[ParamAdder.scala 23:21]
wire [15:0] add16_io_b; // @[ParamAdder.scala 23:21]
wire [15:0] add16_io_c; // @[ParamAdder.scala 23:21]
wire _T = add8_io_a == 8'ha; // @[ParamAdder.scala 51:29]
ParamAdder add8 ( // @[ParamAdder.scala 22:20]
.io_a(add8_io_a),
.io_b(add8_io_b),
.io_c(add8_io_c)
);
ParamAdder_1 add16 ( // @[ParamAdder.scala 23:21]
.io_a(add16_io_a),
.io_b(add16_io_b),
.io_c(add16_io_c)
);
assign io_out8 = add8_io_c; // @[ParamAdder.scala 27:11]
assign io_out16 = add16_io_c; // @[ParamAdder.scala 30:12]
assign io_o = _T ? add8_io_a : add8_io_b; // @[ParamAdder.scala 51:10]
assign add8_io_a = io_a8; // @[ParamAdder.scala 25:13]
assign add8_io_b = io_b8; // @[ParamAdder.scala 26:13]
assign add16_io_a = io_a16; // @[ParamAdder.scala 28:14]
assign add16_io_b = io_b16; // @[ParamAdder.scala 29:14]
endmodule
但如果将when(sel)换成if判断呢?
// if(sel.litToBoolean) { //如果用sel.litToBe=oolean则出现:java.util.NoSuchElementException: None.get
if(sel.litValue() == 1) { //sel.litValue() == 1出现:java.util.NoSuchElementException: None.get
ret := a
}
else {
ret := b
}
总结:在chisel中不要用scala语言级的if,else来做硬件连接值的逻辑判断处理,必须要用when,elsewhen,otherwise。
|
|