是否可以在模块的端口声明中使用用 "typedef enum" 定义的类型?

Is it possible to use a type defined with "typedef enum" in a module's port declaration?

我正在尝试了解 SystemVerilog 中的 typedef 和枚举是如何工作的,特别是,是否可以在模块的端口声明中使用 "custom" 数据类型。

到目前为止,我已经能够在包中创建自定义数据类型,这里是:

typedef enum logic[2:0] {
        add_conf = 3'b000,
        sub_conf = 3'b001,
        and_conf = 3'b010,
        or_conf = 3'b011,
        xor_conf = 3'b100,
        sll_conf = 3'b101,
        srl_conf = 3'b110,
        sra_conf = 3'b111
} iexu_conf

现在,我想在模块中定义一个 iexu_conf 类型的输入端口,如下所示:

module iexu_decoder
(
    input iexu_conf conf,
    output logic add_ctrl,
    output logic[1:0] logic_ctrl,
    output logic[1:0] shifter_ctrl,
    output logic[1:0] outmux_ctrl
);

这可能吗?如果是这样,语法是否正确?我目前在使用 Modelsim

时遇到问题
** Error: (vlog-13069) iexu_decoder.sv(5): near "conf": syntax error, unexpected IDENTIFIER, expecting ')'.

但我不知道这是因为一些愚蠢的错误还是由于更严重的概念错误。

如果将 typedef 放入包中,则需要显式引用该包或 import 它才能在使用它的所有模块声明中可见。

package pkg;
  typedef enum logic[2:0] {
        ...
  } iexu_conf;
endpackage

显式引用:

module iexu_decoder
(
    input pkg::iexu_conf conf,
    output logic add_ctrl,
    output logic[1:0] logic_ctrl,
    output logic[1:0] shifter_ctrl,
    output logic[1:0] outmux_ctrl
);

模块头导入:

module import pkg::*; iexu_decoder
(
    input iexu_conf conf,
    output logic add_ctrl,
    output logic[1:0] logic_ctrl,
    output logic[1:0] shifter_ctrl,
    output logic[1:0] outmux_ctrl
);