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

Why Yosys synthesis the sequential statement to constant

我有下面的 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。

请指教,谢谢!

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

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

您的 B 有两个可能的值:

  • 1'b x 初始化期间(更多内容在 IEEE Std 1364 4.2.2 变量声明中),
  • 1'b 1A 等于 1'b 1.

你真的只有一个价值。这意味着您可以将其优化为硬连线 1'b 1.

这不是 Yosys 的故障。所有(或几乎所有)综合软件的行为方式相同。如果你想让它工作(如果我猜你想要什么),你必须允许 B 取两个不同的值。您可以通过等于 1'b 0 的初始值或重置为值 1'b 0.

来实现

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