Jump to content

    
Sign in to follow this  
lkg47

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

Recommended Posts

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

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

 

Имеется два 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, но разве это правильное решение?

 

Share this post


Link to post
Share on other sites

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

 

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

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

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

 

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

Share this post


Link to post
Share on other sites
ошибка в modelsim:

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

Share this post


Link to post
Share on other sites
Не очень понятно где вы создали инстанс интерфейса, то есть вы его описали - здорово, а где сам интерфейс то создается, где его экземпляр?

экземпляр:

 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 все успешно скомпилится и запустится

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

Share this post


Link to post
Share on other sites
экземпляр:

 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
////////////////////////////////

Share this post


Link to post
Share on other sites

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

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

в итоге:

////////////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

 

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

Share this post


Link to post
Share on other sites

при попытке синтезировать код описанный выше 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 (неофициальный перевод)

Share this post


Link to post
Share on other sites
в литературе по SV не нашел примеров с объявлением интерфейса внутри модуля.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this