38

RTLブロックに同じレジスタへの複数の割り当てが含まれている場合のカンザス溶岩の動作を理解するのに問題があります。これがバージョン番号1です。

foo :: (Clock c) => Signal clk Bool
foo = runRTL $ do
    r <- newReg True
    r := low    
    return $ var r

これは私が期待したとおりに動作します。

*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .

生成されるVHDLものは次のとおりです。

architecture str of assignments is
  signal sig_2_o0 : std_logic;
begin
  sig_2_o0 <= '0';
  OUTPUT <= sig_2_o0;
end architecture str;

ただし、この他のバージョンも機能することを望みました。

foo = runRTL $ do
    r <- newReg True

    r := low
    r := high
    return $ var r

しかし、そうではなく、2番目の割り当ては考慮されていません。

*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .

私が混乱している理由は、regvarがフルクロックサイクルで定義されているためです。したがって、に基づいて分岐しr、それに新しい値を再割り当てするなど、合成が不可能なことを実行できるわけではありません。では、なぜこの2番目の形式が機能しないのでしょうか。

これはシミュレーションの問題だけではありませんVHDL。2番目のバージョン用に生成されたものは、2番目の割り当てが生成時に破棄されることを明確に示しています。

architecture str of assignments2 is
  signal sig_2_o0 : std_logic;
begin
  sig_2_o0 <= '0';
  OUTPUT <= sig_2_o0;
end architecture str;

だから基本的に、私は出力がもっと似ていると思っていたでしょう

architecture str of assignments2 is
  signal sig_2_o0 : std_logic;
begin
  sig_2_o0 <= '0';
  sig_2_o0 <= '1';
  OUTPUT <= sig_2_o0;
end architecture str;

しかし、それがVHDLで何を意味するのか/すべきかはわかりません。

4

1 に答える 1

3

問題は、シグナルを割り当てるために複数の非ブロッキングステートメントを使用していることです。

  sig_2_o0 <= '0';
  sig_2_o0 <= '1';

これは次のように解釈されます。

at next event assign '0' to sig_2_o0.
at next event assign '1' to sig_2_o0.

これは、ブロッキング割り当てを使用する場合とは異なります。

  sig_2_o0 := '0';
  sig_2_o0 := '1';

これは次のように解釈されます:

assign '0' to sig_2_o0.
assign '1' to sig_2_o0.

割り当てのブロック

ブロッキング割り当てを使用する場合、値は明確に定義されます。最初に「0」に設定され、次に「1」でオーバーライドされます。この例では、シミュレーションまたは合成されたハードウェアのいずれに対しても、最初のブロッキング割り当てによる影響はありません。最初の割り当てと2番目の割り当ての間に0の遅延があると考えることができます。これは、幅が0のパルスがあることを意味しますが、実際には何もありません。これは、最初の割り当てを完全に省略して、最後の割り当てだけを持つことと同じです。注意点の1つは、割り当てに遅延を設定した場合、たとえば「1 ns後」の場合、シミュレーションで最初の割り当てに続いて2番目の割り当てに気付くということです。ハードウェアでは、遅延は無視されるため、遅延を追加しても変更はありません。実際、合成を目的としたRTLに遅延を挿入することは、この理由から強くお勧めしません。

非ブロッキング割り当て

ただし、非ブロッキング割り当てを使用する場合、シミュレーターには次のタイムイベント用にスケジュールされた2つの割り当てがあります。信号を「1」に設定すると同時に、「0」に設定します。では、シグナルはどのスケジュールされた割り当てを取りますか?知る方法はありません。誤って割り当てられているため、どちらの値でもかまいません。地球上のすべてのリントチェッカーと合成ツールは、このような複数の非ブロッキング割り当てに遭遇したときにエラーをスローする必要があります。それをシミュレートすることは可能かもしれませんが、RTLには明らかに問題があります。

于 2013-07-08T09:44:25.957 に答える