繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM