FPGA開発日記

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

Yosysの使い方を勉強する (7. WireとCellの関係性)

まずはYosysに簡単なPassを作ってみる。モジュール内の配線やセルをリストアップしてみよう。

search_wires()search_cells()を作って、モジュール内の配線などを出力してみる。

  void search_wires (RTLIL::Module* module) {
    log("  Wires :\n");
    // auto wires = module->selected_wires();
    auto wires = module->wires();
    for (auto iter = wires.begin(); iter != wires.end(); iter++) {
      log("   Name = %s, width = %d, start_offset = %d\n",
          (*iter)->name.c_str(),
          (*iter)->width,
          (*iter)->start_offset
          );
    }
  }

  void search_cells (RTLIL::Module* module) {
    log("  Cells :\n");
    auto wires = module->cells();
    for (auto iter = wires.begin(); iter != wires.end(); iter++) {
      log("   Name = %s\n", (*iter)->name.c_str());
    }
  }

こうすると、以下のようにリストアップできる。

  Wires :
   Name = $add$adder.sv:48$3_Y, width = 32, start_offset = 0
   Name = $mul$adder.sv:44$2_Y, width = 32, start_offset = 0
   Name = $0\temp[31:0], 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.sv:48$3
   Name = $mul$adder.sv:44$2

次に、Module内の接続について見てみる。これにはconnections()を使う。これま主にモジュールの出力の接続について見るものらしい。

  void search_connections (RTLIL::Module* module) {
    log("  Connections :\n");
    auto conn = module->connections();
    for (auto iter = conn.begin(); iter != conn.end(); iter++) {
      log("   %s -> %s\n", (*iter).first.as_chunk().wire->name.c_str(),
          (*iter).second.as_chunk().wire->name.c_str());
    }
  }

これをこれにより、出力ポートの接続を確認することができる。

  Connections :
   \out <- $add$adder.sv:48$3_Y

なんとなく分かってきた。