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

Всем привет

 

Есть модуль, который выполняет какой то функционал. В каких-то проектах он имеет доп выходы, в каких-то нет. Не хочется делать 2 модуля, чтобы если произойдут правки, поправилось сразу во всех проектах.

 

большую часть сигналов и настроек сделал через parameter, и модуль меняется. А сейчас появилось желание избавиться от части функционала, прям от нескольких входов - выходов, и блока их обработки. Оставить выход в воздухе - варнинг что выход не подключен, плюс часть функционала не оптимизируется и есть ресурсы.

 

Так вот как по уму делают такое в verilog? Я по старой доброй програмерской традиции использовал `ifdef, `else, `endif

и буду дописывать `define (кстати у verilog есть область видимости `define, он может быть во внешнем модуле?).

 

Но вот теперь вспоминая что обычно в ПЛИС все надо делать ни как очевидно, и особенно ни как делают програмеры, решил поинтересоваться, а есть ли другой, более правильный вариант? Какие преимущества - недостатки? Или я все сделал правильно и я молодец:) ?

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


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

Теоретически, можно в рамках SV применить передачу типа в качестве параметра, объявить порт этим типом, ну а типы - разные структуры, содержащие или не содержащие в себе нужный порт. Это в качестве бредовой идеи. Понятия не имею, реализуемо ли это реально :)

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


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

главное что так слабоуправляемо, что лучше иметь 2 модуля и руками изменения переносить...

 

с дефайном я тоже чет наелся... ISE говорит в модуле ошибка, но какая не говорит:)...

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


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

c `define нет никаких проблем вообще то:

 

// `define TEST_PORT

module mymodule (

  clk,

.....
.....
.....

  dma_param_we,
  dma_param_be
  
`ifdef TEST_PORT
  , test_mode
  , test
`endif
  
);

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


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

думаю зависит от!

 

к примеру ISE 14.4

 

module
(
   clk,

`ifdef USE_PORT
   port1,
   port2,
`endif

   signal
);



  input  clk;

`ifdef USE_PORT
   output port1;
   input port2;
`endif

  output signal;

endmodule

 

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

а когда жмешь проверку синтаксиса модуля, пишется что ошибка запуска команды проверки. То есть ISE прям реально свело не по детски.

 

при это если раздефайнить только одну запись, (вверху оставить)

 

//`ifdef USE_PORT
   output port1;
   input port2;
//`endif

 

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

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


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

Да, какой-то конкретный глюк среды... Я такую систему давно использую для тест-портов и тест-конфигураций, только не в ISE, правда.

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


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

Так вот как по уму делают такое в verilog? Я по старой доброй програмерской традиции использовал `ifdef, `else, `endif

Если я правильно понял, то надо использовать ключевые слова generate, endgenerate.

Вроде как, код между ними может генерироваться, а может и не генерироваться, в зависимости от каких-то условий.

Но я сам так ни разу не делал, точно не знаю.

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


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

Если я правильно понял, то надо использовать ключевые слова generate, endgenerate.

 

Это только в теле модуля. А в шапке, где список портов, нельзя.

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


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

Можно ещё попробовать все доп. входы/выходы пристыковать к какому-нибудь постоянному входу/выходу, т.е. объединить их в одну шину, а размер шины менять через parameter.

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


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

это еще хуже, кроме размера шины становится еще список портов, их последовательность...

 

 

ISE и дефайны не дружат, среду свело так, что она строчки из проекта повыкидывала.

то ли сам дефайн длинный как имя, то ли еще что, но глючит...

эх а счастье было так близко

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


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

это еще хуже, кроме размера шины становится еще список портов, их последовательность...

 

 

ISE и дефайны не дружат, среду свело так, что она строчки из проекта повыкидывала.

то ли сам дефайн длинный как имя, то ли еще что, но глючит...

эх а счастье было так близко

подключите к ise симплифай.

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


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

 

подключите к ise симплифай.

 

Там не синтезу голову снесло, а самой среде...

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


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

Всем привет

 

Есть модуль, который выполняет какой то функционал. В каких-то проектах он имеет доп выходы, в каких-то нет. Не хочется делать 2 модуля, чтобы если произойдут правки, поправилось сразу во всех проектах.

 

большую часть сигналов и настроек сделал через parameter, и модуль меняется. А сейчас появилось желание избавиться от части функционала, прям от нескольких входов - выходов, и блока их обработки. Оставить выход в воздухе - варнинг что выход не подключен, плюс часть функционала не оптимизируется и есть ресурсы.

 

Так вот как по уму делают такое в verilog? Я по старой доброй програмерской традиции использовал `ifdef, `else, `endif

и буду дописывать `define (кстати у verilog есть область видимости `define, он может быть во внешнем модуле?).

 

