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

Разница в при синтезе и при симуляции

Всем привет. Работаю с VHDL довольно давно, но тут, от нечего делать, решил поиграться с Verilog

и вод что получилось:

always @(posedge Clk)
    begin
      cnt=cnt+1; // cnt<=cnt+1;
    end
    
    always @(posedge Clk)
    begin
      del<=cnt;
    end

 

Здесь cnt - счетчик, del - он же, но задержанный на такт.

Quartus синтезирует всё, как и было задумано, не зависимо от того, какое присваивание происходит в третьей строке.

А вот при симуляции в ModelSim при блокируемом присваивании, задержка не происходит. Как если бы оба присваивания находились в одном always.

Почему Quartus и ModelSim ведут себя по разному и как избежать подобных расхождений в дальнейшем?

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


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

Интересная штука, проделал то же в Vivado - разницы нет. Похоже, вот обсуждение Вашего вопроса.

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


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

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

В этом плане он лучше других симуляторов, но в нем нет поддержки многих синтезируемых конструкции SV. :crying:

 

 

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


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

Для успешного ситнтеза с Verilog нужно принять некоторый свод не всегда логичных соглашений. Одно из них:

комбинаторный процесс - только блокирующее присваивание

тактируемый процесс - только неблокирующее присваивание

 

reg [cnt_wid-1:0] cnt, cnt_r, del_r;

always @( * )
begin
  cnt=cnt_r+1; 
end

always @(posedge Clk)
begin
  cnt_r<=cnt;
  del_r<=cnt_r;
end

 

Попытки найти этой необходимости логичное объяснение наталкиваются на гипотетический диалог c разработчиками стандарта (Cadence):

- Why?

- Because f*ck you that's why!

 

решил поиграться..

и вот что получилось..

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


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

комбинаторный процесс - только блокирующее присваивание

тактируемый процесс - только неблокирующее присваивание

 

Две переменных на один счетчик? Жуть.

Комбинаторные процессы вообще считаю чем-то искусственным.

Хотя...

нашёл в этом рациональное зерно и сформулировал для себя следующие правила, которые буду тестировать на практике:

1) не использовать блокирующее присвоение, если это возможно.

2) Если к переменной применяется блокирующее присваивание, то значение этой переменной

передаётся во вне процесса через другую переменную с неблокирующим присваиванием.(так в VHDL

variable не видны вне процесса и выполнение этого пункта происходит автоматически)

 

Тогда код будет выглядеть так(предполагается, что соблюдение первого пункта правил невозможно):

always @( posedge Clk)
begin
cnt=cnt_r+1;
cnt_r<=cnt;
end

always @(posedge Clk)
begin
  del<=cnt_r;
end

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


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

Дело же не в счетчике, дело в принципе. Есть общепринятый способ описания машины состояний: т.н. "2-process FSM".

 

// Описываем функционал FSM
always @( * ) begin
  state_new = F( fsm_inputs, state );
end

always @( posedge clk ) begin
  state <= state_new;
end

// Формируем выходные сигналы
always @( * ) begin
  output_fsm_moore = G( state );
  output_fsm_mealy = H( state_new, state );
end

 

Такое описание обладает хорошей видимостью: его легко контролировать и вносить в него изменения при необходимости. Этот способ одинаково пригоден как при Verilog-, так и при VHDL-описании. Счетчик можно рассматривать, как частный случай FSM.

 

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

 

Две переменных на один счетчик?

Комбинаторные процессы вообще считаю чем-то искусственным.

 

нашёл в этом рациональное зерно и сформулировал для себя следующие правила, которые буду тестировать на практике:

1) не использовать блокирующее присвоение, если это возможно.

2) Если к переменной применяется блокирующее присваивание, то значение этой переменной

передаётся во вне процесса через другую переменную с неблокирующим присваиванием.(так в VHDL

variable не видны вне процесса и выполнение этого пункта происходит автоматически)

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


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

Есть общепринятый способ описания машины состояний: т.н. "2-process FSM".

 

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

Результат результатом, но велосипед изобретать тоже не хочется.

Буду делать соответствующие выводы.

Всем спасибо.

 

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


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

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

:bb-offtopic: Приделать к Си 2 новых типа, "bit" и "reg", и можно писать дизайн на Си. Без разных типов присваиваний, "always", и прочих надуманных штучек.

 

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


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

какова конечная цель?

- писать однозначно синтезируемый RTL ?

или

- искать проблемы на свою пятую точку?

 

ваши "эксперименты" могут вести к любому из этих двух результатов. Вопрос лишь в том, к какой из вышеназванных целей вы хотите прийти.

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


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

какова конечная цель?

Если ко мне вопрос, то - "писать однозначно синтезируемый RTL". Цель вполне достигнута, уже больше года пишу на "Си". На основе опыта и утверждаю, что "можно писать дизайн ... Без разных типов присваиваний, "always", и прочих надуманных штучек."

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

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


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

Если ко мне вопрос, то - "писать однозначно синтезируемый RTL". Цель вполне достигнута, уже больше года пишу на "Си". На основе опыта и утверждаю, что "можно писать дизайн ... Без разных типов присваиваний, "always", и прочих надуманных штучек."

Сжечь еретика. :maniac:

 

А если серьезно, то можете привести пример на каких частотах, в каких кристаллах и какой функционал Ваших проектов.

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


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

можете привести пример на каких частотах, в каких кристаллах и какой функционал Ваших проектов.

http://marsohod.org/forum/razdel-predlozhe...intez-proshivki

http://marsohod.org/forum/proekty-polzovat...ilog-bez-always

Еще стробирующий осциллограф с 1Гвыб/сек, см заглохшую ветку "народный осциллограф" на этом форуме.

На Верилоге только Альтеровские примитивы типа PLL, BRAM, DDR.

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


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

Поясните, пожалуйста, в чем будет выигрыш от такого решения?

 

Приделать к Си 2 новых типа, "bit" и "reg", и можно писать дизайн на Си. Без разных типов присваиваний, "always", и прочих надуманных штучек.

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


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

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

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

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

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

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

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

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

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

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