以下に示す 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 でロジックを完成させるのを手伝ってくれたら嬉しいです。