Jump to content

    
Sign in to follow this  
alman

В чем могут быть причины разной работы схемы

Recommended Posts

Уважаемые коллеги, помогите разобраться в причинах разного поведения при симуляции в Icarus Verilog и при работе в ПЛИС.

 

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

Всё меняется при переносе проекта в ПЛИС - в какой-то момент сигналы на одной из выходных шин "портятся".

 

Выходной порт объявлен как регистр. Возможно стОит обратить внимание, не пишут ли в него друге модули?

 

Проостите, если вопрос глупый, но ответа в FAQ и на первых 5 страницах я не нашел.

 

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

 

Спасибо.

 

p.s. Использую Quartus II v12.1 Говорят, в тринадцатом Квартусе есть встроенный симулятор?

Edited by alman

Share this post


Link to post
Share on other sites

Вопрос зачетный :) Ответ простой, смотрите timing constraints и clock domains.

Edited by zambezi

Share this post


Link to post
Share on other sites

1. в квартусе стимулятор всегда был.

2. выложите части кода которые на выходе

Share this post


Link to post
Share on other sites
Выходной порт объявлен как регистр.

Эта фраза говорит о том, что скорее всего у Вас код неправильный. Дело в том, что в верилоге reg не означает регистр. Поэтому объявить порт регистром невозможно и ваш порт регистром, скорее всего, не является.

 

Код в студию!

 

Как раз из последних Квартусов встроенный стимулятор убрали. Есть только в старых версиях.

Share this post


Link to post
Share on other sites
Уважаемые коллеги, помогите разобраться в причинах разного поведения при симуляции в Icarus Verilog и при работе в ПЛИС.

 

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

Скорее всего где-то есть асинхронное проектирование...

Share this post


Link to post
Share on other sites
Как раз из последних Квартусов встроенный стимулятор убрали. Есть только в старых версиях.

Как раз таки вы не правы. В 13 и 13.1 он есть. Да и в других тоже был.

 

http://www.altera.com/education/univ/softw...m/unv-qsim.html

 

Share this post


Link to post
Share on other sites
Как раз таки вы не правы. В 13 и 13.1 он есть. Да и в других тоже был.

 

http://www.altera.com/education/univ/softw...m/unv-qsim.html

 

Да, попутал чего-то. Я, видимо, с Timing Analyzer перепутал - его они бесповоротно на TimeQuest Timing Analyzer заменили :blush:

 

 

Share this post


Link to post
Share on other sites
Скорее всего где-то есть асинхронное проектирование...

+ несоответствие модели входного воздействия реальным входным сигналам.

Share this post


Link to post
Share on other sites
Поэтому объявить порт регистром невозможно .

а почему?

 

..
output reg oDONE=0
..

always @(posedge iCLK)
  oDONE <= ...

Edited by dcs

Share this post


Link to post
Share on other sites
а почему?

 

..
output reg oDONE=0
..

always @(posedge iCLK)
  oDONE <= ...

Этот фрагмент кода говорит о том, что выходы РЕГИСТРА "oDONE" подаются на выходной ПОРТ с тем же именем. А ПОРТ не может быть РЕГИСТРОМ...

 

Share this post


Link to post
Share on other sites
а почему?

 

..
output reg oDONE=0
..

always @(posedge iCLK)
  oDONE <= ...

 

Кроме того, что

... ПОРТ не может быть РЕГИСТРОМ...
в силу того, что это совершенно разные понятия, я имел ввиду еще и следующее.

 

Когда Вы пишите, что объявили A регистром, то это значит, что А является регистром в силу объявления, а не в силу использования. Например, когда Вы объявляете А как integer, то Вы не сможете присвоить А ничего, что не может быть преобразовано к integer.

 

В Verilog нет такого типа, как регистр. Именно поэтому объявить что-то регистром невозможно. Начинающие очень часто считают что reg в Verilog означает регистр и поэтому "reg A;" считают за объявление регистра. Однако, это не так.

 

Будет А регистром или нет определяется использованием, а не объявлением. И в вашем примере регистр oDONE появится на свет только благодаря тому, что есть

always @(posedge iCLK)

 

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

 

Еще необходимо понимать, что код

always @(posedge iCLK)
  oDONE <= ...

 

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

 

Например, в VHDL шаблон описания регистра несколько иной. В VHDL если в списке чувствительности process не указать клок, то для синтезатора это не будет проблемой - он "понимает", что описан регистр по другим "признакам" - синтезатор поставит регистр. Зато при симуляции регистр ни разу не сработает, если список чувствительности у process отсутствует.

Share this post


Link to post
Share on other sites

Что практически дает столь тонкое чувство нюансов?

 

 

 

 

Share this post


Link to post
Share on other sites
Еще необходимо понимать, что код

always @(posedge iCLK)
  oDONE <= ...

 

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

это еще почему? Вы ошибаетесь

Share this post


Link to post
Share on other sites
это еще почему? Вы ошибаетесь

 

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

 

Ответьте, пожалуйста, на несколько простых вопросов:

 

1) Всякую ли и всегда ли синтаксически правильную конструкцию синтезатор сможет воплотить физически в FPGA/ASIC?

 

2) Всякую ли и всегда ли синтаксически правильную конструкцию симулятор сможет просимулировать?

 

3) Зачем синтезатору нужно "уметь" код типа always @(posedge iCLK) oDONE <= А; интерпретировать как регистр?

 

4) Зачем симулятору нужно "уметь" код типа always @(posedge iCLK) oDONE <= А; интерпретировать как регистр?

 

5) В чем, на ваш взгляд, заключается разница между задачей синтеза и моделирования (симуляции)?

 

6) Вы все еще считаете, что я ошибаюсь?

Share this post


Link to post
Share on other sites
Хотелось бы увидеть развернутую аргументацию почему Вы считаете, что я ошибаюсь.

 

Ответьте, пожалуйста, на несколько простых вопросов:

 

1) Всякую ли и всегда ли синтаксически правильную конструкцию синтезатор сможет воплотить физически в FPGA/ASIC?

 

2) Всякую ли и всегда ли синтаксически правильную конструкцию симулятор сможет просимулировать?

 

3) Зачем синтезатору нужно "уметь" код типа always @(posedge iCLK) oDONE <= А; интерпретировать как регистр?

 

4) Зачем симулятору нужно "уметь" код типа always @(posedge iCLK) oDONE <= А; интерпретировать как регистр?

 

5) В чем, на ваш взгляд, заключается разница между задачей синтеза и моделирования (симуляции)?

 

6) Вы все еще считаете, что я ошибаюсь?

1)нет

2)не знаю, уверен что нет!

3)за тем, что так посчитал разработчик! если он так не думает, то надо ему объяснить!! (с помощью констрейнов) есть другие варианты?

4)как иначе?

5)

6) да

Edited by dcs

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this