| |
| |
| module TopModule( |
| input logic clk, |
| input logic rst, |
| output logic [21:0] outOther, |
| input logic [1:0] sig, |
| input logic flip, |
| output logic [1:0] sig_out, |
| MyInterface.submodule1 interfaceInstanceAtTop, |
| output logic [15:0] passThrough); |
| |
| MyInterface #(.WIDTH(4)) MyInterfaceInstance(); |
| |
| SubModule1 u_SubModule1 ( |
| .clk(clk), |
| .rst(rst), |
| .u_MyInterface(MyInterfaceInstance), |
| .u_MyInterfaceFromTop(interfaceInstanceAtTop), |
| .outOther(outOther), |
| .sig (sig) |
| ); |
| |
| assign sig_out = MyInterfaceInstance.mysig_out; |
| |
| |
| assign MyInterfaceInstance.setting = flip; |
| |
| assign passThrough = MyInterfaceInstance.passThrough; |
| |
| endmodule |
| |
| interface MyInterface #( |
| parameter WIDTH = 3)( |
| ); |
| |
| logic setting; |
| logic [WIDTH-1:0] other_setting; |
| |
| logic [1:0] mysig_out; |
| |
| logic [15:0] passThrough; |
| |
| modport submodule1 ( |
| input setting, |
| output other_setting, |
| output mysig_out, |
| output passThrough |
| ); |
| |
| modport submodule2 ( |
| input setting, |
| output other_setting, |
| input mysig_out, |
| output passThrough |
| ); |
| |
| endinterface |
| |
| |
| module SubModule1( |
| input logic clk, |
| input logic rst, |
| MyInterface.submodule1 u_MyInterface, |
| MyInterface.submodule1 u_MyInterfaceFromTop, |
| input logic [1:0] sig, |
| output logic [21:0] outOther |
| |
| ); |
| |
| |
| always_ff @(posedge clk or posedge rst) |
| if(rst) |
| u_MyInterface.mysig_out <= 0; |
| else begin |
| if(u_MyInterface.setting) |
| u_MyInterface.mysig_out <= sig; |
| else |
| u_MyInterface.mysig_out <= ~sig; |
| end |
| |
| MyInterface #(.WIDTH(22)) MyInterfaceInstanceInSub(); |
| |
| SubModule2 u_SubModule2 ( |
| .clk(clk), |
| .rst(rst), |
| .u_MyInterfaceFromTopDown(u_MyInterfaceFromTop), |
| .u_MyInterfaceInSub2(u_MyInterface), |
| .u_MyInterfaceInSub3(MyInterfaceInstanceInSub) |
| ); |
| |
| assign outOther = MyInterfaceInstanceInSub.other_setting; |
| |
| assign MyInterfaceInstanceInSub.setting = 0; |
| assign MyInterfaceInstanceInSub.mysig_out = sig; |
| |
| endmodule |
| |
| module SubModule2( |
| |
| input logic clk, |
| input logic rst, |
| MyInterface.submodule2 u_MyInterfaceInSub2, |
| MyInterface.submodule1 u_MyInterfaceFromTopDown, |
| MyInterface.submodule2 u_MyInterfaceInSub3 |
| |
| ); |
| |
| assign u_MyInterfaceFromTopDown.mysig_out = u_MyInterfaceFromTop.setting ? 10 : 20; |
| |
| always_comb begin |
| if (u_MyInterfaceInSub3.mysig_out == 2'b00) |
| u_MyInterfaceInSub3.other_setting[21:0] = 1000; |
| else if (u_MyInterfaceInSub3.mysig_out == 2'b01) |
| u_MyInterfaceInSub3.other_setting[21:0] = 2000; |
| else if (u_MyInterfaceInSub3.mysig_out == 2'b10) |
| u_MyInterfaceInSub3.other_setting[21:0] = 3000; |
| else |
| u_MyInterfaceInSub3.other_setting[21:0] = 4000; |
| end |
| |
| assign u_MyInterfaceInSub2.passThrough[7:0] = 124; |
| assign u_MyInterfaceInSub2.passThrough[15:8] = 200; |
| |
| endmodule |