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