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

одинаковые interface в модулях тестбенча

Здравствуйте,

Прошу помочь с такой проблемой:

 

Имеется два toplvl модуля, с некоторыми одинаковыми подмодулями связываемыми интерфейсами. Интерфейсы в основном имеют одинаковые порты, но есть и отличающиеся.

////////////TB//////////////    
module tb();
logic reset = 'b0;
    m1 m1(
        .reset(reset)
        );
    m2 m2(
        .reset(reset)
        );
    endmodule
////////////TOP1////////////////////    
interface bus_a(input logic reset);
    logic clk;
    logic clk_b;
    endinterface    
    
module m1(input logic reset);
    bus_a bus_a(.reset(reset));
    m1_1 m1_1(.bus_a(bus_a));
    endmodule
    
module m1_1(bus_a bus_a);
    logic m1_1_clk = 'b0;
    assign bus_a.clk = m1_1_clk;
    assign bus_a.clk_b = ~ m1_1_clk;
    always #10 m1_1_clk <= ~m1_1_clk;
    endmodule
    
/////////////TOP2/////////////////
interface bus_a(input logic reset);
    logic clk;
    logic clk_a;
    endinterface
    
module m2(input logic reset);
    bus_a bus_a(.reset(reset));
    m2_1 m2_1(.bus_a(bus_a));
    endmodule

module m2_1(bus_a bus_a);
    logic m2_1_clk = 'b0;
    assign bus_a.clk = m2_1_clk;
    assign bus_a.clk_a = ~ m2_1_clk;
    always #20 m2_1_clk <= ~m2_1_clk;
    endmodule    
////////////////////////////////

ошибка в modelsim:

[CNNODP] - Component name (clk_b) is not on a downward path.

Unresolved reference to 'clk_b' in bus_a.clk_b.

 

Можно создать одинаковые интерфейсы, где порты будут одинаковыми для TOP1 и для TOP2, но разве это правильное решение?

 

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


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

вообще не очень понятно что вы делаете.

 

Не очень понятно где вы создали инстанс интерфейса, то есть вы его описали - здорово, а где сам интерфейс то создается, где его экземпляр?

Не очень понятно зачем называть одинаково разные интерфейсы?

Не очень понятно зачем 2 топ модуля в одном файле?

 

скорее всего проблема в том что вы путаете экземпляр и описание интерфейса. И пытаетесь на уровне описания делать различные его экземпляры. Ну или я вообще не понял что вы делаете:)

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


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

ошибка в modelsim:

Не надо определять в одной области видимости интерфейсы с одинаковыми именами. Modelsim сначала распознал первый интерфейс bus_a, встретив второй интерфейс с тем же именем, он переопределил интерфейс bus_a. Если в разделе "TOP 1" везде поменять bus_a на bus_b все успешно скомпилится и запустится

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


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

Не очень понятно где вы создали инстанс интерфейса, то есть вы его описали - здорово, а где сам интерфейс то создается, где его экземпляр?

экземпляр:

 bus_a bus_a(.reset(reset));

 

Не очень понятно зачем называть одинаково разные интерфейсы?

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

например так:

создаю экземпляр:

bus_a bus_X(.reset(reset));

подключаю подмодуль:

m2_1 m2_1(.bus_a(bus_X));

в подмодуле имею объявление порта:

module m2_1(bus_a bus_a)

получаю ошибку о не соответствии интерфейсов:

Modelsim:The interface port 'bus_a' of type 'bus_a' must be passed the same-type interface.

 

Сейчас попробовал использовать объявление интерфейса в подмодуле таким путем:

module m2_1(interface bus_a)

ошибок нет, все работает; :biggrin:

Но теперь, судя по Вашей реакции создается впечатление, что я как то неверно использую интерфейсы. Подскажите, как Вы используете интерфейсы в этих случаях, т.е. когда надо объединять несколько топ модулей в тестбенче? или одинаковые интерфейсы Вы не применяете?

 

Не надо определять в одной области видимости интерфейсы с одинаковыми именами. Modelsim сначала распознал первый интерфейс bus_a, встретив второй интерфейс с тем же именем, он переопределил интерфейс bus_a. Если в разделе "TOP 1" везде поменять bus_a на bus_b все успешно скомпилится и запустится

Подскажите пожалуйста, как определять в интерфейсы в разных областях видимости?

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


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

экземпляр:

 bus_a bus_a(.reset(reset));

 

 

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

например так:

создаю экземпляр:

bus_a bus_X(.reset(reset));

подключаю подмодуль:

m2_1 m2_1(.bus_a(bus_X));

в подмодуле имею объявление порта:

module m2_1(bus_a bus_a)

