将大组合逻辑分解成小逻辑真的能减少延迟吗?
Does breaking large combinational logic into small logic really reduce the delay?
我想了解我朋友的verilog设计,他把大逻辑分解成小逻辑,他说这帮助他解决了时序问题。但是我不明白为什么,因为综合后就是一堆AND和OR门,逻辑是一样的,这怎么能减少延迟呢?
原代码如下:
assign state0 = ({104{d0_xq}} & markerState0[519:416]) |
({104{d1_xq}} & markerState1[519:416]) |
({104{d2_xq}} & markerState2[519:416]) |
({104{d3_xq}} & markerState3[519:416]);
assign state1 = ({104{d0_xq}} & markerState0[415:312]) |
({104{d1_xq}} & markerState1[415:312]) |
({104{d2_xq}} & markerState2[415:312]) |
({104{d3_xq}} & markerState3[415:312]);
assign state2 = ({104{d0_xq}} & markerState0[311:208]) |
({104{d1_xq}} & markerState1[311:208]) |
({104{d2_xq}} & markerState2[311:208]) |
({104{d3_xq}} & markerState3[311:208]);
assign state3 = ({104{d0_xq}} & markerState0[207:104]) |
({104{d1_xq}} & markerState1[207:104]) |
({104{d2_xq}} & markerState2[207:104]) |
({104{d3_xq}} & markerState3[207:104]);
assign state4 = ({104{d0_xq}} & markerState0[103:0]) |
({104{d1_xq}} & markerState1[103:0]) |
({104{d2_xq}} & markerState2[103:0]) |
({104{d3_xq}} & markerState3[103:0]);
always @(posedge clock) begin
state_xq <= {state0, state1, state2, state3, state4};
end
如果我使用有什么区别:
assign state = ({520{d0_xq}} & markerState0) |
({520{d1_xq}} & markerState1) |
({520{d2_xq}} & markerState2) |
({520{d3_xq}} & markerState3);
always @(posedge clock) begin
state_xq <= state;
end
如果它是某种 ASIC 技术您可以深入研究生成的网表并检查是否出于某种原因使用了不同的原语并因此实现了不同的时序,即使逻辑上两种结构都给出相同的结果。无论哪种方式,这都很奇怪,我不希望看到 STA 结果有显着差异,但我不是合成引擎方面的专家。
或者,工具应该允许您生成 reg-2-reg 报告,显示路径的确切细分,这应该揭示工具在何处应用不同的方法(例如,在哪个操作上)。
我想了解我朋友的verilog设计,他把大逻辑分解成小逻辑,他说这帮助他解决了时序问题。但是我不明白为什么,因为综合后就是一堆AND和OR门,逻辑是一样的,这怎么能减少延迟呢? 原代码如下:
assign state0 = ({104{d0_xq}} & markerState0[519:416]) |
({104{d1_xq}} & markerState1[519:416]) |
({104{d2_xq}} & markerState2[519:416]) |
({104{d3_xq}} & markerState3[519:416]);
assign state1 = ({104{d0_xq}} & markerState0[415:312]) |
({104{d1_xq}} & markerState1[415:312]) |
({104{d2_xq}} & markerState2[415:312]) |
({104{d3_xq}} & markerState3[415:312]);
assign state2 = ({104{d0_xq}} & markerState0[311:208]) |
({104{d1_xq}} & markerState1[311:208]) |
({104{d2_xq}} & markerState2[311:208]) |
({104{d3_xq}} & markerState3[311:208]);
assign state3 = ({104{d0_xq}} & markerState0[207:104]) |
({104{d1_xq}} & markerState1[207:104]) |
({104{d2_xq}} & markerState2[207:104]) |
({104{d3_xq}} & markerState3[207:104]);
assign state4 = ({104{d0_xq}} & markerState0[103:0]) |
({104{d1_xq}} & markerState1[103:0]) |
({104{d2_xq}} & markerState2[103:0]) |
({104{d3_xq}} & markerState3[103:0]);
always @(posedge clock) begin
state_xq <= {state0, state1, state2, state3, state4};
end
如果我使用有什么区别:
assign state = ({520{d0_xq}} & markerState0) |
({520{d1_xq}} & markerState1) |
({520{d2_xq}} & markerState2) |
({520{d3_xq}} & markerState3);
always @(posedge clock) begin
state_xq <= state;
end
如果它是某种 ASIC 技术您可以深入研究生成的网表并检查是否出于某种原因使用了不同的原语并因此实现了不同的时序,即使逻辑上两种结构都给出相同的结果。无论哪种方式,这都很奇怪,我不希望看到 STA 结果有显着差异,但我不是合成引擎方面的专家。
或者,工具应该允许您生成 reg-2-reg 报告,显示路径的确切细分,这应该揭示工具在何处应用不同的方法(例如,在哪个操作上)。