veryl
veryl copied to clipboard
[Feature] Function with args of which type is interface
考えがちゃんとまとまっていないので、日本語で。
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