Systemverilog接口 - 嵌套接口vs modport

时间:2018-04-11 16:58:46

标签: system-verilog

我可以使用嵌套接口代替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

当我正在寻找的信号存在于主界面中时,这变得更有吸引力,但我现在想把它们带入一些通用模块。例如,一个电源门控模块,通常只有第一个,但现在我也想传入。我可以在电源门控模块的接口级别更改它,而不是在每个接口内部。

1 个答案:

答案 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

这很可能无法合成。