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。