|
Как отключить оптимизацию регистра в Verilog?, Тайны Verilog |
|
|
|
Oct 22 2017, 18:45
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347

|
Доброго времени суток! Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно Вопрос простой, но я на него не смог найти рабочего решения: Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме? В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено). В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной: /* synthesis syn_keep = 1 syn_preserve = 1*/ Но очевидного результата это не дало. Весь код программы я добавлю в случае надобности. Потому что я пока использую примитивный автомат состояний, и не хочется хвастаться таким произведением. СПАСИБО ЗА ЛЮБОЙ КОММЕНТАРИЙ!
|
|
|
|
|
Oct 22 2017, 19:53
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45)  Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме? В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).
В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной: /* synthesis syn_keep = 1 syn_preserve = 1*/ Но очевидного результата это не дало. На самом деле, без кода - это гадание на кофейной гуще... Во время симуляции в моделсиме в окне запуска есть птичка - "отключить оптимизацию"... Но на самом деле что-то в вопросе не так.О какой оптимизации идет речь? Если выходы регистра нигде не используются, то при оптимизации его могут выкинуть... У Вас RTL симуляция? Я могу показать, как я это делаю...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Oct 23 2017, 05:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45)  В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной: /* synthesis syn_keep = 1 syn_preserve = 1*/ А не перед? Цитата Весь код программы я добавлю в случае надобности. Нет никакой программы. Верилог -- не язык программирования. Цитата(iosifk @ Oct 22 2017, 22:53)  О какой оптимизации идет речь? Если выходы регистра нигде не используются, то при оптимизации его могут выкинуть... Очевидно, об оптимизации при синтезе. Цитата У Вас RTL симуляция? Очевидно, нет.
|
|
|
|
|
Oct 23 2017, 05:35
|
Местный
  
Группа: Свой
Сообщений: 498
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771

|
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45)  Доброго времени суток! Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно Вопрос простой, но я на него не смог найти рабочего решения: Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме? В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено). В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной: /* synthesis syn_keep = 1 syn_preserve = 1*/ Но очевидного результата это не дало. Весь код программы я добавлю в случае надобности. Потому что я пока использую примитивный автомат состояний, и не хочется хвастаться таким произведением. СПАСИБО ЗА ЛЮБОЙ КОММЕНТАРИЙ! (* noprune *) reg [15:0] data;
--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
|
|
|
|
|
Oct 23 2017, 16:33
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347

|
Наверное стоило упомянуть что я использую Altera Quartus... В нём для отладки я использовал диаграммы waveform. Полагаю что это считается отладкой в реальном времени, т.е. RTL. Итак отправляю исходный код описания логики а также выход симулятора. (Чтобы было не чересчур сложно разбирать эти дебри я обозначил важные места в коде и на диаграммах. А также то, как должна была бы выглядеть диаграмма.) Плюс картинка диаграммы программы, в которой я использовал переменную для реализации задержки. (Не хотел делать архив для этого. А все вместе не влезло...) *** Предыдущая картинка показывает желаемый результат. И извиняйте за код  ***
Сообщение отредактировал Lazy_Philosopher - Oct 23 2017, 16:31
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 23 2017, 16:52
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата В нём для отладки я использовал диаграммы waveform. Полагаю что это считается отладкой в реальном времени, т.е. RTL. Всё смешалось, люди, кони... Waveform - это наглядное представление сигнала. Реальное время тут вообще никаким боком RTL - это register-transfer level. Хотя бы гугелем пользуйтесь сначала, попробуйте найти информацию сами, а потом уже на форуме других людей озадачивайте.
|
|
|
|
|
Oct 23 2017, 17:05
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347

