【发布时间】:2014-08-19 03:03:35
【问题描述】:
我有下面显示的 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 也是素数。
如果我尝试上面的代码,我会收到一条错误消息:
没有为verilog启用增强的FOR循环
如果有人可以帮助我解决错误并在 Verilog 中完成我的逻辑,我会很高兴。
【问题讨论】:
-
等等!你是说0和1是素数吗?而不是检查
divisor <= A/divisor,您应该使用divisor*divisor <= A来避免除法很慢并且比乘法占用更多空间 -
@LưuVĩnhPhúc 我知道它们不是素数。但是在给我的任务中,我需要假设它们是素数,甚至不知道为什么。但是,是的,2 是最小的素数。
标签: verilog primes system-verilog primality-test