SystemVerilog Использование массива интерфейсов - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь реализовать параметр c синтезируемого шинного мультиплексора, используя интерфейсы в 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 нет? И как это исправить, чтобы он работал в обоих?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Похоже, что стандарт не позволяет использовать интерфейсы в шаблонах '{...}. 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

, так как он работает в каденции и кратком изложении. Впрочем, понятия не имею о моделях.

0 голосов
/ 16 марта 2020

Это просто разрешается, как показано ниже.

module top; 
  bus_if master(), 
  bus_if slave[0:1](); 
  mux #( 
    .N_SLAVES ( 2 ) 
  ) bus_mux ( master 
      .master ( data_if ), 
      .slave  ( slave   )
  )
endmodule

Вам лучше использовать модпорт, а не просто провод, как вы это делаете. Это может вызвать проблемы синтеза.

...