如何解决为什么 Yosys 将顺序语句合成为常量
我有下面的 Verilog 声明:
module test (A,B,CLK);
input A,CLK;
output B;
always@(posedge CLK)
if(A) B <= 1'b1;
endmodule
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
,因此整个电路等效于一个简单的硬连线常数?只有初始值为零时才需要触发器吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。