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
で叩かれている。