Тип данных enum в SystemVerilog

Тип данных enum в SystemVerilog

Если переменная имеет ограниченное число возможных значений, то иногда удобно присвоить этим значениям символьные имена. Распространенный пример – имена состояний автомата (IDLE, REQ, RESP и т.д.), которые в символьном виде делают код более читабельным. Если в Verilog присвоить символьные имена можно было с помощью параметров или дефайнов, то в SystemVerilog для этого был введен специальный тип данных enum. Состояния автомата с помощью этого типа можно описать следующим образом:

  1. enum {IDLE,REQ,RESP} states;

В этом примере создается тип данных states. Переменные этого типа могут принимать только значения, указанные в фигурных скобках (IDLE, REQ и RESP). Если попытаться присвоить переменной типа states значение, которое не было указано в фигурных скобках, то возникнет ошибка. Тип данных enum является жестко типизированным.

По умолчанию значения в фигурных скобках будут типа int. В предыдущем примере IDLE=0, REQ=1, RESP=2. Эти значения можно выводить на печать как в числовом, так и в символьном формате.

Можно явно присваивать значения символьным именам. Если значение не задано явно, то будет присвоено увеличенное на 1 предыдущее значение. Значение первого символьного имени по умолчанию равно 0.

  1. // символьному имени 'c' автоматически присвоится значение 6
  2. enum {a=3, b=5, c} operands;
  3. // Синтаксическая ошибка: 'c' и 'd' имеют значение 8
  4. enum {a=0, b=7, c, d=8} operands;
  5. // a=0, b=7, c=8
  6. enum {a, b=7, c} operands;

Методы для работы с переменными типа enum

В SV есть несколько методов, которые упрощают обращение к значениям переменной типа enum:

  1. first() – возвращает первое значение переменной типа enum
  2. last() – возвращает последнее значение переменной типа enum
  3. next() – возвращает i-e следующее по счету значение переменной, отсчитанное от текущего значения (по умолчанию возвращает просто следующее значение)
  4. prev() – возвращает i-e предыдущее по счету значение переменной, отсчитанное от текущего значения (по умолчанию возвращает просто предыдущее значение)
  5. name() – возвращает символьное отображение значения переменной типа enum. Если значение не определено для данного типа, то метод name() вернет пустую строку

Примеры:

  1. module enum_methods;
  2. typedef enum {red,blue,green} e_color;
  3. e_color color;
  4. initial
  5. begin
  6. color = color.first();
  7. $display(" %s ",color.name);
  8. color = color.next();
  9. $display(" %s ",color.name);
  10. color = color.last();
  11. $display(" %s ",color.name);
  12. color = color.prev();
  13. $display(" %s ",color.name);
  14. end
  15. endmodule

Результаты:

 red
 blue
 green
 blue

Переменные типа enum в численных выражениях

Элементы переменных типа enum могут использоваться в численных выражениях. В выражениях действия выполняются над числовыми значениями соответствующих символьных отображений.

Используемая в выражении переменная типа enum или идентификатор автоматически приводятся к базовому типу (заданному или типу по умолчанию int). Если тип выражения отличается от типа участвующих в нем переменных, может потребоваться приведение типов.

Примеры:

  1. module enum_methods;
  2. typedef enum {red,blue,green} e_color;
  3. e_color c,d;
  4. int i;
  5. initial
  6. begin
  7. $display("%s",c.name());
  8. d = c;
  9. $display("%s",d.name());
  10. d = e_color'(c + 1); // приведение к типу e_color
  11. $display("%s",d.name());
  12. i = d; // автоматическое приведение
  13. $display("%0d",i);
  14. c = e_color'(i);
  15. $display("%s",c.name());
  16. end
  17. endmodule

Результаты:

red
red
blue
1
blue
Если требуется определить в типе enum значения X и Z, то необходимо явно указать тип данных с 4-мя состояниями:
  1. enum integer {IDLE, XX='x, S1='b01, S2='b10} state, next;

Share this post