合成期间创建额外的 regs
Extra regs being created during synthesis
假设我在设计中有 2 个多位寄存器。它们都有一个共同的条件 (cond_x
) 作为它们的使能,但其中一个有一个额外的条件 (cond_y
) 除了 reset
信号,当它意味着被重置时。
示例(为简单起见忽略代码的重置部分)-
同样总是阻塞
always @(posedge clock) begin
if(cond_x) begin
a <= a_next;
b <= b_next;
else if(cond_y) begin
b <= 5'b0;
end
end
不同总是块
always @(posedge clock) begin
if(cond_x) begin
a <= a_next;
end
end
always @(posedge clock) begin
if(cond_x) begin
b <= b_next;
else if(cond_y) begin
b <= 5'b0;
end
end
当我合成 2 时,我得到的 regs 数量比设计中预期的要多。使用 1 是准确的。额外的 regs 仅用于 b
的低两位,并以 __rep1
为后缀。不确定这意味着什么或它是如何创建的。
有什么可能的原因吗?我正在使用 Synopsys DC
Design Compiler 可以复制单元以改进时序、负载等,并且复制的单元获得后缀 _rep<n>
。 DC Ultra的datasheet有如下解释:
DC Ultra looks at a larger subsection of the critical path during
logic duplication and can replicate many gates to reduce load of high
fan-out nets, hence improving timing on critical paths through load
isolation.
尽管这两个代码片段看起来相同,但 DC 会根据起始条件产生不同的结果。很可能第二个代码被合成为 b[1:0]
更糟糕的电路,该工具必须复制这两个触发器。
假设我在设计中有 2 个多位寄存器。它们都有一个共同的条件 (cond_x
) 作为它们的使能,但其中一个有一个额外的条件 (cond_y
) 除了 reset
信号,当它意味着被重置时。
示例(为简单起见忽略代码的重置部分)-
同样总是阻塞
always @(posedge clock) begin if(cond_x) begin a <= a_next; b <= b_next; else if(cond_y) begin b <= 5'b0; end end
不同总是块
always @(posedge clock) begin if(cond_x) begin a <= a_next; end end always @(posedge clock) begin if(cond_x) begin b <= b_next; else if(cond_y) begin b <= 5'b0; end end
当我合成 2 时,我得到的 regs 数量比设计中预期的要多。使用 1 是准确的。额外的 regs 仅用于 b
的低两位,并以 __rep1
为后缀。不确定这意味着什么或它是如何创建的。
有什么可能的原因吗?我正在使用 Synopsys DC
Design Compiler 可以复制单元以改进时序、负载等,并且复制的单元获得后缀 _rep<n>
。 DC Ultra的datasheet有如下解释:
DC Ultra looks at a larger subsection of the critical path during logic duplication and can replicate many gates to reduce load of high fan-out nets, hence improving timing on critical paths through load isolation.
尽管这两个代码片段看起来相同,但 DC 会根据起始条件产生不同的结果。很可能第二个代码被合成为 b[1:0]
更糟糕的电路,该工具必须复制这两个触发器。