【问题标题】:SystemVerilog: Passing interfaces to functions/tasks (for synthesis!)SystemVerilog:将接口传递给函数/任务(用于综合!)
【发布时间】:2013-01-21 13:20:58
【问题描述】:

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

【问题讨论】:

    标签: interface system-verilog synthesis


    【解决方案1】:

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

    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
    

    【讨论】:

    • 感谢您的想法。但是,在我的例子中,该函数实现了模块特定的行为,恰好使用了模块的某些端口。这种相当奇怪的间接是由于代码是自动生成的,并且出于这个问题之外的原因使用函数/包;)。
    【解决方案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,它似乎也有同样的限制,只是没有清楚地说明。请参阅第 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" where 需要的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多