合成期间创建额外的 regs

Extra regs being created during synthesis

假设我在设计中有 2 个多位寄存器。它们都有一个共同的条件 (cond_x) 作为它们的使能,但其中一个有一个额外的条件 (cond_y) 除了 reset 信号,当它意味着被重置时。

示例(为简单起见忽略代码的重置部分)-

  1. 同样总是阻塞

    always @(posedge clock) begin
      if(cond_x) begin
        a <= a_next;
        b <= b_next;
      else if(cond_y) begin
        b <= 5'b0;
      end
    end
    
  2. 不同总是块

    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] 更糟糕的电路,该工具必须复制这两个触发器。