我可以使用嵌套接口代替modport吗?
这样做的目的是在利用接口简化连接的同时,对许多不同模块进行大规模互连。我不喜欢使用通用接口 - 它们很难在源代码中使用。
如果我有许多模块使用的通用模块(例如,reset_synchronizer),那么我可以在每个接口中定义一个modport来定义该模块的信号,例如:
interface xyz(input clk, input arst);
logic srst;
modport reset_synchronizer_mp (input clk, input arst, output srst);
endinterface
我可以在每个需要同步重置的接口中定义它。但是当我需要更改reset_synchronizer模块时,可能要传入一个enable,我需要更新接口端口(添加启用信号),并更新为reset_synchronizer创建modport的所有接口中的每个modport。
interface xyz(input clk, input enable, input arst);
logic srst;
modport reset_synchronizer_mp (input clk, input enable, input arst, output srst);
endinterface
如果不使用modport,我使用嵌套接口(reset_synchronizer_intf),我不能在主界面内执行此操作:
interface xyz(input clk, input arst);
logic srst;
reset_synchronizer_intf reset_synchronizer_mp (clk, arst, srst);
endinterface
为了简化这一点(假设信号名称匹配):
interface xyz(input clk, input arst);
logic srst
reset_synchronizer_intf reset_synchronizer_mp (.*);
endinterface
要添加启用,我只是更新主reset_synchronizer.sv(定义模块和接口)并更新所有接口,但仅在端口列表或信号声明中:
interface xyz(input clk, input enable, input arst);
reset_synchronizer_intf reset_synchronizer_mp (.*);
endinterface
当我正在寻找的信号存在于主界面中时,这变得更有吸引力,但我现在想把它们带入一些通用模块。例如,一个电源门控模块,通常只有第一个,但现在我也想传入。我可以在电源门控模块的接口级别更改它,而不是在每个接口内部。
答案 0 :(得分:0)
虽然这适用于定义结构化信号束,但是您无法使用modport指定方向,因为它们不能按层次结构组合。这也意味着您需要在连接到界面xyz时知道嵌套。
module top;
xyx xyz_if(.*)
mymodule inst(xyx_if);
endmodule
module mymodule (xyz xyz_p);
...
xyz.reset_synchronizer_mp.enable = 1;
endmodule
这很可能无法合成。