我有一个always
块,看起来像这样
reg [31:0] r1;
always @(posedge clk)
if(condition) begin
r1<=32'hcafecafe;
end
条件为假时r1
会发生什么?
它被合成了什么?
答案 0 :(得分:1)
我尝试了两种不同的合成器,并且都将您的代码合成为
reg [31:0] r1 = 32'hcafecafe;
这不是我所期望的,因为此代码与完全的行为方式与RTL相同。在您的RTL中,r1
在condition
高的第一个时钟边缘之前将是未知的,因此它将取值32'hcafecafe
。在第一个时钟边沿之前,合成输出已经具有值32'hcafecafe
。我原本期望合成器输出为32个D型触发器,其输入连接到32'hcafecafe
。
答案 1 :(得分:1)
这里的问题是你没有设置任何重置条件。 你的代码说如果条件为真,r1应该是32'hcafecafe。如果仔细考虑一下,如果将r1固定为32'hcafecafe,该工具就会完成你告诉它的工作。
正确的代码是这样的:
reg [31:0] r1;
always @(posedge clk)
if (sync_reset_b == 1) //synchronous reset
r1<=32'h0; // or whatever you want it to be.
else if(condition) begin
r1<=32'hcafecafe;
end