![](/img/trans.png)
[英]Problem with creating structural modules using interfaces (SystemVerilog)
[英]SystemVerilog Using Array of Interfaces
我正在尝试使用 SystemVerilog 中的接口实现参数化可合成总线多路复用器。 下面,我简化了接口和复用器的实现。 多路复用器在其端口定义中有一组从接口:
interface bus_if();
logic req;
logic [31:0] addr;
modport master ( output req, addr );
modport slave ( input req, addr );
endinterface
module mux #(
parameter int N_SLAVES = 4
) (
bus_if.slave master,
bus_if.master slave[N_SLAVES]
);
...
endmodule
在顶层,我尝试创建一个像这样的总线复用器:
module top;
bus_if master(), slave1(), slave2();
mux #(
.N_SLAVES ( 2 )
) bus_mux ( master
.master ( data_if ),
.slave ( '{slave1, slave2 }) <-- Error here in Cadence Xcelium
);
endmodule
这在 ModelSim 中工作得很好。 但是,例如在 Cadence Xcelium 中尝试此操作时,会失败An instance name is not a legal rvalue
。
所以问题是:我只是使用 Modelsim 支持而 Xcelium 不支持的东西吗? 以及如何解决这个问题以使其在两者中都能正常工作?
看起来标准不允许在'{...}
模式中使用接口。 Modelsim 违反了标准。
实现它的一种方法是使用参数化接口:
interface bus_if#(N_SLAVES=1)();
logic req[N_SLAVES];
logic [31:0] addr[N_SLAVES];
modport master ( output req, addr );
modport slave ( input req, addr );
endinterface
module mux #(
parameter int N_SLAVES = 4
) (
bus_if.slave slave,
bus_if.master master
);
assign master.req[0] = slave.req[1];
// ...
endmodule
module top;
bus_if master();
bus_if #(.N_SLAVES(2)) slave();
mux #(
.N_SLAVES ( 2 )
) bus_mux (
.master ( master ),
.slave ( slave )
);
endmodule
这样它就可以在 cadence 和 Synopsys 中工作。 虽然不知道modelsim。
简单解决如下。
module top;
bus_if master(),
bus_if slave[0:1]();
mux #(
.N_SLAVES ( 2 )
) bus_mux ( master
.master ( data_if ),
.slave ( slave )
)
endmodule
你最好使用 modport,而不仅仅是像你那样接线。 可能会出现合成问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.