System Verilog: перечисление внутри интерфейса

У меня есть интерфейс:

interface my_intf();
typedef enum logic [1:0] {
   VAL_0 = 2'b00,
   VAL_1 = 2'b01,
   VAL_2 = 2'b10,
   VAL_3 = 2'b11
} T_VAL;
T_VAL val;
endinterface

Мой модуль использует этот интерфейс:

my_intf intf;

Проблема в том, чтобы присвоить val значение из enum.

Я могу назначить это как:

intf.val = 0; (и получение предупреждения или ошибки)

но не как:

intf.val=VAL_0;

Ни как

intf.val = my_intf.T_VAL.VAL_0

Как мне преодолеть эту проблему?


person Michael    schedule 05.03.2014    source источник
comment
К сведению, последний синтаксис работает с Vivado только в том случае, если val находится в списке портов мода, который используется модулем.   -  person ted    schedule 17.09.2015


Ответы (2)


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

import my_intf_pkg::* ;

module bla(
  output my_val_t intf
);

  initial begin
    intf = VAL_0 ;
  end

endmodule

Пакет, содержащий перечисления, может выглядеть так:

package my_intf_pkg;
  typedef enum logic [1:0] {
     VAL_0 = 2'b00,
     VAL_1 = 2'b01,
     VAL_2 = 2'b10,
     VAL_3 = 2'b11
  } my_val_t;
endpackage : my_intf_pkg

Обратите внимание, что VAL_0 и т. Д. Являются глобальными и не привязаны к T_VAL typedef. Поэтому я часто делаю их немного более уникальными, включая typedef в имени. T_VAL_0 для T_VAL определений типов и т. Д.

Вот пример на EDAplayground.

person Morgan    schedule 05.03.2014
comment
Ошибка разработки my_intf.sv: имя типа «T_VAL» неизвестно. - person Michael; 05.03.2014
comment
Попробуйте использовать его в интерфейсе: interface my_intf(); typedef enum logic [1:0] { VAL_0 = 2'b00, VAL_1 = 2'b01, VAL_2 = 2'b10, VAL_3 = 2'b11 } T_VAL; T_VAL val; endinterface - person Michael; 05.03.2014
comment
Попробуйте определить перечисление вне интерфейса, как я сделал для модуля, и импортируйте его. - person Morgan; 05.03.2014
comment
@Michael, Иногда Verilog просто как будто прыгает через произвольные обручи. - person Morgan; 05.03.2014

intf.val = 0; должно быть ошибкой, потому что вы пытаетесь назначить целочисленный тип перечислению без приведения.

intf.val = VAL_0; - ошибка, потому что VAL_0 не определен в текущей области.

Вы должны уметь делать

intf.val = intf.VAL_0;

Однако лучшее решение для размещения общих типов в пакете - импорт пакета там, где это необходимо.

person dave_59    schedule 05.03.2014
comment
intf.val = intf.VAL_0; не работает - vcs его не поддерживает. - person Michael; 05.03.2014
comment
@Michael обязательно подайте иск в Synopsys! - person Chiggs; 07.03.2014