Но вот теперь вспоминая что обычно в ПЛИС все надо делать ни как очевидно, и особенно ни как делают програмеры, решил поинтересоваться, а есть ли другой, более правильный вариант? Какие преимущества - недостатки? Или я все сделал правильно и я молодец:) ?

препроцессор тут самое оно и если в исе с этим всё плохо я бы использовал генерате для удаления не нужного функционала

module test
#(parameter
    TEST_ON0=1,
    TEST_ON1=0
)
(
    input clk, reset,
    input test_on0,
    input test_on1,
    input valid_in,
    input[31:0]data_in,
    output reg[31:0]data_out,
    output reg data_val,
    output reg[31:0]test_out
);

    always@(posedge clk or posedge reset)
    if(reset)
    begin
       data_out<=0;
       data_val<=0;
    end
    else
    begin
        data_out<=(valid_in)?data_in:data_out;
        data_val<=valid_in;
    end
    
    generate
    if(TEST_ON0==1)begin:TEST_ON0_GEN
        reg[31:0] testt;
        always@(posedge clk or posedge reset)
        if(reset)
        begin
           testt<=0;
           test_out<=0;
        end
        else
        begin
            testt<=(valid_in)?testt+1:testt;
            test_out<=(valid_in)?testt:test_out;
        end
    end
    endgenerate
    
    generate
    if(TEST_ON1==1)begin:TEST_ON1_GEN
        reg[63:0] testt;
        always@(posedge clk or posedge reset)
        if(reset)
        begin
           testt<=64'd0;
           test_out<=0;
        end
        else
        begin
            testt<=(valid_in && data_in==2)?testt+1:testt;
            test_out<=(valid_in)?testt[63:32]:test_out;
        end
    end
    endgenerate    

    generate
    if(TEST_ON1==TEST_ON1)begin:NOTEST_GEN
        always@(*)
            test_out=0;
    end
    endgenerate

endmodule

 

по другому никак.

итого варианты

1)ifdef

2)generate

3)пробовать синтезировать в симплифай в исе импортировать edif. Тут может быть подстава,

симплифай выкинет неиспользованые входа выхода и в инстансе уже при синтезе xst будет ругань. нужно будет ешё и аттрибуты прописать keep...

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


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

        always@(*)
            test_out<=0;

3)пробовать синтезировать в симплифай в исе импортировать edif. Тут может быть подстава,

симплифай выкинет неиспользованые входа выхода и в инстансе уже при синтезе xst будет ругань. нужно будет ешё и аттрибуты прописать keep...

Этот безусловный always может кому-нибудь не понравится, раз всё равно есть reset, можно писать always @(posedge reset)test_out<=0; Интересно, можно ли здесь использовать initial, его вроде некоторые синтезаторы не понимают?

Синплифай никогда не выкидывает топовые порты при синтезе в edif. В отличие от латтисовского мэпа:).

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


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

Этот безусловный always может кому-нибудь не понравится, раз всё равно есть reset, можно писать always @(posedge reset)test_out<=0; Интересно, можно ли здесь использовать initial, его вроде некоторые синтезаторы не понимают?

Синплифай никогда не выкидывает топовые порты при синтезе в edif. В отличие от латтисовского мэпа:).

Этот безусловный always должен всем понравится потому что нужен для того чтобы назначить reg значение ибо assign test_out=0 для reg не верно

ну а смысл того always в том что я хочу выкинуть выход test_out и всю логику подключенную к нему независимо от сброса

и смысла в сбросе не вижу для это выхода.

 

и да ваша правда симплифай не выкидывает в топе

НО переделывает(переписывает) массив входов/выходов в "плоский" и вот тут как раз и подстава( это верно для systemverilog и vhdl, в верилоге (2001)нельзя иметь массив входов/выходов)

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


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

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

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

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

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

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

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

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

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

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