我在理解Kansas Lava当一个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
但实际上并没有,第二个任务也没有被考虑在内:
*Main> takeS 10 foo :: Seq Bool
low | low | low | low | low | low | low | low | low | low | ? .
我感到困惑的原因是reg
和var
的定义基于完整的时钟周期,因此我无法执行无法综合的操作,例如基于r
进行分支,然后重新分配一个新值给它。那么为什么这种第二种形式不起作用呢?
这不仅是模拟问题:第二个版本生成的VHDL
清楚地显示第二个赋值在生成时被抛弃:
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中这意味着什么。