Параметризованный интерфейс в systemverilog - PullRequest
0 голосов
/ 22 января 2020

У меня есть полный AXI-интерфейс и облегченный AXI-интерфейс, как показано ниже:

interface axi_full ();
  logic [63:0] wdata;
  logic .      wid;
  logic wcredit;
endinterface

interface axi_lite();
  logic [63:0] wdata;
  logic wcredit;
endinterface

Можно ли использовать только один интерфейс с параметром lite, как показано ниже, вместо двух отдельных интерфейсов? Единственное отличие состоит в том, что в случае AXI lite отсутствует wid.

interface axi #(bit Lite = 1'b0) ();
  ...
  ...
endinterface

Ответы [ 3 ]

0 голосов
/ 23 января 2020

В стандарте нет ничего, что препятствовало бы использованию блоков генерации внутри интерфейсов. Итак, должно работать следующее:

interface axi #(FULL=1)();
  logic [63:0] wdata;
  logic       wid;
  if (FULL != 0) begin: fff
      logic wcredit;
  end
endinterface

module top;
  axi#(1) full();
  axi#(0) lite();
  imod fm(full);
  //imod lm(lite);
endmodule

module imod(axi i);
  initial begin
    $display(i.wdata, i.wid, i.fff.wcredit);
  end
endmodule

Проблема, как всегда, в реализации поставщика. Сказанное выше работает хорошо в каденции nc. Раскомментирование строки 'lite' вызовет ошибку.

Тем не менее, synopsys vcs, по крайней мере, тот, что на eda детской площадке, отказывается компилировать его, жалуясь на невыполненную функцию xmrs в интерфейсах.

Синтез может иметь свои мысли по этому поводу. Итак, лучший способ - использовать отдельные определения.

Также это зависит от того, как вы их используете, modports может пригодиться. Они реализованы лучше, и следующий пример должен работать везде:

interface axi_if;
  logic [63:0] wdata;
  logic       wid;
  logic wcredit;
  modport full (input wdata, wid, wcredit);
  modport lite(input wdata, wid);
endinterface

module top;
  axi_if intf();
  fmod fm(intf);
  lmod lm(intf);
endmodule


module fmod(axi_if.full i);
    initial begin      
      $display(i.wdata, i.wid, i.wcredit);
    end
endmodule

module lmod(axi_if.lite i);
    initial begin      
      $display(i.wdata, i.wid); //, i.wcredit);
    end
endmodule
0 голосов
/ 23 января 2020

То, что вы говорите, невозможно, но вы можете поместить сигнал виджета в директиву компиляции ifdef следующим образом

interface axi();
  logic [63:0] wdata;
`ifdef AXI_FULL
  logic       wid;
`endif
  logic wcredit;
endinterface

определять AXI_FULL, когда вы не используете AXI-Lite, также принимайте это во внимание, пока интерфейс подключения Axi

0 голосов
/ 22 января 2020

К сожалению нет. Вы должны иметь возможность использовать axi_full и оставить сигнал wid неиспользованным.

...