下面我们把程序稍作改动,将a/b/c三个接口使用SystemVerilog中的interface来连接。
在工程中添加my_itf.sv文件如下:
// my_itf.sv
interface my_itf;
logic [3:0] a, b, c;
modport mod1 (input c, output a, b);
modport mod2 (input a, b, output c );
endinterface : my_itf
关键字interface就表示要创建一个接口模块,里面包含了3个接口:a/b/c。
modport定义了这三个接口的方向,对于module1来说,a和b是输出,c是输入;对于module2来说,a和b是输入,c是输出。
注:也可以不使用modport,Vivado会根据代码自动推断出接口的方向,但不建议这么做
修改module1.sv如下,其中a/b/c端口换成了my_itf.mod1 itf_abc,my_itf.mod1就表示my_itf接口的方向按照mod1中指定的,而且代码中的a、b、c要相应的换成itf_abc.a、itf_abc.b、itf_abc.c.
// module1.sv
module module1(
input clk,
input rst,
my_itf.mod1 itf_abc,
output logic [3:0] led
);
assign led = itf_abc.c | itf_abc.a;
always @ ( posedge clk ) begin
if(rst) begin
itf_abc.a 《= 4’d1;
itf_abc.b 《= 4‘d2;
end
else begin
itf_abc.a 《= itf_abc.a + 1’b1;
itf_abc.b《= itf_abc.b + 1‘b1;
end
end
endmodule
修改module2.sv代码如下,原则跟上面是一样的,不再赘述。
// module2.sv
module module2(
input clk,
input rst,
my_itf.mod2 itf_abc
);
always @ ( posedge clk ) begin
if(rst)
itf_abc.c 《= 4’d1;
else
itf_abc.c 《= itf_abc.a + itf_abc.b;
end
endmodule
修改top.sv如下,例化my_itf接口,将itf_abc.mod1传给module1,将itf_abc.mod2传给module2.
// top.sv
module top(
input clk,
input rst,
output [3:0] led
);
logic [3:0] a ;
logic [3:0] b ;
logic [3:0] c ;
my_itf itf_abc();
module1 inst_module1(
.clk (clk ),
.rst (rst ),
.itf_abc (itf_abc.mod1),
.led (led)
);
module2 inst_module2(
.clk (clk ),
.rst (rst ),
.itf_abc (itf_abc.mod2)
);
endmodule
大功告成!!!
综合后Schematic如下,跟上面的图只是名字不同,电路是一样的。