【问题标题】:How to test primality in Verilog?如何在 Verilog 中测试素数?
【发布时间】: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 &lt;= A/divisor,您应该使用divisor*divisor &lt;= A 来避免除法很慢并且比乘法占用更多空间
  • @LưuVĩnhPhúc 我知道它们不是素数。但是在给我的任务中,我需要假设它们是素数,甚至不知道为什么。但是,是的,2 是最小的素数。

标签: verilog primes system-verilog primality-test


【解决方案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

此外,您不能对电线进行程序分配。使它们成为变量。

【讨论】:

  • 另外var 根本不需要for (divisor=5; divisor &lt;= A/divisor; divisor=divisor+5) begin
  • @Greg 您不能在每次迭代后简单地添加 5。 5+5 = 10,您根本不需要检查 A % 10。如果需要,您可以使用for (step = 2, divisor = 5; divisor*divisor &lt;= A; divisor &lt;= divisor + step, step &lt;= 6 - step)。那将消除乘数。您还可以在 2 和 4 步之间交替
  • +5 是一个错字。我的意思是+6
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多