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 | ? .
私が混乱している理由は、regとvarがフルクロックサイクルで定義されているためです。したがって、に基づいて分岐し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で何を意味するのか/すべきかはわかりません。