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

时间:2019-01-12 23:09:42

标签: system-verilog

我试图了解typedef和enum在SystemVerilog中的工作方式,尤其是是否有可能在模块的端口声明中使用“自定义”数据类型。

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

super(height, width);

现在,我想在模块中定义类型为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

这可能吗?如果是这样,语法是否正确?我目前在Modelsim上遇到问题

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
);

但是我无法确定这是由于某个愚蠢的错误还是由于更严重的概念错误。

1 个答案:

答案 0 :(得分:3)

如果将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
);