首页 文章

将枚举转换为逻辑

提问于
浏览
2

考虑以下模块声明:

module DFF(d, q, CLK, RESET);
 parameter W = 2;
 input  [W-1:0] d;                      
 input  CLK;                                
 input  RESET;      
 output logic [W-1:0]   q; 

//....
endmodule

在d和q是枚举类型的情况下实例化它的正确方法是什么?这是我的枚举类型:

typedef enum logic [1:0] {ENUM_IDLE = 0,
            ENUM_S1 ,
            ENUM_S2
            } T_STATE;

我想为T_STATE变量类型实例化DFF:

T_STATE d, q;
DFF dff_inst (.d(d), .q(q), .CLK(CLK), .RESET(RESET));

这会生成编译/枚举错误 . 我也尝试过失败了:

DFF dff_inst (.d(logic'(d)), .q(logic'(q)), .CLK(CLK), .RESET(RESET));

DFF dff_inst (.d(logic[1:0]'(d)), .q(logic[1:0]'(q)), .CLK(CLK), .RESET(RESET));

我想按原样保留DFF定义,但将枚举类型转换为逻辑 .

Edit:

IEEE Std 1800-2012,6.24.1中建议的这个也会产生一个细化错误:

typedef logic [$bits(T_STATE) - 1 : 0] T_STATE_LOGIC; 
DFF dff_inst (.d(T_STATE_LOGIC'(d)), .q(T_STATE_LOGIC'(q)), .CLK(CLK), .RESET(RESET));

1 回答

  • 3

    d 不需要铸造 .

    我只能使用ModelSim重现错误,我可以访问的所有其他模拟器都没有生成任何错误或警告并正确模拟 .

    对于ModelSim,我发现这有效:

    DFF dff_inst (.q(q[1:0]), .*);
    

    这工作:

    DFF dff_inst (.q({q}), .*);
    

    here上的工作示例

相关问题