FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Yosysの使い方を勉強する (9. 階層構造の確認)

RTLILでの階層構造の確認。これはaddmulの時にやってみたので簡単に想像できる。 以下の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で叩かれている。