2016-09-03 22 views
2

私はVerilogで再帰を適用することになっていました。私が設計したコードはエラーを表示しません。タスク(splitt00)が再帰的に呼び出される私のコードを見てください。 Verilogは再帰をサポートしていますか?どのように再帰的ロジックを実装できますか?再帰はどのように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 
+0

質問の元のタイトルはあなたの投稿の本文とは別の質問です。 generateを使用してこのロジックを合成する必要がある場合は、それが別の質問です。 –

+0

ありがとうございました。 –

答えて

4

ここでコーディングしたものは、再帰をサポートしていないVerilog-1995です。タスクへの引数とその内部のすべてのローカル変数は静的変数です。つまり、タスクへのすべてのエントリに対して1つのコピーしか存在しません。 Verilog-2001にはautomaticのタスクと関数が追加されており、各エントリがそれらの変数の新しいコピーを作成するようにライフタイムを変更します。あなたがコード化する方法は、automaticキーワードを追加することです。 SystemVerilogので

task automatic split00(
    input [0:n-1] a, 
    input [0:n-1] b, 
    input [0:n-1] num0, 
    output [0:2*n-1] s); 

、私は、あなたは、再帰関数を合成するために

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; 

を組み合わせ論理である任意のルーチンの機能の代わりに、タスクを使用し、logic

にキーワード regを変更します任意のループと同じコーディング制限があります。合成ツールは、関数の固定数のエントリに再帰を展開する必要があります。これは、関数の呼び出しを行ったコード本体に関数をインライン展開することで行います。

関連する問題