開発日記

Erlangをダラダラ書きます。

モジュール間の依存性の排除,System verilog

メリット

  • 新しい処理を追加したければ,新たなinterfaceを作成して,メインモジュールで繋げるだけで良い.

  • generate文でparameterごとに切り替える処理だと,parameterの変更と,その度に該当モジュールを修正しないといけない.(モジュールは触りたくないので,interfaceで特別な処理を書くだけにしたい.)

流れ

  • interfaceで異なる処理を実装.

  • 共通の処理をモジュールで実装

  • generic interfaceでinterfaceのインスタンスを接続

interfaceA,Bで異なる処理を実装
  • 各実装は共通のインターフェースmodport portを持つ.
interface A #(
  parameter int hoge = ..
)(
  input wire clock,
  input wire reset
);

  logic [hoge-1:0] addr;
  logic [hoge-1:0] inst;

  modport port (
    input     addr
    output  inst
  );
  // A処理の実装
endinterface

interface B #(
  parameter int hoge = ..
)(
  input wire clock,
  input wire reset
);
  logic [hoge-1:0] addr;
  logic [hoge-1:0] inst;

  modport port (
    input     addr
    output  inst
  );
  // B処理の実装
endinterface
モジュールCでA,Bの共通の処理を実装.
module C (
  interface.port port
  input wire pc;
);
  logic [31:0] result;

  always_comb begin
    port.addr = pc;
    result = port.inst;
  end
endmodule
メインモジュールでinterfaceをインスタンス化し渡す.
  • ここではinterface Aをインスタンス化し,モジュールCに渡している.
A a_hoge();
C c_hoge (
  .port (a_hoge),
  .pc (pc)
);

参考