chisel中使用参数配置的方式(1)
1)简单参数2)使用类型参数的函数
3)具有类型参数的模块
4)参数化的捆束
5)site-here-up高级参数化机制
这几种方式或机制,分别介绍,本帖介绍第一种 简单参数:
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 add8 = Module(new ParamAdder(8)) //不能直接new模块,只能用object的apply产生模块(因为有些chisel内部状态需要处理)
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
}
简单参数,主要是通过模块的主构造参数传递值,所以很简单。
生成的verilog文件内容如下:
module ParamAdder(
input io_a,
input io_b,
output io_c
);
assign io_c = io_a + io_b; // @
endmodule
module ParamAdder_1(
input io_a,
input io_b,
output io_c
);
assign io_c = io_a + io_b; // @
endmodule
module TestParamAdderModule(
input clock,
input reset,
inputio_a8,
inputio_b8,
output io_out8,
input io_a16,
input io_b16,
output io_out16
);
wire add8_io_a; // @
wire add8_io_b; // @
wire add8_io_c; // @
wire add16_io_a; // @
wire add16_io_b; // @
wire add16_io_c; // @
ParamAdder add8 ( // @
.io_a(add8_io_a),
.io_b(add8_io_b),
.io_c(add8_io_c)
);
ParamAdder_1 add16 ( // @
.io_a(add16_io_a),
.io_b(add16_io_b),
.io_c(add16_io_c)
);
assign io_out8 = add8_io_c; // @
assign io_out16 = add16_io_c; // @
assign add8_io_a = io_a8; // @
assign add8_io_b = io_b8; // @
assign add16_io_a = io_a16; // @
assign add16_io_b = io_b16; // @
endmodule
页:
[1]