
RTLILでの階層構造の確認。これはaddとmulの時にやってみたので簡単に想像できる。
以下のVerilogファイルで確認する。
module adder_wrapper ( input logic clk, input logic reset, input logic [31:0] in0, input logic [31:0] in1, input logic [31:0] in2, output logic [63:32] out ); logic [31: 0] temp; mult u_mult ( .clk(clk), .reset(reset), .in0 (in0), .in1 (in1), .out (temp) ); assign out = temp + in2; endmodule // adder_wrapper module mult ( input logic clk, input logic reset, input logic [31:0] in0, input logic [31:0] in1, output logic [31: 0] out ); always_ff @ (posedge clk, posedge reset) begin if (reset) begin out <= 'h0; end else begin out <= in0 * in1; end end endmodule // mult
multモジュールがadder_wrapper上でインスタンス化されている。
構造を書き出すと以下のようになった。まずはaddr_wrapperの構成。
Module Name = \adder_wrapper
Wires :
Name = $add$adder_wrapper.sv:22$1_Y, width = 32, start_offset = 0
Name = \temp, width = 32, start_offset = 0
Name = \out, width = 32, start_offset = 32
Name = \in2, width = 32, start_offset = 0
Name = \in1, width = 32, start_offset = 0
Name = \in0, width = 32, start_offset = 0
Name = \reset, width = 1, start_offset = 0
Name = \clk, width = 1, start_offset = 0
Cells :
Name = $add$adder_wrapper.sv:22$1
SigSpec : \Y <-> chunk $add$adder_wrapper.sv:22$1_Y
SigSpec : \B <-> chunk \in2
SigSpec : \A <-> chunk \temp
Name = \u_mult
SigSpec : \out <-> chunk \temp
SigSpec : \in1 <-> chunk \in1
SigSpec : \in0 <-> chunk \in0
SigSpec : \reset <-> chunk \reset
SigSpec : \clk <-> chunk \clk
Connections :
\out <- $add$adder_wrapper.sv:22$1_Y
Process :
multモジュールがCellとしてインスタンス化されているのと、addモジュールがCellとしてインスタンス化されている。Processは無し。
multモジュールの構成は以下。
Module Name = \mult
Wires :
Name = $mul$adder_wrapper.sv:39$3_Y, width = 32, start_offset = 0
Name = $0\out[31:0], width = 32, start_offset = 0
Name = \out, width = 32, start_offset = 0
Name = \in1, width = 32, start_offset = 0
Name = \in0, width = 32, start_offset = 0
Name = \reset, width = 1, start_offset = 0
Name = \clk, width = 1, start_offset = 0
Cells :
Name = $mul$adder_wrapper.sv:39$3
SigSpec : \Y <-> chunk $mul$adder_wrapper.sv:39$3_Y
SigSpec : \B <-> chunk \in1
SigSpec : \A <-> chunk \in0
Connections :
Process :
$proc$adder_wrapper.sv:35$2
sigsig: chunk $0\out[31:0] <-> chunk \out
sigsig: chunk $0\out[31:0] <->
sigsig: chunk $0\out[31:0] <-> chunk $mul$adder_wrapper.sv:39$3_Y
sigsig: chunk \out <-> chunk $0\out[31:0]
sigsig: chunk \out <-> chunk $0\out[31:0]
クロックで一回たたいているため、Processによって乗算の結果(Y)が一度clkで叩かれている。