2013-06-05 4 views
0

Я просмотрел несколько руководств Verilog и рассмотрел темы пару раз, и несколько вопросов задерживались в моей голове с тех пор, как концепции были впервые введены, и если кто-то мог пролить свет на их, это было бы очень полезно.Заполнение пробелов на Verilog/System Verilog

  1. Какова цель силы в сети?
  2. Часто в примерах параметров точные имена используются также для описания регистров. Например:

    module x (…,in1,…); 
    … 
    input in1; 
    reg [7:0] in1; 
    … 
    endmodule 
    

    Означает ли это, что входной порт является типом данных или они разделены? Если первое верно, какие другие виды величин я могу сделать с помощью (целые числа, скаляры и т. Д.)? Если последнее верно, какой элемент я имею в виду, когда я говорю «in1» внутри модуля?

  3. Начальные блоки в начале симуляции все выполняются «параллельно», но когда вы находитесь внутри блока, инструкции выполняются последовательно. Использует ли используемый вами инструмент моделирования, какой порядок выполняются последовательно выполненными инструкциями? Например, у вас есть 2 начальных блока, выполняем ли мы все сначала, или прыгаем туда и обратно?

4. Почему исходные значения в моделировании X? Если работа Verilog должна представлять реальную жизнь, почему она не имеет псевдослучайного механизма и выбирает тот же случайный порядок бит для всех значений в начале? Вы сталкиваетесь с множеством проблем с уникальными предупреждениями о случаях, и это похоже на конструктивный недостаток или, по крайней мере, несоответствие между системой Verilog и Verilog.

+0

Некоторые ответы находятся в LRM: http://stackoverflow.com/questions/16399064/how-do-i-get-the-verilog-language-standard – toolic

ответ

0
  1. Позволяет установить несколько драйверов в сети и определить значение результирующего сигнала; см. 7.10 в LRM
  2. Они все одинаковые in1 - очень многословный. В V-2001 вы можете написать только один input reg[7:0] in1 в списке портов. Вы можете сделать это для всего, что вы подключаете через порт.
  3. Обратите внимание, что инициалы не гарантируются, прежде чем они будут выполнены, и нет гарантированного порядка выполнения между любыми начальными/всегда блоками в вашем дизайне. На практике симулятор выбирает блок и выполняет его до тех пор, пока он не достигнет точки приостановки (управления синхронизацией), после чего симулятор планирует другое начальное или всегда и выполняет его до тех пор, пока он не приостанавливается, и так далее.
  4. Это по существу философия, но почему вы хотите присвоить начальные случайные значения чему-либо? Это в основном то, что означает «неизвестный» (X) (или Z для сетей). Если в начале времени все X или Z, то вы знаете, что оно неинициализировано и останется таким, пока вы что-то не сделаете. Если инструмент дал все начальные случайные допустимые значения, вы никогда не узнаете об этом.
+0

Если все было начальное значение рандомизированного , вы не получили бы много предупреждений о времени выполнения, поскольку у вас не было подходящего случая для ваших уникальных блоков, потому что значения, которые вы тестируете, неизвестны. , Я проверю, что LRM, спасибо! –

+0

Вы можете найти casex/casez для сопоставления неизвестных или отложить проверку кода до тех пор, пока все не будет инициализировано или не будет игнорировать предупреждения времени-0 - просто предоставление всего значения, отличного от x, не будет хорошей идеей. Помимо всего прочего, ваши симы не повторялись бы. – EML

+0

7.10 LRM помечен как «Очереди». Это раздел, который вы намеревались мне читать? То, как я избегаю уникальной проблемы с предупреждением о времени выполнения, заключается в компиляции с «-xlrm uniq_prior_final», которая удерживает проверку уникальных операторов case до конца шага времени. Хорошо работает, мне было просто любопытно, нужно ли им реализовывать эти переключатели из-за несоответствия между этими двумя языками. –

0
  1. В случае силы конкурирующей помогает решить к известному значению. В прошлый раз я видел что-то подобное в дизайне, это было 10 лет назад. И даже тогда это считалось плохой проектной практикой.

  2. Как говорится в EML.

  3. Нет и нет. Операторы в любом процедурном блоке, такие как начальный блок, выполняются последовательно в одном и том же временном интервале. Начальные блоки начинают выполнение во время 0. Симулятор выполняет все операторы в порядке их появления внутри исходного блока в соответствии с очередью событий verilog. Переменные обновляются в соответствии с графиком, определяемым очередью событий.Все это является частью стандарта (LRM 8.10). Если вы не знакомы с очередью событий verilog и понятием временных интервалов и временем моделирования, то Cliff Cumming's paper - отличная ссылка. Не имеет значения, выполняет ли симулятор инструкции из разных начальных блоков, чередующихся или любым другим способом. Время моделирования не продвигается, и переменные обновляются только на основе очереди событий.

    Что не является стандартным, с которого должен начинаться исходный блок, имитирующий симулятор. Это становится важным, потому что это создает зависимость от симулятора, если переменные назначаются в одном начальном блоке и используются в другом процедурном блоке в пределах одной очереди событий. Статья Камминга, упомянутая выше, объясняет этот сценарий очень хорошо.

  4. Речь идет не только о неразрешенном состоянии сети. Но и о начале моделирования из предсказуемого состояния. Следовательно, случайный выбор разрешенного состояния входов в проект не обеспечивал бы предсказуемости при запуске симулятора с одной и той же точки каждый раз. В дополнение к предложению EML вы можете использовать двухпозиционные типы данных, представленные в SystemVerilog. Конечно, они не синтезируются. Потому что для точного моделирования аппаратного обеспечения вы хотите, чтобы состояние вывода было неизвестно, если входы неизвестны.

Смежные вопросы