получаю ошибку о не соответствии интерфейсов:

 

Приведите полный код. По данному описанию ничего не понятно

 

Подскажите пожалуйста, как определять в интерфейсы в разных областях видимости?

 

////////////TB//////////////    
module tb();
logic reset = 'b0;
    top1 m1(
        .reset(reset)
        );
    top2 m2(
        .reset(reset)
        );
    endmodule
////////////TOP1////////////////////    
module top1(input logic reset);
  interface bus_a(input logic reset);
      logic clk;
      logic clk_b;
      endinterface    
      
  module m1(input logic reset);
      bus_a bus_a(.reset(reset));
      m1_1 m1_1(.bus_a(bus_a));
      endmodule
      
  module m1_1(bus_a bus_a);
      logic m1_1_clk = 'b0;
      assign bus_a.clk = m1_1_clk;
      assign bus_a.clk_b = ~ m1_1_clk;
      always #10 m1_1_clk <= ~m1_1_clk;
      endmodule
  m1 m1_instance(
    .reset(reset)
    );
endmodule
    
/////////////TOP2/////////////////
module top2(input logic reset);
  interface bus_a(input logic reset);
      logic clk;
      logic clk_a;
      endinterface
      
  module m2(input logic reset);
      bus_a bus_a(.reset(reset));
      m2_1 m2_1(.bus_a(bus_a));
      endmodule

  module m2_1(bus_a bus_a);
      logic m2_1_clk = 'b0;
      assign bus_a.clk = m2_1_clk;
      assign bus_a.clk_a = ~ m2_1_clk;
      always #20 m2_1_clk <= ~m2_1_clk;
      endmodule
  m2 m2_instance(
        .reset(reset)
        );
endmodule
////////////////////////////////

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


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

я ошибочно полагал, что интерфейс может быть только за модулями, видимо по причине привычки называть инстанс одноименно модулю(в этом случае компилятор ругается созданный экземпляр)

в пример добавил общий для всех модуль

в итоге:

////////////TB//////////////    
module tb();
logic reset = 'b0;
    top1 m1(
        .reset(reset)
        );
    top2 m2(
        .reset(reset)
        );
    endmodule
////////////TOP1////////////////////    
module top1(input logic reset);
  interface bus_a(input logic reset);
      logic clk;
      logic clk_b;
      endinterface  
      
    bus_a bus_a_instance(.reset(reset));
    m1_1 m1_1(.bus_a(bus_a_instance));
    gen gen_instance(.bus_a(bus_a_instance));
    
    endmodule
    
/////////////TOP2/////////////////
module top2(input logic reset);
  interface bus_a(input logic reset);
      logic clk;
      logic clk_a;
      endinterface 

    bus_a bus_a_instance(.reset(reset));
    m2_1 m2_1(.bus_a(bus_a_instance));
    gen gen_instance(.bus_a(bus_a_instance));
    
    endmodule

////////////подмодуль TOP1////////////
module m1_1(bus_a bus_a);
    logic m1_1_clk = 'b0;
    assign bus_a.clk = m1_1_clk;
    assign bus_a.clk_b = ~ m1_1_clk;
    always #10 m1_1_clk <= ~m1_1_clk;
    endmodule
////////////подмодуль TOP2////////////
module m2_1 (bus_a bus_a);
    logic m2_1_clk = 'b0;
    assign bus_a.clk = m2_1_clk;
    assign bus_a.clk_a = ~ m2_1_clk;
    always #20 m2_1_clk <= ~m2_1_clk;
    endmodule
//////////общий модуль/////////////
module gen(bus_a bus_a);
    endmodule

 

Спасибо за помощь!

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


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

при попытке синтезировать код описанный выше Quartus выдает следующее сообщение:

Error (10170): Verilog HDL syntax error at interface.sv(27) near text "interface"; expecting "endmodule"

в литературе по SV не нашел примеров с объявлением интерфейса внутри модуля.

пока вижу только один выход:

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

`ifndef def_interface_bus_a
`define def_interface_bus_a
interface bus_a (input logic reset);
      logic clk;
      endinterface 
`endif

-отличающиеся порты подключать отдельно

 

наткнулся здесь на форуме на перевод стандарта по интерфейсам, может кому-нибудь пригодится : IEEE Standard for SystemVerilog—Unified Hardware Design,Specification, and Verification Language(Неофициальный перевод)IEEE SV Interface (неофициальный перевод)

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


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

в литературе по SV не нашел примеров с объявлением интерфейса внутри модуля.

внутри модуля интерфейс объявляется как обычно. В Quartus поддержка SystemVerilog всегда была не очень, сейчас не знаю как обстоят дела

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


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

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

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

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

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

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

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

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

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

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