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