Interface 系统Verilog:enum内部接口

Interface 系统Verilog:enum内部接口,interface,enums,system-verilog,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; 我的模块使用此接口: interface my_intf(); typedef enum logic [1:0] { VAL_0 = 2'b0

我有一个界面:

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;
我的模块使用此接口:

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

我可以将其指定为:


intf.val=0(并收到警告或错误)

但不是:

intf.val=val\u 0

也不是

intf.val=my\u intf.T\u val.val\u 0


我如何克服这个问题?

intf.val=0应该是一个错误,因为您正在尝试为没有强制转换的枚举分配整数类型

intf.val=val\u 0是一个错误,因为当前范围中未定义VAL_0

你应该能做到

intf.val = intf.VAL_0;

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

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

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
etc是全局的,不与
T_VAL
typedef绑定。因此,我经常使它们更加独特,包括名称中的typedef<代码>T_VAL_0
用于
T_VAL
typedefs等


.

对于“my_intf.sv”存在详细说明错误:类型名称“T_VAL”未知。请尝试在接口中使用它:
接口my_intf();typedef枚举逻辑[1:0]{VAL_0=2'b00,VAL_1=2'b01,VAL_2=2'b10,VAL_3=2'b11}tval;T_VAL;endinterface
尝试在接口之外定义枚举,就像我对模块所做的那样,然后导入它。@Michael,有时候Verilog感觉就像在任意的环中跳跃。
intf.val=intf.val\u 0不起作用-vcs不支持它。@Michael一定要向Synopsys提起诉讼!作为记录,只有当模块使用的modport列表中有
val
时,最后一个语法才适用于Vivado。