为什么 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 1
当 A
等于 1'b 1
.
你真的只有一个价值。这意味着您可以将其优化为硬连线 1'b 1
.
这不是 Yosys 的故障。所有(或几乎所有)综合软件的行为方式相同。如果你想让它工作(如果我猜你想要什么),你必须允许 B
取两个不同的值。您可以通过等于 1'b 0
的初始值或重置为值 1'b 0
.
来实现
我建议使用重置而不是初始值,因为初始值可以实现为 A
连接到寄存器的设置引脚。
我有下面的 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 1
当A
等于1'b 1
.
你真的只有一个价值。这意味着您可以将其优化为硬连线 1'b 1
.
这不是 Yosys 的故障。所有(或几乎所有)综合软件的行为方式相同。如果你想让它工作(如果我猜你想要什么),你必须允许 B
取两个不同的值。您可以通过等于 1'b 0
的初始值或重置为值 1'b 0
.
我建议使用重置而不是初始值,因为初始值可以实现为 A
连接到寄存器的设置引脚。