0

イネーブル信号を計算するために、次の作業コードを作成しました。

logic            l_en [0:N-1];
logic    [0:N-1] l_output_grant [0:M-1];

always_comb begin
  for (int i=0; i<N; i++) begin
    l_en[i]   = |{l_output_grant[0][i], 
                  l_output_grant[1][i], 
                  l_output_grant[2][i], 
                  l_output_grant[3][i], 
                  l_output_grant[4][i]};
  end
end

[0] から [4] までのパラメータにコードを変更しようとしています。次のコードを試しました

logic            l_en [0:N-1];
logic    [0:N-1] l_output_grant [0:M-1];

always_comb begin
  for(int i=0; i<N; i++) begin
    for(int j=0; j<M; j++) begin
      l_en[i]   = |l_output_grant[j][i]; 
    end
  end
end

これは機能しません。これは、j の反復ごとに再計算され、[j+1][i] が低い場合に [j][i] によって割り当てられた有効化がクリアされるためだと思います。

他にどのような方法でこれを行うことができますか?

4

1 に答える 1

0

l_en[i] = |l_output_grant[j][i]プレビューの割り当てをオーバーライドします。また、|l_output_grant[j][i]何もしない信号ビットに対するビット単位の or 演算子です。

必要な機能を得るには、|=ビット単位の演算子を使用します。l_en |= l_output_grant[j]. または、従来の Verilog メソッドを使用しl_en = l_en | l_output_grant[j]ます。l_enfor ループの前にすべてのゼロを割り当てて、古い値をクリアすることを忘れないでください。値をクリアしないと、ラッチが作成され、ハイからローへの遷移が発生しなくなります。幅が合っているのでfor(i=...)ループは不要です。

always_comb begin
  l_en = '0; // all bits to zero
  for(int j=0; j<M; j++) begin
    l_en |= l_output_grant[j];
    // equivalent to: l_en[0:N-1] = l_en[0:N-1] | l_output_grant[j][0:N-1];
  end
end

|=注: シンセサイザーが演算子をサポートしていない場合は、Verilog スタイルを使用してください。SystemVerilog がサポートされている場合、シミュレーターはオペレーターをサポートします。

于 2013-11-14T17:57:46.220 に答える