|
Спасибо, учту. Я на форуме и зарегистрировался из-за того что личного, свободного от учебы, времени перестало хватать. И все же проблема остается прежней: почему-то if странно срабатывает. (Как указано в моем предыдущем посту)
А именно имя кода с использованием переменной не смог прочитаться сайтом. И русские буквы заменились на подчерки.
Сообщение отредактировал Lazy_Philosopher - Oct 23 2017, 17:08
|
|
|
|
|
Oct 23 2017, 18:40
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Lazy_Philosopher @ Oct 23 2017, 20:05)  И все же проблема остается прежней: почему-то if странно срабатывает. (Как указано в моем предыдущем посту) Вот во всех местах, таких как здесь: CODE if ( SPI_State_Reg == `SPI_PHASE_STOP) begin TFT_CD = 0; SPI_CS = 1; SPI_MOSI = 0; SPI_CLK = 0; SPI_Data_Reg = 8'b00000000; Выучить "блокирующие" и "неблокирующие"... Желательно убрать все вот такие: always @(posedge CLK_2MHz_Reg) и оставить только вот такие - always @(posedge i_Main_CLK) begin и сигнал разрешения к ним...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Oct 24 2017, 13:31
|
Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347

|
Цитата(Realking @ Oct 23 2017, 07:35)  (* noprune *) reg [15:0] data; Спасибо, я заметил ошибку. Я неправильно присваивал значения. Однльное спасибо Realking. Совет с "(* noprune *) reg [15:0] data;" помог. С моей стороны вопрос исчерпан.
|
|
|
|
|
Nov 15 2017, 14:23
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 2-08-17
Пользователь №: 98 600

|
Цитата(iosifk @ Oct 23 2017, 18:40)  Вот во всех местах, таких как здесь: CODE if ( SPI_State_Reg == `SPI_PHASE_STOP) begin TFT_CD = 0; SPI_CS = 1; SPI_MOSI = 0; SPI_CLK = 0; SPI_Data_Reg = 8'b00000000; Выучить "блокирующие" и "неблокирующие"... Желательно убрать все вот такие: always @(posedge CLK_2MHz_Reg) и оставить только вот такие - always @(posedge i_Main_CLK) begin и сигнал разрешения к ним... А можно вопрос, оффтопом? В чем разница между SPI_Data_Reg = 8'b00000000; SPI_Data_Reg = 8'h00; и SPI_Data_Reg = 0; ?
Сообщение отредактировал el.d - Nov 15 2017, 14:23
|
|
|
|
|
Nov 15 2017, 14:53
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(el.d @ Nov 15 2017, 17:23)  А можно вопрос, оффтопом?
В чем разница между SPI_Data_Reg = 8'b00000000; SPI_Data_Reg = 8'h00; и SPI_Data_Reg = 0; ? Возможно, есть неточности по терминологии, но суть такая. 8'b00000000 и 8'h00 - одно и тоже, только в первом случае используется двоичный литерал, а во втором - хексовый. SPI_Data_Reg = 0 - а в этом случае 0 это целочисленный литерал (int или integer), который занимает 32 бита. Т.о. в этом случае компилятор приводит типы, забирая младшие 8 бит.
|
|
|
|
|
Nov 15 2017, 15:05
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 2-08-17
Пользователь №: 98 600

|
Цитата(Golikov A. @ Nov 15 2017, 14:50)  1. бинарная запись, с явным указанием размера 2. шестнадцетиричная запись, с явным указанием размера 3. десятичная запись, без указания размера, число по умолчанию имеет размер 32 бита Однако, если например сделать раз: logic [15:0] test; Сделать два: test = 0; То например та же Vivado ничего не скажет о том, что 32 битное число обрезается до 16 бит. Вопрос, собсно, был вызван тем, что я примерно также и думал, но поигрался с этим делом немного в Vivado 2017 и есть честно не заметил никакой разницы по ресурсам или сообщений синтезатора, что имеются какие-то неиспользуемые биты, которые отбрасываются. Да и работало оно как задумывалось что в симуляции, что в железе. И как бы если нет разницы (интересно было бы послушать, если кто-то эту разницу реально ловил), то зачем писать более длинную конструкцию?
Сообщение отредактировал el.d - Nov 15 2017, 14:55
|
|
|
|
|
Nov 15 2017, 15:13
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата И как бы если нет разницы (интересно было бы послушать, если кто-то эту разницу реально ловил), то зачем писать более длинную конструкцию? По сути это линтовая ошибка или предупреждение (в зависимости от настроек тула). И на это будут ругаться линтовые тулы и тулы статического анализа кода. В общем-то и в них это чаще warning, чем error. Но, чтобы лишний раз не отвлекаться на ложное срабатывание, лучше писать "более длинно". И да, если вы работаете в одном туле (например, Vivado), то ваша запись - это ваше личное дело. Но если вы делитесь своим кодом (продавая, отдавая бесплатно, открывая исходный код), то вы не знаете заранее, в каком туле будет происходить работа, и лучше такие моменты искоренять. Но я даже не знаю сегодня тула, который бы сам не смог правильно привести данные. Vivado, Quartus, DC, VCS, ModelSim, Icarus это воспринимают нормально.
Сообщение отредактировал one_eight_seven - Nov 15 2017, 15:17
|
|
|
|
|
Nov 15 2017, 16:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветству! Цитата(one_eight_seven @ Nov 15 2017, 18:13)  ... лучше такие моменты искоренять. Но я даже не знаю сегодня тула, который бы сам не смог правильно привести данные. Vivado, Quartus, DC, VCS, ModelSim, Icarus это воспринимают нормально. Quartus ворчит Wrnning ... на такое при синтезе (раздражает  ), Vivado и ModelSim кушают молча. Но результат правильный и там и там. Успехов! Rob.
|
|
|
|
|
Dec 7 2017, 20:06
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45)  Доброго времени суток! Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно Вопрос простой, но я на него не смог найти рабочего решения: Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме? Если надо посмотреть нечто, подлежащее оптимизации, выделяю пару ног у модуля, расписываю сдвиговый регистр с ппараллельной загрузкой. Ко входам параллельной загнузки цепляю нечто, на внешние ноги вывожу выход сдвигового реистра и паралельную загрузку. Тактирую нутряным клоком. Каг-то так Код input parload; output serout; ... reg[N:0] serpar; always @(posedge xclk or posedge parload) if(parload==1) serpar<=interesting_data; else serpar<={serpar[N-1:0],0}; Ессно, орфографию привести к норме. Ессно-2, сигналы данных и управления не смотрю и не стимулирую. Они нужны только, чтобы обмануть фиттер. Не для всех сигналов подходит, но большинство отображается.Плюс в том, что нет влияния выходного буфера/пина на временное моделирование.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|