7

是否有任何可综合的方式将接口传递给函数或任务?我的用例如下:我有一个包含多个功能的包(尽管我可以将它们转换为任务,如果有帮助的话:)),所有这些都可能在模块中使用并且可能需要访问模块的端口。现在,通常我只是将所有端口分组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基本上,通过将它们作为参数传递(与variable或参数相反)在 VHDL 中实现的效果相同constant

4

2 回答 2

2

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

SystemVerilog IEEE Std 1800-2009 说函数端口列表必须是 data_type。有关声明函数的语法,请参见第 13.4 节、附件 A.2.6 和语法 13-2。参见 A.2.2.1 来定义 data_type。我也检查了 IEEE Std 1800-2005,它似乎也有同样的限制,只是没有清楚地说明。请参见 1800-2005 的第 12.3 节和附录 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"在需要的地方使用经典方法。

于 2013-01-24T19:07:55.417 回答
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
于 2013-01-21T23:20:39.753 回答