реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> одинаковые interface в модулях тестбенча
L47
сообщение Apr 28 2017, 09:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 28-05-14
Пользователь №: 81 793



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

Имеется два 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, но разве это правильное решение?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 28 2017, 14:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 189
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

скорее всего проблема в том что вы путаете экземпляр и описание интерфейса. И пытаетесь на уровне описания делать различные его экземпляры. Ну или я вообще не понял что вы делаетеsm.gif
Go to the top of the page
 
+Quote Post
Fitc
сообщение Apr 28 2017, 19:02
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 21-10-11
Пользователь №: 67 894



Цитата(L47 @ Apr 28 2017, 12:10) *
ошибка в modelsim:

Не надо определять в одной области видимости интерфейсы с одинаковыми именами. Modelsim сначала распознал первый интерфейс bus_a, встретив второй интерфейс с тем же именем, он переопределил интерфейс bus_a. Если в разделе "TOP 1" везде поменять bus_a на bus_b все успешно скомпилится и запустится
Go to the top of the page
 
+Quote Post
L47
сообщение Apr 29 2017, 17:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 28-05-14
Пользователь №: 81 793



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

экземпляр:
Код
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.gif
Но теперь, судя по Вашей реакции создается впечатление, что я как то неверно использую интерфейсы. Подскажите, как Вы используете интерфейсы в этих случаях, т.е. когда надо объединять несколько топ модулей в тестбенче? или одинаковые интерфейсы Вы не применяете?

Цитата(Fitc @ Apr 29 2017, 04:02) *
Не надо определять в одной области видимости интерфейсы с одинаковыми именами. Modelsim сначала распознал первый интерфейс bus_a, встретив второй интерфейс с тем же именем, он переопределил интерфейс bus_a. Если в разделе "TOP 1" везде поменять bus_a на bus_b все успешно скомпилится и запустится

Подскажите пожалуйста, как определять в интерфейсы в разных областях видимости?
Go to the top of the page
 
+Quote Post
Fitc
сообщение Apr 29 2017, 19:09
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 21-10-11
Пользователь №: 67 894



Цитата(L47 @ Apr 29 2017, 20:09) *
экземпляр:
Код
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)

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


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

Цитата(L47 @ Apr 29 2017, 20:09) *
Подскажите пожалуйста, как определять в интерфейсы в разных областях видимости?


Код
////////////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
////////////////////////////////
Go to the top of the page
 
+Quote Post
L47
сообщение Apr 30 2017, 02:47
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 28-05-14
Пользователь №: 81 793



Цитата(Fitc @ Apr 30 2017, 04:09) *

я ошибочно полагал, что интерфейс может быть только за модулями, видимо по причине привычки называть инстанс одноименно модулю(в этом случае компилятор ругается созданный экземпляр)
в пример добавил общий для всех модуль
в итоге:
Код
////////////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


Спасибо за помощь!
Go to the top of the page
 
+Quote Post
L47
сообщение Jun 9 2017, 05:36
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 28-05-14
Пользователь №: 81 793



при попытке синтезировать код описанный выше 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 (неофициальный перевод)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 9 2017, 05:53
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 7 487
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Спасибо мне.
Go to the top of the page
 
+Quote Post
Fitc
сообщение Jun 10 2017, 11:56
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 21-10-11
Пользователь №: 67 894



Цитата(L47 @ Jun 9 2017, 08:36) *
в литературе по SV не нашел примеров с объявлением интерфейса внутри модуля.

внутри модуля интерфейс объявляется как обычно. В Quartus поддержка SystemVerilog всегда была не очень, сейчас не знаю как обстоят дела
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2017 - 09:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016