无法在systemverilog中使用枚举

时间:2018-01-22 06:10:57

标签: enums system-verilog

我有一个设计文件ALU和另一个测试平台。这是我的代码:

parameter WIDHT = 4;

typedef enum logic[1:0] {
   ADD =2'b00,
   AND =2'b01,
   OR = 2'b10,
   XOR = 2'b11
} operation;


module ALU
( 
input logic [WIDHT-1:0] A,B,
input operation op,
output logic [WIDHT-1:0] R,
output logic N,Z,V
);

always_comb
begin
    unique case(op)
            ADD: R = A+B;
            AND: R = A&B;
            OR: R = A|B;
            XOR: R = A^B;
        default : R=0; 
    endcase

    if(R=='b0)
        Z = 1;
    else if (R[WIDHT-1] == 1'b1)
            begin
                if( A[WIDHT-1] == 1'b0 && B[WIDHT-1] == 1'b0)
                    V = 1;
                else
                    N = 1;
            end
    else if (R[WIDHT-1] == 1'b0)
            begin
                if( A[WIDHT-1] == 1'b1 && B[WIDHT-1] == 1'b1)
                    V = 1;
                else
                    begin
                        R=0;
                        Z=0;
                        V=0;
                    end
            end
    end

endmodule: ALU

这是我的测试平台:

parameter W = 4;

module ALU_tb;

logic [W-1:0] A,B;
logic [1:0]  op1;
logic [W-1:0] R;
logic N,Z,V;

ALU alu(A,B,op1,R,N,Z,V);

initial
   begin
    $monitor($time," A = %b, B = %b, ope = %b, R = %b, N = %b, Z = %b, V = %b",A,B,op1,R,N,Z,V);

    A =0;
    B=0;

    #10;

    for(A=0; A<2**W ; A++)
        begin   
            for(B=0; B<'d2**W ; B++)
                begin
                    /*for(op =  op.first; op<=op.last; op.next)
                        #10; */
                    for(op1 = 2'b00; op1<=2'b11; op1++)
                        #10;

                    end
           end
   end

endmodule: ALU_tb       

现在,代码编译成功但不模拟。它给我一个错误,说我需要将enum分配给相同的enum类型或其中一个值。我做错了什么?有什么建议?我发现的一件事是使用包并将typedef enum放入其中,然后在我的设计和测试平台文件中导入包。但我试图避免在我的测试平台中使用enum。有人可以建议吗?

1 个答案:

答案 0 :(得分:0)

枚举是一种比大多数整数类型更强的类型。您需要使用package方法使类型赋值兼容。

另一种选择是使您的端口成为一个位向量,然后将其转换为设计中的操作类型。