【问题标题】:System Verilog: enum inside interfaceSystem Verilog:枚举内部接口
【发布时间】:2014-03-05 06:22:51
【问题描述】:

我有一个界面:

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

我如何克服这个问题?

【问题讨论】:

  • 作为记录,最后一个语法仅在 val 位于模块使用的 modport 列表中时才适用于 Vivado。

标签: interface enums system-verilog


【解决方案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。 T_VAL_0 for T_VAL typedefs 等

Here is an example on EDAplayground.

【讨论】:

  • “my_intf.sv”存在详细说明错误:类型名称“T_VAL”未知。
  • 在界面中尝试使用: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
  • 尝试像我为模块所做的那样在接口之外定义枚举,然后导入它。
  • @Michael,有时 Verilog 感觉就像是在任意跳。
【解决方案2】:

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

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

你应该可以的

intf.val = intf.VAL_0;

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

【讨论】:

  • intf.val = intf.VAL_0; 不工作 - vcs 不支持它。
  • @Michael 一定要向 Synopsys 提出案例!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多