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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как отключить оптимизацию регистра в Verilog?, Тайны Verilog
Lazy_Philosopher
сообщение Oct 22 2017, 18:45
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347



Доброго времени суток!
Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно smile3046.gif
Вопрос простой, но я на него не смог найти рабочего решения:
Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?
В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).

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

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

СПАСИБО ЗА ЛЮБОЙ КОММЕНТАРИЙ!
Go to the top of the page
 
+Quote Post
iosifk
сообщение Oct 22 2017, 19:53
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 23 2017, 05:23
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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 симуляция?
Очевидно, нет.
Go to the top of the page
 
+Quote Post
Realking
сообщение Oct 23 2017, 05:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 498
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771



Цитата(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;


--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
Go to the top of the page
 
+Quote Post
Lazy_Philosopher
сообщение Oct 23 2017, 16:33
Сообщение #5





Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347



Наверное стоило упомянуть что я использую Altera Quartus...
В нём для отладки я использовал диаграммы waveform. Полагаю что это считается отладкой в реальном времени, т.е. RTL.
Итак отправляю исходный код описания логики а также выход симулятора.

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



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

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

***

Сообщение отредактировал Lazy_Philosopher - Oct 23 2017, 16:31
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  __________.txt ( 8.98 килобайт ) Кол-во скачиваний: 19
Прикрепленный файл  switch.txt ( 10.91 килобайт ) Кол-во скачиваний: 19
 
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Oct 23 2017, 16:52
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



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

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

Хотя бы гугелем пользуйтесь сначала, попробуйте найти информацию сами, а потом уже на форуме других людей озадачивайте.
Go to the top of the page
 
+Quote Post
Lazy_Philosopher
сообщение Oct 23 2017, 17:05
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347



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

А именно имя кода с использованием переменной не смог прочитаться сайтом. И русские буквы заменились на подчерки.

Сообщение отредактировал Lazy_Philosopher - Oct 23 2017, 17:08
Go to the top of the page
 
+Quote Post
iosifk
сообщение Oct 23 2017, 18:40
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 23 2017, 21:36
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Ваш Delay_Reg состоит из 32х битов, а вы пытаетесь в эти отдельные биты присвоить 0 (что нормально) и 1000 (что совершенно не нормально). Результатом всегда будет 0
И оптимизация тут совершенно не при чем
Go to the top of the page
 
+Quote Post
Lazy_Philosopher
сообщение Oct 24 2017, 13:31
Сообщение #10





Группа: Новичок
Сообщений: 4
Регистрация: 17-09-17
Из: Чехия
Пользователь №: 99 347



Цитата(Realking @ Oct 23 2017, 07:35) *
(* noprune *) reg [15:0] data;

Спасибо, я заметил ошибку. Я неправильно присваивал значения.
Однльное спасибо Realking. Совет с "(* noprune *) reg [15:0] data;" помог.
С моей стороны вопрос исчерпан.
Go to the top of the page
 
+Quote Post
el.d
сообщение Nov 15 2017, 14:23
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 15 2017, 14:50
Сообщение #12


Гуру
******

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



1. бинарная запись, с явным указанием размера
2. шестнадцетиричная запись, с явным указанием размера
3. десятичная запись, без указания размера, число по умолчанию имеет размер 32 бита
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Nov 15 2017, 14:53
Сообщение #13


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

Группа: Участник
Сообщений: 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 бит.
Go to the top of the page
 
+Quote Post
el.d
сообщение Nov 15 2017, 15:05
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Nov 15 2017, 15:13
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата
И как бы если нет разницы (интересно было бы послушать, если кто-то эту разницу реально ловил), то зачем писать более длинную конструкцию?

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

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

Сообщение отредактировал one_eight_seven - Nov 15 2017, 15:17
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Nov 15 2017, 16:25
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветству!

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

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

Успехов! Rob.
Go to the top of the page
 
+Quote Post
mse
сообщение Dec 7 2017, 20:06
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(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, сигналы данных и управления не смотрю и не стимулирую. Они нужны только, чтобы обмануть фиттер. Не для всех сигналов подходит, но большинство отображается.Плюс в том, что нет влияния выходного буфера/пина на временное моделирование.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 09:02
Рейтинг@Mail.ru


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