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

Требуется уточнение по применению конструкций языка

Перебираю чужой проект. Подчищаю и "переписываю под себя". Для проверки сравниваю sof файлы "старый" и "новый."

Есть вот такая конструкция

always @ (posedge clk)
 begin
  begin
   if(Adress_Config == (9'd70 + 9'd256)) 
    begin 
    if(ack_config == 1'b1 && Debug == 1'b1) 
     begin
    UV_Z <= Data_Config[13:1];
     end
    end
   end
  end

 

Я убрал лишне

if ((Adress_Config == (9'd70 + 9'd256)) && (ack_config == 1'b1 && Debug == 1'b1)) UV_Z <= Data_Config[13:1];

Сравнение файлов показывает различия.

По школьным знаниям могу предположить, что в первом варианте реализуется "приоритетный шифратор", во втором - "дешифратор". На мой взгляд функционировать должно одинаково, но почему генерится другой файл?

//-----

Ну и чтобы два раза не вставать, встретил два таких оператора вместе

if(RM_Rise == 1'b1)        Dis_Foto <= 1'b1;
if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0;

Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться.

Как работает такая конструкция?

 

 

 

 

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


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

10 минут назад, misyachniy сказал:

Перебираю чужой проект. Подчищаю и "переписываю под себя". Для проверки сравниваю sof файлы "старый" и "новый."

Есть вот такая конструкция


always @ (posedge clk)
 begin
  begin
   if(Adress_Config == (9'd70 + 9'd256)) 
    begin 
    if(ack_config == 1'b1 && Debug == 1'b1) 
     begin
    UV_Z <= Data_Config[13:1];
     end
    end
   end
  end

 

Я убрал лишне


if ((Adress_Config == (9'd70 + 9'd256)) && (ack_config == 1'b1 && Debug == 1'b1)) UV_Z <= Data_Config[13:1];

Сравнение файлов показывает различия.

По школьным знаниям могу предположить, что в первом варианте реализуется "приоритетный шифратор", во втором - "дешифратор". На мой взгляд функционировать должно одинаково, но почему генерится другой файл?

//-----

Ну и чтобы два раза не вставать, встретил два таких оператора вместе


if(RM_Rise == 1'b1)        Dis_Foto <= 1'b1;
if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0;

Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться.

Как работает такая конструкция?

 

 

 

 

Вы простую и понятную конструкцию заменили на непонятную и не читаемую. Зачем ?

Чтобы ответить на Ваш вопрос - достаточно открыть сгенерированный нетлист.

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


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

22 minutes ago, misyachniy said:

Для проверки сравниваю sof файлы "старый" и "новый."

это не сравнение. вам лучше тогда вообще ничего не трогать. 

Quote

По школьным знаниям могу предположить, что в первом варианте реализуется "приоритетный шифратор", во втором - "дешифратор". На мой взгляд функционировать должно одинаково, но почему генерится другой файл?

логический результат одинаков, а для плис может оптимизатор или resource sharing так работает или вместо sload софт использует LUT (для альтеры). 

Quote

 


if(RM_Rise == 1'b1)        Dis_Foto <= 1'b1;
if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0;

Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться.

не одновременно, присваивания в дельта цикле идут сверх вниз, по окончанию дельта цикла присваивается последнее

Quote

Как работает такая конструкция?

if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0;
else if(RM_Rise == 1'b1) Dis_Foto <= 1'b1;

вот так

ЗЫ. Для вашей задачи, вас спасет только тестбенч с полным покрытием и параллельный прогон двух блоков. 

ЗЗЫ. И если уж чистить, тогда убирайте эту вхдлщину(и у вас скобка одна при копипаст потерялась):

if (((Adress_Config == (9'd70 + 9'd256)) & ack_config & Debug) UV_Z <= Data_Config[13:1];

 

 

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


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

2 hours ago, Flip-fl0p said:

Вы простую и понятную конструкцию заменили на непонятную и не читаемую. Зачем ?

Чтобы ответить на Ваш вопрос - достаточно открыть сгенерированный нетлист.

У каждого свой метод чтения. Я такие конструкции сведу в один абзац и все будет читаемо.

9'd70 - адрес переменной переменной, UV_Z  - наименование переменной, все что в средине базовый адрес и сигналы разрешения и так понятны.

Могу скопировать массив строк в программу процессора и сравнить с текстом программы

if (((Adress_Config == (9'd70 + 9'd256)) & ack_config & Debug) UV_Z <= Data_Config[13:1];

По поводу  "достаточно открыть сгенерированный нетлист. " - ничего не могу сказать.

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


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

5 минут назад, misyachniy сказал:

У каждого свой метод чтения. Я такие конструкции сведу в один абзац и все будет читаемо.

9'd70 - адрес переменной переменной, UV_Z  - наименование переменной, все что в средине базовый адрес и сигналы разрешения и так понятны.

Могу скопировать массив строк в программу процессора и сравнить с текстом программы

if (((Adress_Config == (9'd70 + 9'd256)) & ack_config & Debug) UV_Z <= Data_Config[13:1];

По поводу  "достаточно открыть сгенерированный нетлист. " - ничего не могу сказать.

Удобство чтения - очень субьективно. 

Но Magic number - плохая практика. Откуда взялись эти 9'd70 + 9'd256. Что они значат. Зачем они. Я такой подход не одобряю.

А в чем сложности посмотреть сгенерированный нетлист ?

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


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

Интересный метод сравнения результата )

всегда думал, что результаты от компиляции к компиляции разные. На больших проектах

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


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

8 часов назад, misyachniy сказал:

if(RM_Rise == 1'b1)        Dis_Foto <= 1'b1;
if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0;

Понятно что Dis_Foto присваивается 1 и 0 одновременно, но при сборке проекта никаких предупреждений не выводиться.

Как работает такая конструкция?

Обычный RS-триггер с приоритетом так-то.

Ну да, выглядит непривычно, привычно так:

if(RM_Rise == 1'b1) Dis_Foto <= 1'b1;
	else if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0;

Но и так тоже можно.

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


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

59 minutes ago, Jackov said:

Но и так тоже можно.

Или так:

if (RM_Rise)
   Dis_Foto <= 1'b1;
else if (Res_Dis_Foto)
   Dis_Foto <= 1'b0;

И никакой ВХДЛьщины, как @des00 говорит

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


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

37 minutes ago, nice_vladi said:

Или так:


if (RM_Rise)
   Dis_Foto <= 1'b1;
else if (Res_Dis_Foto)
   Dis_Foto <= 1'b0;

И никакой ВХДЛьщины, как @des00 говорит

Значит будет отдельный процесс/always с компараторами где будет сравнение с этими магическими числами...

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


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

2 hours ago, Jackov said:

Обычный RS-триггер с приоритетом так-то.

Ну да, выглядит непривычно, привычно так:


if(RM_Rise == 1'b1) Dis_Foto <= 1'b1;
	else if(Res_Dis_Foto == 1'b1) Dis_Foto <= 1'b0;

Но и так тоже можно.

как раз вот так нельзя. вы инвертировали приоритеты относительно базового примера.

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


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

16 часов назад, des00 сказал:

как раз вот так нельзя. вы инвертировали приоритеты относительно базового примера.

Ах да, верно. Виновен.

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...