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

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

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

 

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

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

 

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

 

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

 

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

 

Спасибо.

 

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

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

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


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

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

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

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


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

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

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

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


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

Выходной порт объявлен как регистр.

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

 

Код в студию!

 

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

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


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

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

 

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

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

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


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

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

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

 

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

 

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


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

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

 

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

 

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

 

 

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


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

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

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

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


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

Поэтому объявить порт регистром невозможно .

а почему?

 

..
output reg oDONE=0
..

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

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

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


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

а почему?

 

..
output reg oDONE=0
..

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

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

 

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


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

а почему?

 

..
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 отсутствует.

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


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

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

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

 

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

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

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


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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

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


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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

1)нет

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

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

4)как иначе?

5)

6) да

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

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...