2008-08-29 3 views
15

Что означает, если задача объявлена ​​с помощью автоматического ключевого слова в Verilog?Verilog automatic task

task automatic do_things; 
    input [31:0] number_of_things; 
    reg [31:0] tmp_thing; 
    begin 
    // ... 
    end 
endtask; 

Примечание: Этот вопрос в основном потому, что мне любопытно, есть ли на сайте какие-либо аппаратные программисты. :)

ответ

14

Это означает, что задача является повторной попыткой - элементы, объявленные в задаче, динамически распределяются, а не разделяются между различными вызовами задачи.

Вы видите - некоторые из нас делают Verilog ... (тьфу)

3

«автоматом» ключевое слово также позволяет писать рекурсивные функции (с момента Verilog 2001). Я считаю, что они должны быть синтезируемыми, если они снижаются, но я не уверен, что у них есть поддержка инструмента.

I тоже, делаю verilog!

1

Как говорит Уилл и Марти, автоматический режим был предназначен для рекурсивных функций.

Если нормальная (то есть не автоматическая) функция вызывается с разными значениями и обрабатывается имитатором в одном и том же срезе времени, возвращаемое значение является неопределенным. Это может быть довольно сложной ошибкой! Это только проблема моделирования, когда синтезируется логика будет правильной.

Выполнение функции автоматически устраняет это.

21

«автоматический» на самом деле означает «повторный вход». Сам термин украден из языков программирования - например, C имеет ключевое слово «auto» для объявления переменных как выделенных в стеке, когда область, в которой он находится, выполняется и освобождается впоследствии, так что несколько вызовов одной и той же области действия не видеть постоянные значения этой переменной. Причина, по которой вы, возможно, не слышали об этом ключевом слове в C, это то, что это класс хранения по умолчанию для всех типов :-) Альтернативы являются «статическими», что означает «распределить эту переменную статически (в одно глобальное местоположение в памяти) и ссылаться на эту же ячейку памяти во время выполнения программы, независимо от того, сколько раз функция вызывается »и« volatile », что означает« это регистр в другом месте моего SoC или что-то еще на другом устройстве, которое у меня нет компилятор, пожалуйста, не оптимизируйте чтение для меня, даже если вы думаете, что знаете мою ценность из предыдущих чтений без промежуточных записей в коде ».

«автоматический» предназначен для рекурсивных функций, но также для одновременной работы одной и той же функции в разных потоках исполнения. Например, если вы «разблокируете» N разных блоков (используя оператор Verilog fork-> join), и все они одновременно вызовут одну и ту же функцию, те же проблемы возникают как функция, вызывающая себя рекурсивно.

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