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

时间:2013-01-21 13:20:59

标签: interface system-verilog synthesis

是否有任何可综合的方法将接口传递给函数或任务?我的用例如下:我有一个包含多个函数的包(虽然我可以将它们转换为任务,如果这有帮助:)),所有这些都可能在模块中使用,可能需要访问模块的端口。现在,通常我只需将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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

不幸的是,看起来接口必须是虚拟的才能通过函数或任务端口列表传递。

SystemVerilog IEEE Std 1800-2009说功能端口列表必须是data_type。有关声明函数的语法,请参见第13.4节,附录A.2.6和语法13-2。有关定义data_type,请参阅A.2.2.1。我也检查了IEEE Std 1800-2005,它似乎也有相同的限制,只是没有明确说明。见第12.3节和1800-2005的附录A.

如果您想使用界面,请尝试在界面中使用翻译功能来制作结构(可能需要packed,参见IEEE Std 1800-2009第13.4节,脚注#12):

interface myif ( /* ... */);
/* signal list */
function mypack::var_list_s toStruct();
   /* make translation */
endfunction : toStruct
endinterface : myif

module mymod(myif my_if);
always_comb
   mypack::do_something(my_if.toStruct(), my_if.ack, my_if.dat_s);
endmodule : mymod

或者,您可以随时使用经典的`include "myports"方法。