Как проверить неизвестную логику в Verilog?

Я проверяю простоту числа в виде 6n + 1 или 6n-1. У меня есть приведенный ниже код, но, похоже, он не дает правильного результата.

    module prime(clk, rst, start, A, ready, P);

    input clk, rst, start;
    input [7:0] A;

    output ready, P;

    reg ready, P;

    reg [7:0] divisor;
    reg val;


    always @ (posedge clk or negedge rst) begin
        if (!rst) begin
            P <= 1'bx;
        end
        else if (start) 
        begin
            case (A)
               -1 : P <= 1;
                0 : P <= 1;
                1 : P <= 1;
                2 : P <= 1;
                3 : P <= 1;
                5 : P <= 1;
            endcase

            if (A%2 == 0 && A != 2) begin
                P <= 0;
                ready <= 1;
            end

            else if(A > 6) 
            begin
                for(divisor = 5; divisor <= A/divisor; divisor=divisor+6) begin
                    if (A%divisor == 0 || A%(divisor+2) == 0) begin
                        P <= 0;
                    end
                end 

                   if (P != 0 && P == 1'bx) begin // need to fix
                        P <= 1;
                    end
            end
        end
    end
endmodule

Дело в том, что эта часть вроде не работает:

if (P != 0 && P == 1'bx)

Как я могу проверить, включает ли переменная неизвестную логику, то есть x. Проверка, как указано выше

P == 1'bx

похоже, не работает.


person Community    schedule 28.06.2014    source источник
comment
Это для синтезируемого Verilog? Когда он синтезируется и превращается в оборудование, x не является значением, которое будет существовать, оно будет 1 или 0.   -  person Morgan    schedule 02.07.2014


Ответы (1)


Вам лучше использовать оператор case equality (===), который проверяет логическое равенство с 4 состояниями, а затем оператор logical equality (==).

Для оператора == результатом будет x, если любой из операндов содержит x или z. Для оператора === в сравнение включены биты с x и z.

person Qiu    schedule 28.06.2014