veryl icon indicating copy to clipboard operation
veryl copied to clipboard

[Feature] Function with args of which type is interface

Open taichi-ishitani opened this issue 5 months ago • 1 comments

考えがちゃんとまとまっていないので、日本語で。

virtual function であれば関数の引数にすることとができるが、それでは RTL 中で使えない。

  • 合成できるか不明
  • always_comb とかで使う際に、イベントを推定できない(と思う)

Veryl 上で、interface を引数に取る関数を定義した場合、SV に出力する際に interface 中の各信号を引数に取る関数定義に書き換えてやればよい。

例えば、以下のようなコードの場合、

interface foo_if #(
  param WIDTH: u32 = 8.
){
  var ready: logic;
  var valid: logic;
  var data: logic<WIDTH>;

  modport master {
    ready: input,
    valid: output,
    data:  output
  }

  modport slave {
    ready: output,
    valid: input,
    data:  input,
  }
}

function connect_foo_if (
    slave_if:  modport foo_if#(WIDTH)::slave,
    master_if: modport foo_if#(WIDTH)::master,
) {
  slave_if.ready  = master_if.ready;
  master_if.valid = slave_if.valid;
  master_if.data  = slave_if.data;
}

always_comb {
  connect_foo_if(slave_if, master_if);
}

出力はこのようなる。

function void connect_foo_if (
  output logic             slave_if_ready,
  input  logic             slave_if_valid,
  input  logic [WIDTH-1:0] slave_if_data,
  input  logic             master_if_ready,
  output logic             master_if_valid,
  output logic [WIDTH-1:]  master_if_data
);
  // 省略
endfunction

always_comb begin
  connect_foo_if(slave_if.ready, slave_if.valid, slave_if.data, ..);
end

taichi-ishitani avatar Sep 12 '24 05:09 taichi-ishitani