126 lines
2.8 KiB
Systemverilog
126 lines
2.8 KiB
Systemverilog
|
|
||
|
|
||
|
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
|