Перейти к содержанию
    

Интерфейсы с параметрами в интерфейсах модулей

Добрый день !

Читая стандарт и экспериментируя на SV я так и не понял, есть ли возможность в интерфейс модуля подставлять ПАРАМЕТРИЧЕСКИЕ интерфейсы, то есть что-то вроде:

 

module my_module 
(
input clk, reset,
avalon_interface.master # ( .DATA_WIDTH(32), .ADDR_WIDTH(4))
)

...

endmodule

Например, я часто использую для внутренних шин авалон, но у разных модулей разная ширина адресного сигнала.

Пока, единственное, что приходит мне на ум - это переопределение `DEFINE, но это не красиво, и я не уверен, что так можно делать. А копировать интерфейсы для разных модулей:

avalon_interface_DATA32_ADDR4,

avalon_interface_DATA32_ADDR5,

avalon_interface_DATA32_ADDR6...

совсем некрасиво.

Кто-нибудь знает решение ?

Спасибо

Изменено пользователем murmel1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-нибудь знает решение ?

 

дык в стандарте же написано. Правда синтезируемость не гарантирую %)

 

interface pipa_if #(parameter pA_W = 32, pD_W = 32) (clk, reset);

  input logic clk  ;
  input logic reset;

  logic [pA_W-1:0] addr;
  logic [pD_W-1:0] data;

  modport slave (input clk, reset, addr, output data);

endinterface

module sub (interface intf);

  logic [intf.pA_W-1:0] addr;
  logic [intf.pD_W-1:0] data;

  assign addr       = intf.addr;
  assign intf.data  = data     ;


  always_ff @(posedge intf.clk or posedge intf.reset) begin
    if (intf.reset)
      data <= '0;
    else
      data <= addr + 1'b1;
  end

endmodule

module top (input clk, reset, [31:0] addr, output [31:0] data0, [15:0] data1, [7:0] data2 );

  pipa_if #(32, 32) pipa_32_32_if(clk, reset);
  pipa_if #(32, 16) pipa_32_16_if(clk, reset);
  pipa_if #(32,  8)  pipa_32_8_if(clk, reset);

  sub sub32 ( pipa_32_32_if );
  sub sub16 ( pipa_32_16_if );
  sub  sub8 (  pipa_32_8_if );

  assign data0 = pipa_32_32_if.data;
  assign data1 = pipa_32_16_if.data;
  assign data2 =  pipa_32_8_if.data;

  assign pipa_32_32_if.addr = addr;
  assign pipa_32_16_if.addr = addr;
  assign  pipa_32_8_if.addr = addr;

endmodule

// synthesis translate_off
module tb;

  bit clk, reset;
  bit [31:0] addr;
  bit [31:0] data0;
  bit [15:0] data1;
  bit  [7:0] data2;

  top top (.*);

  initial begin : clk_gen
    clk = 1'b0;
    #5 forever #5 clk = ~clk;
  end

  initial begin : reset_gen
    reset = 1'b1;
    repeat (2) @(negedge clk);
    reset = 1'b0;
  end

  assign addr = 0;

endmodule
// synthesis translate_on

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не то что нужно.

В вашем примере у этого модуля:

module sub (interface intf);

У интерфейса intf ширина сигналов определяется параметрами интерфейса по умолчанию.

А у этого все порты прописаны вручную:

module top (input clk, reset, [31:0] addr, output [31:0] data0, [15:0] data1, [7:0] data2 );

Меня же интересует именно сокращение текста в описании входов и выходов модуля. То есть, что бы интерфейс везде использовался один, но с разными ширинами.

Чтобы сразу было видно, какая у него ширина адреса (и др.), и не надо было писать это вручную (100% где-нибудь забудешь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У интерфейса intf ширина сигналов определяется параметрами интерфейса по умолчанию.

 

ширина определяется при назначении интерфейса, см рисунок в атаче. Запустите сами симулятор если не верите.

 

Меня же интересует именно сокращение текста в описании входов и выходов модуля. То есть, что бы интерфейс везде использовался один, но с разными ширинами.

 

а пример это разве не сокращение текста? я вообще отказался от использования интерфейсов для синтеза, пока не будет их нормальной поддержки во всех средствах синтеза %) Сейчас за меня эту работу делают скрипты и редактор.

 

Начнем с начала. Инстанс интерфейса - это объект статический, он либо есть либо его нет. И этот объект имеет статические, не изменяемые параметры. Когда вы "передаете" интерфейс по иерархии вы, по сути, передаете указатель на этот интерфейс.

 

Судя по вашей фразе вы хотите иметь в своем коде один инстанс интерфейса и передавать в модули указатели на его, как бы так сказать, "части" ? ну и как вы себе это представляете ? :) Есть в интерфейсе 32 разрядная шина и вы передаете указатель на ее 8 ми битный кусочек в модуль ? :))

 

Если вы имели в виду "То есть, что бы декларация интерфейса везде использовалась одна, но с разными ширинами" то этот пример я вам привел. Декларация одна, но 3 инстанса этой декларации интерфейса. указатели на который передаются в подмодули. И каждый модуль видит только тот интерфейс который должен видеть.

 

Сигналы подмодулей я специально ввел что бы показать вам что ширины будут определяться параметрами интерфейса на который передан указатель. Если делать кратко то можно без них.

 

Взаимодействия между этими инстансами интерфейса это уж ручками %)

 

На топе шины выведены для возможности синтеза. Вас же синтез интересует? Из топ модуля интерфейсы наружу торчать не могут. По крайней мере в ква.

post-3453-1230366281_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...