|
楼主 |
发表于 2021-9-10 13:35:27
|
显示全部楼层
根据上帖中所说,我重新修改代码,增加private,实验成功:
class MyArbiterIO5[T <: Data] ( private val gen:T, n:Int) extends ArbiterIO(gen,n) {
val mysignal = Output(Bool())
}
abstract class AbstractMyArbiter5[T <: Data](gen:T,n:Int) extends Module {
val io = IO(new MyArbiterIO5[T](gen,n)) ////chisel3.package$ExpectedChiselTypeException: 'UInt<8>(IO in unelaborated MyArbiter4)' must be a Chisel type, not hardware
}
class MyArbiter5 [T <: Data](gen:T,n:Int) extends AbstractMyArbiter5(gen,n) {
val arbiter = Module(new Arbiter(gen,n))
arbiter.io.in <> io.in
arbiter.io.out <> io.out
arbiter.io.chosen <> io.chosen
io.mysignal := arbiter.io.out.valid
}
结果实验OK,Driver.execute(Array("--target-dir","generated"),()=>new MyArbiter5(UInt(8.W),3)),产生的verilog代码如下:
module Arbiter(
output io_in_0_ready,
input io_in_0_valid,
input [7:0] io_in_0_bits,
output io_in_1_ready,
input io_in_1_valid,
input [7:0] io_in_1_bits,
output io_in_2_ready,
input io_in_2_valid,
input [7:0] io_in_2_bits,
input io_out_ready,
output io_out_valid,
output [7:0] io_out_bits,
output [1:0] io_chosen
);
wire [1:0] _GEN_0 = io_in_1_valid ? 2'h1 : 2'h2; // @[Arbiter.scala 126:27]
wire [7:0] _GEN_1 = io_in_1_valid ? io_in_1_bits : io_in_2_bits; // @[Arbiter.scala 126:27]
wire _T = io_in_0_valid | io_in_1_valid; // @[Arbiter.scala 31:68]
wire _T_1 = ~io_in_0_valid; // @[Arbiter.scala 31:78]
wire _T_2 = ~_T; // @[Arbiter.scala 31:78]
wire _T_6 = ~_T_2; // @[Arbiter.scala 135:19]
assign io_in_0_ready = io_out_ready; // @[Arbiter.scala 134:14]
assign io_in_1_ready = _T_1 & io_out_ready; // @[Arbiter.scala 134:14]
assign io_in_2_ready = _T_2 & io_out_ready; // @[Arbiter.scala 134:14]
assign io_out_valid = _T_6 | io_in_2_valid; // @[Arbiter.scala 135:16]
assign io_out_bits = io_in_0_valid ? io_in_0_bits : _GEN_1; // @[Arbiter.scala 124:15 Arbiter.scala 128:19 Arbiter.scala 128:19]
assign io_chosen = io_in_0_valid ? 2'h0 : _GEN_0; // @[Arbiter.scala 123:13 Arbiter.scala 127:17 Arbiter.scala 127:17]
endmodule
module MyArbiter5(
input clock,
input reset,
output io_in_0_ready,
input io_in_0_valid,
input [7:0] io_in_0_bits,
output io_in_1_ready,
input io_in_1_valid,
input [7:0] io_in_1_bits,
output io_in_2_ready,
input io_in_2_valid,
input [7:0] io_in_2_bits,
input io_out_ready,
output io_out_valid,
output [7:0] io_out_bits,
output [1:0] io_chosen,
output io_mysignal
);
wire arbiter_io_in_0_ready; // @[MyArbiter.scala 65:23]
wire arbiter_io_in_0_valid; // @[MyArbiter.scala 65:23]
wire [7:0] arbiter_io_in_0_bits; // @[MyArbiter.scala 65:23]
wire arbiter_io_in_1_ready; // @[MyArbiter.scala 65:23]
wire arbiter_io_in_1_valid; // @[MyArbiter.scala 65:23]
wire [7:0] arbiter_io_in_1_bits; // @[MyArbiter.scala 65:23]
wire arbiter_io_in_2_ready; // @[MyArbiter.scala 65:23]
wire arbiter_io_in_2_valid; // @[MyArbiter.scala 65:23]
wire [7:0] arbiter_io_in_2_bits; // @[MyArbiter.scala 65:23]
wire arbiter_io_out_ready; // @[MyArbiter.scala 65:23]
wire arbiter_io_out_valid; // @[MyArbiter.scala 65:23]
wire [7:0] arbiter_io_out_bits; // @[MyArbiter.scala 65:23]
wire [1:0] arbiter_io_chosen; // @[MyArbiter.scala 65:23]
Arbiter arbiter ( // @[MyArbiter.scala 65:23]
.io_in_0_ready(arbiter_io_in_0_ready),
.io_in_0_valid(arbiter_io_in_0_valid),
.io_in_0_bits(arbiter_io_in_0_bits),
.io_in_1_ready(arbiter_io_in_1_ready),
.io_in_1_valid(arbiter_io_in_1_valid),
.io_in_1_bits(arbiter_io_in_1_bits),
.io_in_2_ready(arbiter_io_in_2_ready),
.io_in_2_valid(arbiter_io_in_2_valid),
.io_in_2_bits(arbiter_io_in_2_bits),
.io_out_ready(arbiter_io_out_ready),
.io_out_valid(arbiter_io_out_valid),
.io_out_bits(arbiter_io_out_bits),
.io_chosen(arbiter_io_chosen)
);
assign io_in_0_ready = arbiter_io_in_0_ready; // @[MyArbiter.scala 66:17]
assign io_in_1_ready = arbiter_io_in_1_ready; // @[MyArbiter.scala 66:17]
assign io_in_2_ready = arbiter_io_in_2_ready; // @[MyArbiter.scala 66:17]
assign io_out_valid = arbiter_io_out_valid; // @[MyArbiter.scala 67:18]
assign io_out_bits = arbiter_io_out_bits; // @[MyArbiter.scala 67:18]
assign io_chosen = arbiter_io_chosen; // @[MyArbiter.scala 68:21]
assign io_mysignal = arbiter_io_out_valid; // @[MyArbiter.scala 69:15]
assign arbiter_io_in_0_valid = io_in_0_valid; // @[MyArbiter.scala 66:17]
assign arbiter_io_in_0_bits = io_in_0_bits; // @[MyArbiter.scala 66:17]
assign arbiter_io_in_1_valid = io_in_1_valid; // @[MyArbiter.scala 66:17]
assign arbiter_io_in_1_bits = io_in_1_bits; // @[MyArbiter.scala 66:17]
assign arbiter_io_in_2_valid = io_in_2_valid; // @[MyArbiter.scala 66:17]
assign arbiter_io_in_2_bits = io_in_2_bits; // @[MyArbiter.scala 66:17]
assign arbiter_io_out_ready = io_out_ready; // @[MyArbiter.scala 67:18]
endmodule
|
|