2015-06-22 2 views
4

Я ищу преимущества «автоматического» в Systemverilog. Я видел «автоматический» факторный пример. Но я не могу получить их. Кто-нибудь знает, почему мы используем «автоматический»?В чем преимущество автоматических переменных?

+0

Пожалуйста, задайте более конкретные вопросы. Автоматические переменные похожи на любую локально объявленную переменную в C/C++. Обычно неавтоматические переменные в Verilog похожи на статические переменные в C/C++. –

+0

http://stackoverflow.com/questions/28021666/what-is-the-difference-between-automatic-and-static-task-why-we-cant-pass-by-ref/28025207#28025207 – Meir

ответ

7

Традиционно Verilog используется для моделирования оборудования при RTL и абстракциях уровня Gate. Поскольку абстракция уровня RTL и Gate является статической/фиксированной (нединамической), Verilog поддерживает только статические переменные. Так, например, любые рег или провод в Verilog будут созданы или отображены в начале моделирования и будут отображаться в памяти моделирования до конца моделирования. В результате вы можете взять свалку любого провода/регистра в виде сигнала, а рег/провод будет иметь значение от начала до конца, так как он всегда отображается на карту. В перспективе программистов такие переменные называются статические. В мире C/C++, чтобы объявить такую ​​переменную, вам нужно будет использовать спецификатор класса static. В Verilog каждая переменная неявно статична.

Обратите внимание, что до появления SystemVerilog Verilog поддерживает только статические переменные. Несмотря на то, что Verilog также поддерживал некоторые конструкции для моделирования при поведенческой абстракции, поддержка была ограничена отсутствием автоматического класса хранения.

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

Среди других преимуществ, одна из возможностей, предоставляемых этим классом хранения, - рекурсивные функции. В мире Verilog функция не может быть повторной. Рекурсивные (или повторные) функции не служат какой-либо полезной цели в мире, где нет возможности использовать класс автоматического хранения. Чтобы понять это, вы можете представить функцию повторного входа как функцию, которая динамически создает множество рекурсивных экземпляров. Каждый экземпляр получает свои автоматические переменные, отображаемые в стеке. По мере продвижения к рекурсии стек растет, и каждая функция получает свои вычисления, используя свой собственный набор переменных. Когда функция вызывает возврат, вычисляемые значения сортируются и конечный результат становится доступным. При использовании только статических переменных каждый вызов функции сохраняет значения переменных в одинаковых общих местоположениях, тем самым стирая любое преимущество нескольких вызовов (экземпляров).

Приведенный в факториал алгоритм относительно легко концептуализировать факториал как рекурсивный алгоритм. В математике пишем factorial (n) = n (factial (n-1)) *. Поэтому вам нужно рассчитать факторный (n-1), чтобы узнать факториал (n). Обратите внимание, что рекурсия не может быть завершена без завершающего случая, который в случае factorial равен n = 1.

function automatic int factorial; 
    input int n; 
    if (n > 1) 
    factorial = factorial (n - 1) * n; 
    else 
    factorial = 1; 
endfunction 

Без автоматического класса хранения, так как все переменные в функции будут отображаться в определенном месте, когда мы называем факторный (п-1) внутри факториала (п), рекурсивный вызов будет перезаписать переменная внутри контекста вызывающего абонента.В функции факториала, как определено в приведенном выше фрагменте кода, если мы не указываем класс хранения, как автоматического, как п и результат факторный будут перезаписаны рекурсивный вызов факториал (п-1). В результате переменная п будет последовательно быть перезаписаны в п-1, N-2, п-3 и так далее, пока мы достигаем условие завершения из п = 1. Конечный рекурсивный вызов факториалу должен иметь значение 1, назначенное n, и когда рекурсия разматывается, факторный (n-1) * n будет оценивать до 1 на каждом этапе.

С автоматическим классом хранения каждый вызов рекурсивной функции будет иметь свое место в памяти (фактически в стеке) для хранения переменной n. В результате последовательные вызовы факториала не будут перезаписывать переменную n вызывающего абонента. В результате, когда рекурсия раскручивается, мы будем иметь правильное значение для factorial (n) как n * (n-1) (n-2) .. * 1.

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

0

Другим примером является использование вилки соединяются внутри для петли -

Без использования автоматических, вилка соединяются внутри для цикла не будет работать правильно.

for (int i=0; i<`SOME_VALUE ; i++) begin 
    automatic int id=i; 
    fork 

     task/function using the id above ; 
     ... 
    join_none 
end 
0

Предлагаю 1 пример, как показано ниже (с использованием вилки ... join_none):

Ex.1 (не используя автоматический ): выходное значение будет "3 3 3 3" , потому что i принимает самое последнее значение после выхода для loop, i хранится в статической памяти. Это может быть ошибкой в ​​вашем коде.

initial begin 
    for(int i =0; i<=3 ; i++) 
    fork 
     $write ("%d ", i); 
    join_none 
end 

Ex.2 (с использованием автоматического ): выходное значение будет "0 1 2 3". Поскольку в каждом цикле, значение я копируются в K и fork..join_none икры нити с каждым значением K (каждый цикл будет найти пространство памяти для 1 к: к0, к1, к2, k3):

initial begin 
    for(int i =0; i<=3 ; i++) 
     fork 
      automatic int k = i; 
      $write ("%d ", i); 
     join_none 
    end 
Смежные вопросы