【问题标题】:How to check unknown logic in Verilog?如何检查 Verilog 中的未知逻辑?
【发布时间】:2014-06-28 10:14:27
【问题描述】:

我正在检查 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

似乎没有工作。

【问题讨论】:

  • 这是用于可合成的 Verilog 吗?合成后变成硬件时x不是会存在的值,会是1或者0。

标签: verilog primes system-verilog


【解决方案1】:

您应该使用 case equality 运算符 (===),它测试 4 状态逻辑相等,然后使用 logical equality 运算符 (==)。

对于== 运算符,如果任一操作数包含xz,则结果为x。 对于 === 运算符位,xz 包含在比较中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2015-05-27
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多