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

    

Как отключить оптимизацию регистра в Verilog?

Доброго времени суток!

Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно :smile3046:

Вопрос простой, но я на него не смог найти рабочего решения:

Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?

В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).

 

В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:

/* synthesis syn_keep = 1 syn_preserve = 1*/

Но очевидного результата это не дало.

 

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

и не хочется хвастаться таким произведением. :laughing:

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?

В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).

 

В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:

/* synthesis syn_keep = 1 syn_preserve = 1*/

Но очевидного результата это не дало.

 

На самом деле, без кода - это гадание на кофейной гуще...

Во время симуляции в моделсиме в окне запуска есть птичка - "отключить оптимизацию"...

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

У Вас RTL симуляция?

 

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

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:

/* synthesis syn_keep = 1 syn_preserve = 1*/

А не перед?

 

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

 

О какой оптимизации идет речь? Если выходы регистра нигде не используются, то при оптимизации его могут выкинуть...
Очевидно, об оптимизации при синтезе.

У Вас RTL симуляция?
Очевидно, нет.

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


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

Сразу хочу сказать что я новичок во вселенной FPGA да и вообще на форуме. За глупые ошибки не бейте больно :smile3046:

Вопрос простой, но я на него не смог найти рабочего решения:

Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?

В программе я использую сложение define и переменной в регистре а выход такой как будто в условиях только define (хотя значение переменной должно быть присвоено).

 

В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:

/* synthesis syn_keep = 1 syn_preserve = 1*/

Но очевидного результата это не дало.

 

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

и не хочется хвастаться таким произведением. :laughing:

 

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

 

(* noprune *) reg [15:0] data;

 

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


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

Наверное стоило упомянуть что я использую Altera Quartus...

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

Итак отправляю исходный код описания логики а также выход симулятора.

 

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

А также то, как должна была бы выглядеть диаграмма.)

 

 

 

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

(Не хотел делать архив для этого. А все вместе не влезло...)

 

***

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

И извиняйте за код :biggrin:

 

***

post-99347-1508775202_thumb.jpg

__________.txt

switch.txt

post-99347-1508776377_thumb.jpg

Изменено пользователем Lazy_Philosopher

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


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

Всё смешалось, люди, кони...

Waveform - это наглядное представление сигнала.

Реальное время тут вообще никаким боком

RTL - это register-transfer level.

 

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

 

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


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

Спасибо, учту.

Я на форуме и зарегистрировался из-за того что личного, свободного от учебы, времени перестало хватать.

И все же проблема остается прежней: почему-то if странно срабатывает. (Как указано в моем предыдущем посту)

 

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

Изменено пользователем Lazy_Philosopher

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


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

 

Вот во всех местах, таких как здесь:

 

	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

и сигнал разрешения к ним...

 

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


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

Ваш Delay_Reg состоит из 32х битов, а вы пытаетесь в эти отдельные биты присвоить 0 (что нормально) и 1000 (что совершенно не нормально). Результатом всегда будет 0

И оптимизация тут совершенно не при чем

 

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


Ссылка на сообщение
Поделиться на другие сайты
(* noprune *) reg [15:0] data;

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

Однльное спасибо Realking. Совет с "(* noprune *) reg [15:0] data;" помог.

С моей стороны вопрос исчерпан.

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


Ссылка на сообщение
Поделиться на другие сайты
Вот во всех местах, таких как здесь:

 

	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

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


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

1. бинарная запись, с явным указанием размера

2. шестнадцетиричная запись, с явным указанием размера

3. десятичная запись, без указания размера, число по умолчанию имеет размер 32 бита

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


Ссылка на сообщение
Поделиться на другие сайты
А можно вопрос, оффтопом?

 

В чем разница между 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 бит.

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


Ссылка на сообщение
Поделиться на другие сайты
1. бинарная запись, с явным указанием размера

2. шестнадцетиричная запись, с явным указанием размера

3. десятичная запись, без указания размера, число по умолчанию имеет размер 32 бита

 

 

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

 

logic [15:0] test;

 

Сделать два:

test = 0;

 

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

 

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

Изменено пользователем el.d

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


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

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

 

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

Изменено пользователем one_eight_seven

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация