为什么Yosys将顺序语句合成为常量



我有下面的Verilog语句:

module test (A,B, CLK);
input  A, CLK;
output B;
always@(posedge CLK) 
if(A) B <= 1'b1;
endmodule

我在等收银机。然而,在我与Yosys合成后,我得到了如下结果:

assign B = 1'b1;

我不明白为什么Yosys把上面的Verilog语句翻译成一个常量1。

请指点,谢谢!

您的B有两个可能的值:

  • 1'b x在初始化时(详见IEEE Std 1364 4.2.2变量声明),
  • A=1'b 1
  • 1'b 1

实际上只有一个值。这意味着你可以优化它硬连线1'b 1

这不是Yosys的错误。所有(或几乎所有)合成软件的行为都是一样的。如果你想让它工作(如果我猜你想要什么),你必须允许B采取两个不同的值。您可以通过初始值等于1'b 0或重置为1'b 0来实现。

我建议使用reset而不是初始值,因为初始值可以作为A连接到寄存器的设置引脚来实现。

有趣!我注意到,如果你给寄存器分配一个初始值为零(例如output reg B = 1'b0),你会得到一个触发器。(我用的是read_verilog <your_code.v> ; synth ; show.)

然而,初始值1仍然会产生您提到的恒定输出。所以也许这里发生的事情(我只是猜测)是,当没有给出初始值时,yosys可以自由选择自己的初始值,在这种情况下,它选择1'b1,因此整个电路相当于一个简单的硬连接常数?只有当初始值为零时才需要触发器?

最新更新