为什么 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 变量声明),
  • 1'b 1A 等于 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,因此整个电路等效于一个简单的硬连线常数?只有初始值为零时才需要触发器吗?

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...