Verilog 在合成过程中创建额外的正则表达式

Verilog 在合成过程中创建额外的正则表达式,verilog,synthesis,Verilog,Synthesis,假设我在设计中有两个多位寄存器。它们都有一个共同的条件(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

假设我在设计中有两个多位寄存器。它们都有一个共同的条件(
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
    
    始终@(posedge时钟)开始
    如果(cond_x)开始
    
    设计编译器可以复制单元格以改进计时、加载等,复制的单元格得到后缀
    \u rep
    。DC Ultra的说明如下:

    DC Ultra在运行期间查看关键路径的较大部分 逻辑复制和可复制多个门,以减少高负载 扇出网络,从而改善通过负载的关键路径上的定时 隔离


    然而,这两个代码片段似乎是相同的,DC可能会根据启动条件产生不同的结果。最有可能的是,第二个代码被合成为
    b[1:0]
    的一个更糟糕的电路,工具必须复制这两个触发器。

    我不熟悉Synposys DC,但它可能是逻辑复制,以减少关键路径上的负载,从而改善时序。谢谢@ahmedus。您喜欢/推荐2种编码方式中的哪种?@kevin1494第1种编码较短,但第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