Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 递归在Verilog中是如何工作的?_Recursion_Verilog_System Verilog - Fatal编程技术网

Recursion 递归在Verilog中是如何工作的?

Recursion 递归在Verilog中是如何工作的?,recursion,verilog,system-verilog,Recursion,Verilog,System Verilog,我应该在Verilog中应用递归。我设计的代码没有显示任何错误。请看一下我的代码,其中递归调用了任务(splitt00)。Verilog支持递归吗?如何实现递归逻辑 task split00; input [0:n-1] a; input [0:n-1] b; input [0:n-1] num0; output [0:2*n-1] s; reg [0:n-1] a0,b0,u0,v0,w0,s0,s1,a1,b1,a2,b2,u1,w1,v1; reg [0:n-1] num00; beg

我应该在Verilog中应用递归。我设计的代码没有显示任何错误。请看一下我的代码,其中递归调用了任务(splitt00)。Verilog支持递归吗?如何实现递归逻辑

task split00;
input [0:n-1] a;
input   [0:n-1] b;
input [0:n-1] num0;
output [0:2*n-1] s;
reg [0:n-1] a0,b0,u0,v0,w0,s0,s1,a1,b1,a2,b2,u1,w1,v1;
reg [0:n-1] num00;
begin
     num00=num0;
     if(num00==2)
        begin
            u0=(a/10)*(b/10);
            w0=(a%10)*(b%10);
            if (((a%10-a/10)*(b%10-b/10))<0)
            begin
            v0=((a%10-a/10)*(b%10-b/10))*-1;
            s=u0*100+(u0+w0+v0)*10+w0;
            end
            else
            begin
            v0=((a%10-a/10)*(b%10-b/10));
            s=u0*100+(u0+w0-v0)*10+w0;
            end

        end

    else
    begin
    a0=a/(10**(num00/2));
    b0=a%(10**(num00/2));
    a1=b/(10**(num00/2));
    b1=b%(10**(num00/2));
    split00(a0,a1,num00/2,u1);
    split00(b0,b1,num00/2,w1);
    if((a1-a0)<0 && (b1-b0)>0)
        begin 
        a2=a0-a1;
        b2=b1-b0;
        split00(a2,b2,num00/2,v1);  
        s=u1*(10**num0)+(u1+v1+w1)*(10**(num0/2))+w1;
        end
    else if((a1-a0)>0 && (b1-b0)<0)
        begin
        a2=a1-a0;
        b2=b0-b1;
        split00(a2,b2,num00/2,v1);  
        s=u1*(10**num0)+(u1+v1+w1)*(10**(num0/2))+w1;
        end
    else if((a1-a0)<0 && (b1-b0)<0)
        begin
        a2=a0-a1;
        b2=b0-b1;
        split00(a2,b2,num00/2,v1);  
        s=u1*(10**num0)+(u1-v1+w1)*(10**(num0/2))+w1;
        end
    else 
        begin
        a2=a1-a0;
        b2=b1-b0;
        split00(a2,b2,num00/2,v1);  
        s=u1*(10**num0)+(u1-v1+w1)*(10**(num0/2))+w1;
        end
    end
end 
endtask 
任务拆分00;
输入[0:n-1]a;
输入[0:n-1]b;
输入[0:n-1]num0;
输出[0:2*n-1]s;
reg[0:n-1]a0、b0、u0、v0、w0、s0、s1、a1、b1、a2、b2、u1、w1、v1;
注册号[0:n-1]num00;
开始
num00=num0;
如果(num00==2)
开始
u0=(a/10)*(b/10);
w0=(a%10)*(b%10);

如果((a%10-a/10)*(b%10-b/10))0&&(b1-b0)您在这里编写的代码是Verilog-1995,它不支持递归。任务的参数以及任务中的所有局部变量都是静态变量,这意味着任务中的所有条目只有一个副本。Verilog-2001添加了
自动
任务和函数,它更改了生命周期,以便每个条目创建这些变量的新副本。您编码的方式是添加
automatic
关键字

task automatic split00(
  input [0:n-1] a,
  input   [0:n-1] b,
  input [0:n-1] num0,
  output [0:2*n-1] s);
在SystemVerilog中,对于任何组合逻辑例程,我都会使用函数而不是任务,并将关键字
reg
更改为
logic

function automatic void split00(
    input [0:n-1] a,
    input   [0:n-1] b,
    input [0:n-1] num0,
    output [0:2*n-1] s);
logic [0:n-1] a0,b0,u0,v0,w0,s0,s1,a1,b1,a2,b2,u1,w1,v1;
logic [0:n-1] num00;

为了合成递归函数,您与任何循环都有相同的编码限制。合成工具需要将递归展开为固定数量的函数项。它通过将函数排列到调用函数的代码体中来实现这一点。

问题的原始标题是分开的如果你需要使用generate来综合这个逻辑,那是另一个问题。谢谢你的建议。