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

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任务应该能够像端口一样使用它们,即等待其上的变化、向其写入值等;基本上,这与在VHDL中将它们作为signal参数传递(而不是variableconstant参数)所实现的相同。
2个回答

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

感谢您的想法。然而,在我的情况下,该函数实现了特定于模块的行为,恰好使用了一些模块的端口。这种相当奇怪的间接性是由于代码是自动生成的,并且出于本问题之外的原因使用函数/包。;) - rainer

2

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

SystemVerilog IEEE Std 1800-2009 规定函数端口列表必须是一个数据类型。请参阅第13.4节、Annex A.2.6 和 Syntax 13-2,了解声明函数的语法。此外,请参阅 A.2.2.1 以定义数据类型。我也查看了 IEEE Std 1800-2005,它似乎也有同样的限制,只是没有清楚地说明。请参阅 1800-2005 的第 12.3 节和 Annex 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"`方法,无论何时需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接