Jump to content

    

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

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

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

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

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

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

 

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

/* synthesis syn_keep = 1 syn_preserve = 1*/

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
Как отключить оптимизацию одного конкретного регистра так, чтобы его содержимое отображалось на диаграмме?

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

 

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

/* synthesis syn_keep = 1 syn_preserve = 1*/

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

 

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

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

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

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

 

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

 

 

Share this post


Link to post
Share on other sites
В поисках решения я нашел совет ставить следующий комментарий за именем объявленной переменной:

/* synthesis syn_keep = 1 syn_preserve = 1*/

А не перед?

 

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

 

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

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

Share this post


Link to post
Share on other sites
Доброго времени суток!

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

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

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

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

 

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

/* synthesis syn_keep = 1 syn_preserve = 1*/

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

 

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

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

 

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

 

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

 

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

 

 

 

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

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

 

***

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

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

 

***

post-99347-1508775202_thumb.jpg

__________.txt

switch.txt

post-99347-1508776377_thumb.jpg

Edited by Lazy_Philosopher

Share this post


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

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

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

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

RTL - это register-transfer level.

 

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

 

Share this post


Link to post
Share on other sites

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

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

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

 

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

Edited by Lazy_Philosopher

Share this post


Link to post
Share on other sites
И все же проблема остается прежней: почему-то 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

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

 

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites
(* noprune *) reg [15:0] data;

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

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

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

Share this post


Link to post
Share on other sites
Вот во всех местах, таких как здесь:

 

	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; ?

Edited by el.d

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
А можно вопрос, оффтопом?

 

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

Share this post


Link to post
Share on other sites
1. бинарная запись, с явным указанием размера

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

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

 

 

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

 

logic [15:0] test;

 

Сделать два:

test = 0;

 

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

 

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

Edited by el.d

Share this post


Link to post
Share on other sites
И как бы если нет разницы (интересно было бы послушать, если кто-то эту разницу реально ловил), то зачем писать более длинную конструкцию?

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

 

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

Edited by one_eight_seven

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this