Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как отключить оптимизацию регистра в Verilog?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Lazy_Philosopher
Доброго времени суток!
Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно smile3046.gif
Вопрос простой, но я на него не смог найти рабочего решения:
Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?
В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).

В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:
/* synthesis syn_keep = 1 syn_preserve = 1*/
Но очевидного результата это не дало.

Весь код программы я добавлю в случае надобности. Потому что я пока использую примитивный автомат состояний,
и не хочется хвастаться таким произведением. laughing.gif

СПАСИБО ЗА ЛЮБОЙ КОММЕНТАРИЙ!
iosifk
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45) *
Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?
В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).

В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:
/* synthesis syn_keep = 1 syn_preserve = 1*/
Но очевидного результата это не дало.


На самом деле, без кода - это гадание на кофейной гуще...
Во время симуляции в моделсиме в окне запуска есть птичка - "отключить оптимизацию"...
Но на самом деле что-то в вопросе не так.О какой оптимизации идет речь? Если выходы регистра нигде не используются, то при оптимизации его могут выкинуть...
У Вас RTL симуляция?

Я могу показать, как я это делаю...

andrew_b
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45) *
В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:
/* synthesis syn_keep = 1 syn_preserve = 1*/
А не перед?

Цитата
Весь код программы я добавлю в случае надобности.
Нет никакой программы. Верилог -- не язык программирования.

Цитата(iosifk @ Oct 22 2017, 22:53) *
О какой оптимизации идет речь? Если выходы регистра нигде не используются, то при оптимизации его могут выкинуть...
Очевидно, об оптимизации при синтезе.
Цитата
У Вас RTL симуляция?
Очевидно, нет.
Realking
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45) *
Доброго времени суток!
Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно smile3046.gif
Вопрос простой, но я на него не смог найти рабочего решения:
Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?
В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).

В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:
/* synthesis syn_keep = 1 syn_preserve = 1*/
Но очевидного результата это не дало.

Весь код программы я добавлю в случае надобности. Потому что я пока использую примитивный автомат состояний,
и не хочется хвастаться таким произведением. laughing.gif

СПАСИБО ЗА ЛЮБОЙ КОММЕНТАРИЙ!


(* noprune *) reg [15:0] data;
Lazy_Philosopher
Наверное стоило упомянуть что я использую Altera Quartus...
В нём для отладки я использовал диаграммы waveform. Полагаю что это считается отладкой в реальном времени, т.е. RTL.
Итак отправляю исходный код описания логики а также выход симулятора.

(Чтобы было не чересчур сложно разбирать эти дебри я обозначил важные места в коде и на диаграммах.
А также то, как должна была бы выглядеть диаграмма.)



Плюс картинка диаграммы программы, в которой я использовал переменную для реализации задержки.
(Не хотел делать архив для этого. А все вместе не влезло...)

***
Предыдущая картинка показывает желаемый результат.
И извиняйте за код biggrin.gif

***
one_eight_seven
Цитата
В нём для отладки я использовал диаграммы waveform. Полагаю что это считается отладкой в реальном времени, т.е. RTL.

Всё смешалось, люди, кони...
Waveform - это наглядное представление сигнала.
Реальное время тут вообще никаким боком
RTL - это register-transfer level.

Хотя бы гугелем пользуйтесь сначала, попробуйте найти информацию сами, а потом уже на форуме других людей озадачивайте.
Lazy_Philosopher
Спасибо, учту.
Я на форуме и зарегистрировался из-за того что личного, свободного от учебы, времени перестало хватать.
И все же проблема остается прежней: почему-то if странно срабатывает. (Как указано в моем предыдущем посту)

А именно имя кода с использованием переменной не смог прочитаться сайтом. И русские буквы заменились на подчерки.
iosifk
Цитата(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
и сигнал разрешения к ним...
XVR
Ваш Delay_Reg состоит из 32х битов, а вы пытаетесь в эти отдельные биты присвоить 0 (что нормально) и 1000 (что совершенно не нормально). Результатом всегда будет 0
И оптимизация тут совершенно не при чем
Lazy_Philosopher
Цитата(Realking @ Oct 23 2017, 07:35) *
(* noprune *) reg [15:0] data;

Спасибо, я заметил ошибку. Я неправильно присваивал значения.
Однльное спасибо Realking. Совет с "(* noprune *) reg [15:0] data;" помог.
С моей стороны вопрос исчерпан.
el.d
Цитата(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; ?
Golikov A.
1. бинарная запись, с явным указанием размера
2. шестнадцетиричная запись, с явным указанием размера
3. десятичная запись, без указания размера, число по умолчанию имеет размер 32 бита
Tausinov
Цитата(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 бит.
el.d
Цитата(Golikov A. @ Nov 15 2017, 14:50) *
1. бинарная запись, с явным указанием размера
2. шестнадцетиричная запись, с явным указанием размера
3. десятичная запись, без указания размера, число по умолчанию имеет размер 32 бита



Однако, если например сделать раз:

logic [15:0] test;

Сделать два:
test = 0;

То например та же Vivado ничего не скажет о том, что 32 битное число обрезается до 16 бит.

Вопрос, собсно, был вызван тем, что я примерно также и думал, но поигрался с этим делом немного в Vivado 2017 и есть честно не заметил никакой разницы по ресурсам или сообщений синтезатора, что имеются какие-то неиспользуемые биты, которые отбрасываются. Да и работало оно как задумывалось что в симуляции, что в железе. И как бы если нет разницы (интересно было бы послушать, если кто-то эту разницу реально ловил), то зачем писать более длинную конструкцию?
one_eight_seven
Цитата
И как бы если нет разницы (интересно было бы послушать, если кто-то эту разницу реально ловил), то зачем писать более длинную конструкцию?

По сути это линтовая ошибка или предупреждение (в зависимости от настроек тула). И на это будут ругаться линтовые тулы и тулы статического анализа кода. В общем-то и в них это чаще warning, чем error. Но, чтобы лишний раз не отвлекаться на ложное срабатывание, лучше писать "более длинно".

И да, если вы работаете в одном туле (например, Vivado), то ваша запись - это ваше личное дело. Но если вы делитесь своим кодом (продавая, отдавая бесплатно, открывая исходный код), то вы не знаете заранее, в каком туле будет происходить работа, и лучше такие моменты искоренять. Но я даже не знаю сегодня тула, который бы сам не смог правильно привести данные. Vivado, Quartus, DC, VCS, ModelSim, Icarus это воспринимают нормально.
RobFPGA
Приветству!

Цитата(one_eight_seven @ Nov 15 2017, 18:13) *
...
лучше такие моменты искоренять. Но я даже не знаю сегодня тула, который бы сам не смог правильно привести данные. Vivado, Quartus, DC, VCS, ModelSim, Icarus это воспринимают нормально.

Quartus ворчит Wrnning ... на такое при синтезе (раздражает twak.gif ), Vivado и ModelSim кушают молча.
Но результат правильный и там и там.

Успехов! Rob.
mse
Цитата(Lazy_Philosopher @ Oct 22 2017, 21:45) *
Доброго времени суток!
Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно smile3046.gif
Вопрос простой, но я на него не смог найти рабочего решения:
Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?
Если надо посмотреть нечто, подлежащее оптимизации, выделяю пару ног у модуля, расписываю сдвиговый регистр с ппараллельной загрузкой. Ко входам параллельной загнузки цепляю нечто, на внешние ноги вывожу выход сдвигового реистра и паралельную загрузку. Тактирую нутряным клоком.
Каг-то так
Код
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, сигналы данных и управления не смотрю и не стимулирую. Они нужны только, чтобы обмануть фиттер. Не для всех сигналов подходит, но большинство отображается.Плюс в том, что нет влияния выходного буфера/пина на временное моделирование.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.