0

以下に示す Verilog コードをコンパイルしようとすると、エラー メッセージが表示されます。ポイントは、入力を操作しようとしているということです。これは、Verilog では実行できないことがわかっている限りです。ポイントは、Verilog で次の条件を確認する必要があることです。

static int prime(unsigned long long n)
{
    unsigned long long val = 1;
    unsigned long long divisor = 5;

    if (n == 2 || n == 3)
        return 1;
    if (n < 2 || n%2 == 0 || n%3 == 0)
        return 0;
    for ( ; divisor<=n/divisor; val++, divisor=6*val-1)
    {
        if (n%divisor == 0 || n%(divisor+2) == 0)
            return 0;
    }
    return 1;
}

現時点では、次のコードがあります。

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

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

output ready, P;

reg ready, P;

wire [7:0] divisor;
assign divisor = 5;

wire [7:0] val;
assign val = 1;


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

        if (A%2 == 0 && A != 2) begin
            P <= 0;
        end
        else begin
            for( ; divisor <= A/divisor; val=val+1, divisor=6*val-1) begin
                if (A%divisor == 0 || A%(divisor+2) == 0) begin
                    P <= 0;
                end
            end

            // need to set P to 1
        end
    end
end

endmodule

また、素数を 6n+1 または 6n-1 の形式でテストする必要があることに注意してください。コードでは、0 と 1 も素数であると想定する必要があります。

上記のコードを試してみると、次のようなエラー メッセージが表示されます。

強化された FOR ループが Verilog で有効になっていない

誰かがエラーを解決し、Verilog でロジックを完成させるのを手伝ってくれたら嬉しいです。

4

1 に答える 1

1

Verilog BNF では、 で空のステートメントまたは複合ステートメントを使用できませんfor(;;)。ファイルを *.sv に変更して、SystemVerilog ルールでコンパイルします。それ以外の場合は、for ループ ステートメントを単純なステートメントに変更します

for( divisor =5; divisor <= A/divisor; divisor=6*val-1) begin
                if (A%divisor == 0 || A%(divisor+2) == 0) begin
                    P <= 0;
                end
                val++;
            end

また、ワイヤにプロシージャルな割り当てを行うことはできません。それらを変数にします。

于 2014-06-28T00:54:15.347 に答える