Golikov 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба Всем привет Есть модуль, который выполняет какой то функционал. В каких-то проектах он имеет доп выходы, в каких-то нет. Не хочется делать 2 модуля, чтобы если произойдут правки, поправилось сразу во всех проектах. большую часть сигналов и настроек сделал через parameter, и модуль меняется. А сейчас появилось желание избавиться от части функционала, прям от нескольких входов - выходов, и блока их обработки. Оставить выход в воздухе - варнинг что выход не подключен, плюс часть функционала не оптимизируется и есть ресурсы. Так вот как по уму делают такое в verilog? Я по старой доброй програмерской традиции использовал `ifdef, `else, `endif и буду дописывать `define (кстати у verilog есть область видимости `define, он может быть во внешнем модуле?). Но вот теперь вспоминая что обычно в ПЛИС все надо делать ни как очевидно, и особенно ни как делают програмеры, решил поинтересоваться, а есть ли другой, более правильный вариант? Какие преимущества - недостатки? Или я все сделал правильно и я молодец:) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба Теоретически, можно в рамках SV применить передачу типа в качестве параметра, объявить порт этим типом, ну а типы - разные структуры, содержащие или не содержащие в себе нужный порт. Это в качестве бредовой идеи. Понятия не имею, реализуемо ли это реально :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба главное что так слабоуправляемо, что лучше иметь 2 модуля и руками изменения переносить... с дефайном я тоже чет наелся... ISE говорит в модуле ошибка, но какая не говорит:)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба c `define нет никаких проблем вообще то: // `define TEST_PORT module mymodule ( clk, ..... ..... ..... dma_param_we, dma_param_be `ifdef TEST_PORT , test_mode , test `endif ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба думаю зависит от! к примеру 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. Вот теперь думаю не в этом ли проблема... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба Да, какой-то конкретный глюк среды... Я такую систему давно использую для тест-портов и тест-конфигураций, только не в ISE, правда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба Так вот как по уму делают такое в verilog? Я по старой доброй програмерской традиции использовал `ifdef, `else, `endif Если я правильно понял, то надо использовать ключевые слова generate, endgenerate. Вроде как, код между ними может генерироваться, а может и не генерироваться, в зависимости от каких-то условий. Но я сам так ни разу не делал, точно не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба Если я правильно понял, то надо использовать ключевые слова generate, endgenerate. Это только в теле модуля. А в шапке, где список портов, нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба Можно ещё попробовать все доп. входы/выходы пристыковать к какому-нибудь постоянному входу/выходу, т.е. объединить их в одну шину, а размер шины менять через parameter. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба это еще хуже, кроме размера шины становится еще список портов, их последовательность... ISE и дефайны не дружат, среду свело так, что она строчки из проекта повыкидывала. то ли сам дефайн длинный как имя, то ли еще что, но глючит... эх а счастье было так близко Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба это еще хуже, кроме размера шины становится еще список портов, их последовательность... ISE и дефайны не дружат, среду свело так, что она строчки из проекта повыкидывала. то ли сам дефайн длинный как имя, то ли еще что, но глючит... эх а счастье было так близко подключите к ise симплифай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 февраля, 2014 Опубликовано 17 февраля, 2014 · Жалоба подключите к ise симплифай. Там не синтезу голову снесло, а самой среде... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 18 февраля, 2014 Опубликовано 18 февраля, 2014 · Жалоба Всем привет Есть модуль, который выполняет какой то функционал. В каких-то проектах он имеет доп выходы, в каких-то нет. Не хочется делать 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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 18 февраля, 2014 Опубликовано 18 февраля, 2014 · Жалоба always@(*) test_out<=0; 3)пробовать синтезировать в симплифай в исе импортировать edif. Тут может быть подстава, симплифай выкинет неиспользованые входа выхода и в инстансе уже при синтезе xst будет ругань. нужно будет ешё и аттрибуты прописать keep... Этот безусловный always может кому-нибудь не понравится, раз всё равно есть reset, можно писать always @(posedge reset)test_out<=0; Интересно, можно ли здесь использовать initial, его вроде некоторые синтезаторы не понимают? Синплифай никогда не выкидывает топовые порты при синтезе в edif. В отличие от латтисовского мэпа:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 18 февраля, 2014 Опубликовано 18 февраля, 2014 · Жалоба Этот безусловный always может кому-нибудь не понравится, раз всё равно есть reset, можно писать always @(posedge reset)test_out<=0; Интересно, можно ли здесь использовать initial, его вроде некоторые синтезаторы не понимают? Синплифай никогда не выкидывает топовые порты при синтезе в edif. В отличие от латтисовского мэпа:). Этот безусловный always должен всем понравится потому что нужен для того чтобы назначить reg значение ибо assign test_out=0 для reg не верно ну а смысл того always в том что я хочу выкинуть выход test_out и всю логику подключенную к нему независимо от сброса и смысла в сбросе не вижу для это выхода. и да ваша правда симплифай не выкидывает в топе НО переделывает(переписывает) массив входов/выходов в "плоский" и вот тут как раз и подстава( это верно для systemverilog и vhdl, в верилоге (2001)нельзя иметь массив входов/выходов) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться