Назначение типа перечисления System Verilog - PullRequest
1 голос
/ 04 августа 2020

У меня есть общий модуль c в моей библиотеке, который используется несколько раз в разных местах проекта. * тип, определенный в другом месте:

    my_type_t ope, res;
    generic #(
       .WIDTH ($bits(ope))
    ) ope_res (
      .a (ope),
      .z (res)
    );

Когда я компилирую, я получаю предупреждения о линтах в VCS:

    Warning-[ENUMASSIGN] Illegal assignment to enum variable
    ...
      Only expressions of the enum type can be assigned to an enum variable. 
      The type logic [WIDTH-1:0] is incompatible with the enum 'my_type_t'
      Expression: z
      Use the static cast operator to convert the expression to enum type.

Есть ли простой способ исправить это? Модуль generic используется для разных type s, поэтому он должен быть не- type модулем.

1 Ответ

4 голосов
/ 04 августа 2020

Лучше иметь вескую причину для приведения типа вне перечисления. Вы можете обойти ошибку, используя оператор потоковой распаковки

generic #(
   .WIDTH ($bits(ope))
) ope_res (
  .a (ope),
  .z ({>>{res}})
);

Правильный способ исправить это - создать generic с использованием параметризованного типа.

module generic #(
  parameter WIDTH = 1, type T = logic [WIDTH-1:0]
) (
  input  logic T a,
  output logic T z
);

// some function...

endmodule

module ...
 my_type_t ope, res;
 generic #(
   .T (my_type_t)
 ) ope_res (
  .a (ope),
  .z (res)
 );
endmodule
...