2017-10-09 10 views
-2

私は、シーケンシャルロジック(常にクロックのposedgeでアクティブ化されたブロック)内にcase文を持っています。このケースでは、変数varを評価していますが、ビット幅はパラメータPARAMによって異なります。可能な値のすべてをカバーする必要があります。varはケースのステートメントで取ることができ、値はPARAMに基づいて異なります。一例として、PARAMが32の場合、varは5ビット幅であるため、32個のケースが必要です。 PARAMが16の場合、varは4ビット幅であり、16の場合が必要です。このケースステートメントはifステートメントのネスト内にもあり、シーケンシャルロジック(これは条件付きgenerateステートメントについて既に考えている)の外に出す方法を考えるのが難しくなります。これを行う方法に関するアイデア?以下の構造のための擬似コードである:SystemVerilogのパラメータに依存するcase文

module a 
#(parameter PARAM = 8, 
    parameter WIDTH = $clog2(PARAM) 
) 
... 
input logic [WIDTH-1:0] var 
... 
always @(posedge clk) 
    begin 
    if(...) 
     begin 
     if(...) 
      begin 
      case(var) 
       3'd0: 
       3'd1: 
       3'd2: 
       3'd3: 
       3'd4: 
       3'd5: 
       3'd6: 
       3'd7: 
       default: 
      endcase 
      end 
     end 
    end 

上記の例では、PARAMがデフォルト値をとる場合には(8)、8例が存在すべきです。しかし、インスタンス化時にPARAMが4だった場合は、4つのケースしか存在しません。

ありがとうございます。

+0

あなたはコードがどのように見えるかの例を示す必要があります。各ケース項目のコードをどのようにパラメータ化するのでしょうか? –

+1

Verilogにそのようなものはありません。ほとんどの場合、問題とは異なる解決策がありますが、それを理解するための例を提示する必要があります。最悪の場合、おそらくスクリプトや他の方法を使ってVerilogコードを生成することができます。 – Serge

+0

良い答えが必要な場合は、IPを取り除いた例を示すために何らかの努力を払わなければなりません。 –

答えて

0

val、a、b、c、dが何であるかを説明すると、本当に役に立ちます。ここで私ができることは最高です

always @(posedge clk) 
    begin 
    if(...) 
     begin 
     if(...) 
      begin 
      if (param == 1 && (var inside {a,b})) 
       branch = var; 
      else 
       branch = a_value_that_is_not_a,b,c,d; 
      case(branch) 
       a: 
       b: 
       c: 
       d: 
       default: 
      endcase 
      end 
     end 
    end 
+0

こんにちはDave!私はより明確になるように質問を修正しました。私はまず問題を説明するのに最善の仕事をしないことをお詫びします。助けてくれてありがとう! –

関連する問題