以下是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。
请指教,谢谢!
发布于 2021-07-29 15:46:36
您的B有两个可能的值:
初始化期间的
1'b x (更多见IEEESTD13644.2.2变量声明),1'b 1时A等于1'b 1.你真的只有一个价值。这意味着您可以优化它到硬连线1'b 1。
这不是尤西的错。所有(或几乎所有)综合软件的行为都是一样的。如果您想让它工作(如果我猜您想要什么),您必须允许B接受两个不同的值。您可以通过等于1'b 0的初始值或将其重置为值1'b 0来完成此操作。
我建议使用重置代替初始值,因为初始值可以实现为A连接到寄存器的设置引脚。
发布于 2021-07-29 12:39:32
有意思的!我注意到,如果将初始值为零分配给寄存器(例如output reg B = 1'b0),则会得到触发器。(我用的是read_verilog <your_code.v> ; synth ; show。)
但是,初始值1仍然会产生您提到的常量输出。所以,这里发生的事情(我只是推测)是,当一个初值没有给定时,你可以自由选择它自己的,在这种情况下,它选择1'b1,这样整个电路就相当于一个简单的硬连线常数?只有当初始值为零时,才需要触发器?
https://stackoverflow.com/questions/68567807
复制相似问题