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