我正在研究将接口引入到当前未使用接口的代码库中。
为此,我需要使用适配器将接口再次转换为单独的信号。
我想这样做:
interface foo();
logic a;
logic b;
logic c;
modport source(input a, c,
output b);
modport sink(input b, c,
output a);
endinterface // foo
module foo_source_to_ports
(
foo f,
input logic a,
input logic c,
output logic b);
assign f.a = a;
assign f.c = c;
assign b = f.b;
endmodule
module foo_ports_to_source
(
foo f,
output logic a,
output logic c,
input logic b);
assign a = f.a;
assign c = f.c;
assign f.b = b;
endmodule
module foo_sink_to_ports
(
foo f,
input logic b,
input logic c,
output logic a);
assign f.b = b;
assign f.c = c;
assign a = f.a;
endmodule
module foo_ports_to_sink
(
foo f,
output logic b,
output logic c,
input logic a);
assign b = f.b;
assign c = f.c;
assign f.a = a;
endmodule
我想知道是否有人知道更好的方法。我想我不是唯一有这个问题的人。
答案 0 :(得分:0)
我认为你是在思考它。为什么不直接在RTL中实例化接口,并使用assign
语句将其信号直接连接到其他信号?
即使您使用为您执行这些分配的适配器,您仍需要在其实例化时为其指定所有端口连接,除了它包含的分配列表。您将拥有大量冗余信息(因此,如果需要更改,您的代码中需要编辑很多地方)。
答案 1 :(得分:-1)
这段代码看起来很奇怪,因为:
我知道vcs支持RTL中的接口端口,但是mvsim不支持。
这就是我所期望的:
module source (
foo.source f
)
// Use interface
endmodule
module sink(
foo.sink f
);
module top();
foo f;
source u_source(.f(f));
sink u_sink(.f(f));
endmodule
就我个人而言,我认为这是编写RTL的一种极好方法,可以使代码更清晰,更易于维护。但是,EDA支持似乎很不稳定。