System Verilog:界面内部的枚举

时间:2014-03-05 06:22:52

标签: interface enums 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

我是如何克服这个问题的?

2 个答案:

答案 0 :(得分:1)

我之前只处理过包含枚举的包,并避免使用接口。这就是我使用包的方式。在要使用它的模块定义之前导入包:

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 typedef等的T_VAL

Here is an example on EDAplayground

答案 1 :(得分:0)

intf.val = 0;应该是一个错误,因为你试图在没有强制转换的情况下为枚举分配一个整数类型。

intf.val = VAL_0;是一个错误,因为VAL_0未在当前范围内定义。

你应该能够做到

intf.val = intf.VAL_0;

但是,将共享类型放入包中的最佳解决方案是,在需要的地方导入包。