SystemVerilog:将接口传递给函数/任务(用于综合!)

rai*_*ner 6 synthesis interface system-verilog

是否有任何可综合的方法将接口传递给函数或任务?我的用例如下:我有一个包含多个函数的包(虽然我可以将它们转换为任务,如果这有帮助:)),所有这些都可能在模块中使用,可能需要访问模块的端口.现在,通常我只是将所有端口分组interface,将其添加到模块,然后将其传递virtual给函数.但是,我的综合工具手册提到virtual不支持.

我错过了什么吗?必须有一种方法为合成任务提供端口,类似于VHDL的signal参数?

一些示例代码:

module mymod (
    input logic clk,
    input logic rst,
    input uint16_t adr,
    input bit cyc,
    input uint32_t dat_m,
    input bit stb,
    input bit we,
    output bit ack,
    output uint32_t dat_s
    );

    always_comb begin
        mypack::do_something(a, b, c, adr, cyc, dat_m, stb, we, ack, dat_s);
endmodule
Run Code Online (Sandbox Code Playgroud)

理想情况下,任务mypack::do_something可以将端口用作端口,即等待它们的更改,向它们写入值等; 基本上,你通过传递它们作为signal参数(而不是variable或constant参数)在VHDL中实现的相同.

小智 2

通常,您会在接口定义本身中声明任何特定于接口的函数。这样,任何任务或函数声明都已经在范围内具有接口端口。

interface int1(ports...);
  function func1(args...);
  // Do stuff with ports and args
  endfunction
endinterface

module mod1(input wire clk,interface intf);
...
  always @(posedge clk)
    intf.func1(module_specific_data); 
...
endmodule
Run Code Online (Sandbox Code Playgroud)