问题描述
我有下面的 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 变量声明), -
1'b 1
当A
等于1'b 1
。
你真的只有一个价值。这意味着您可以将其优化为硬连线 1'b 1
。
这不是 Yosys 的错误。所有(或几乎所有)综合软件的行为方式都相同。如果你想让它工作(如果我猜你想要什么),你必须允许 B
取两个不同的值。您可以通过等于 1'b 0
的初始值或重置为值 1'b 0
来实现。
我建议使用重置而不是初始值,因为初始值可以实现为 A
连接到寄存器的设置引脚。
有趣!我注意到,如果您为寄存器分配初始值零(例如 output reg B = 1'b0
),您确实会得到一个触发器。 (我使用了 read_verilog <your_code.v> ; synth ; show
。)
但是,初始值 1 仍然会产生您提到的恒定输出。所以也许这里发生的事情(我只是推测)是当没有给出初始值时,yosys 可以自由选择它自己的,在这种情况下它选择 1'b1
,因此整个电路等效于一个简单的硬连线常数?只有初始值为零时才需要触发器吗?