J
John Providenza
Guest
I'm using XST for synthesis and I'm seeing an odd timing failure
from PAR with a 19 bit counter. The counter code is:
reg [19:1] rd_addr; // read port
wire [19:1] rd_addr_preload;
// handle ram address counter
assign rd_addr_preload = (repeat_done) ? next_wave_addr :
cur_wave_addr ;
always @(posedge clk_mem)
if (next_instr)
rd_addr <= rd_addr_preload ;
else if (rd_req_i)
rd_addr <= rd_addr + 1'b1;
The signal "next_wave_addr" comes from the output of a block ram and
is used
to broadside load the counter. Also note that "cur_wave_addr" could
load
the counter, but it's not in the critical path.
For some reason, PAR traces "next_wave_addr" though the carry chain as
a critical path. This seems wrong. I'm scheptical that bit 4 of the
broadside load data should ripple into bit 18 of the counter.
Here's the PAR timing info:
Slack: -0.008ns
Source: Mram_program_inst_ramb_21.B (RAM)
Destination: rd_addr_73 (FF)
Requirement: 5.999ns
Data Path Delay: 5.894ns (Levels of Logic = 9)
Clock Path Skew: -0.113ns
Source Clock: clk_mem rising at 1.172ns
Destination Clock: clk_mem rising at 7.171ns
Clock Uncertainty: 0.000ns
Data Path: Mram_program_inst_ramb_21.B to upatgen/rd_addr_73
Location Delay type Delay(ns) Physical
Resource
Logical
Resource(s)
-------------------------------------------------
-------------------
RAMB16_X5Y6.DOB1 Tbcko 1.500
Mram_program_inst_ramb_21
Mram_program_inst_ramb_21.B
SLICE_X36Y49.F2 net (fanout=2) 1.711 seq_rd_data<77>
SLICE_X36Y49.X Tilo 0.288
rd_addr_preload<4>
Mmux_rd_addr_preload_Result<3>1
SLICE_X34Y48.F3 net (fanout=1) 0.262
rd_addr_preload<4>
SLICE_X34Y48.COUT Topcyf 0.744 rd_addr<4>
rd_addr_inst_lut3_911
rd_addr_inst_cy_125
rd_addr_inst_cy_126
SLICE_X34Y49.CIN net (fanout=1) 0.000
rd_addr_inst_cy_126
SLICE_X34Y49.COUT Tbyp 0.083 rd_addr<6>
rd_addr_inst_cy_127
rd_addr_inst_cy_128
SLICE_X34Y50.CIN net (fanout=1) 0.000
rd_addr_inst_cy_128
SLICE_X34Y50.COUT Tbyp 0.083 rd_addr<8>
rd_addr_inst_cy_129
rd_addr_inst_cy_130
SLICE_X34Y51.CIN net (fanout=1) 0.000
rd_addr_inst_cy_130
SLICE_X34Y51.COUT Tbyp 0.083 rd_addr<10>
rd_addr_inst_cy_131
rd_addr_inst_cy_132
SLICE_X34Y52.CIN net (fanout=1) 0.000
rd_addr_inst_cy_132
SLICE_X34Y52.COUT Tbyp 0.083 rd_addr<12>
rd_addr_inst_cy_133
rd_addr_inst_cy_134
SLICE_X34Y53.CIN net (fanout=1) 0.000
rd_addr_inst_cy_134
SLICE_X34Y53.COUT Tbyp 0.083 rd_addr<14>
rd_addr_inst_cy_135
rd_addr_inst_cy_136
SLICE_X34Y54.CIN net (fanout=1) 0.000
rd_addr_inst_cy_136
SLICE_X34Y54.COUT Tbyp 0.083 rd_addr<16>
rd_addr_inst_cy_137
rd_addr_inst_cy_138
SLICE_X34Y55.CIN net (fanout=1) 0.000
rd_addr_inst_cy_138
SLICE_X34Y55.Y Tciny 0.891 rd_addr<18>
rd_addr_inst_cy_139
rd_addr_inst_sum_135
SLICE_X34Y55.DY net (fanout=1) 0.000
rd_addr_inst_sum_135
SLICE_X34Y55.CLK Tdyck 0.000 rd_addr<18>
rd_addr_73
-------------------------------------------------
---------------------------
Total 5.894ns (3.921ns logic, 1.973ns
route)
(66.5% logic, 33.5% route)
Any ideas?
Thanks!
John Providenza
from PAR with a 19 bit counter. The counter code is:
reg [19:1] rd_addr; // read port
wire [19:1] rd_addr_preload;
// handle ram address counter
assign rd_addr_preload = (repeat_done) ? next_wave_addr :
cur_wave_addr ;
always @(posedge clk_mem)
if (next_instr)
rd_addr <= rd_addr_preload ;
else if (rd_req_i)
rd_addr <= rd_addr + 1'b1;
The signal "next_wave_addr" comes from the output of a block ram and
is used
to broadside load the counter. Also note that "cur_wave_addr" could
load
the counter, but it's not in the critical path.
For some reason, PAR traces "next_wave_addr" though the carry chain as
a critical path. This seems wrong. I'm scheptical that bit 4 of the
broadside load data should ripple into bit 18 of the counter.
Here's the PAR timing info:
Slack: -0.008ns
Source: Mram_program_inst_ramb_21.B (RAM)
Destination: rd_addr_73 (FF)
Requirement: 5.999ns
Data Path Delay: 5.894ns (Levels of Logic = 9)
Clock Path Skew: -0.113ns
Source Clock: clk_mem rising at 1.172ns
Destination Clock: clk_mem rising at 7.171ns
Clock Uncertainty: 0.000ns
Data Path: Mram_program_inst_ramb_21.B to upatgen/rd_addr_73
Location Delay type Delay(ns) Physical
Resource
Logical
Resource(s)
-------------------------------------------------
-------------------
RAMB16_X5Y6.DOB1 Tbcko 1.500
Mram_program_inst_ramb_21
Mram_program_inst_ramb_21.B
SLICE_X36Y49.F2 net (fanout=2) 1.711 seq_rd_data<77>
SLICE_X36Y49.X Tilo 0.288
rd_addr_preload<4>
Mmux_rd_addr_preload_Result<3>1
SLICE_X34Y48.F3 net (fanout=1) 0.262
rd_addr_preload<4>
SLICE_X34Y48.COUT Topcyf 0.744 rd_addr<4>
rd_addr_inst_lut3_911
rd_addr_inst_cy_125
rd_addr_inst_cy_126
SLICE_X34Y49.CIN net (fanout=1) 0.000
rd_addr_inst_cy_126
SLICE_X34Y49.COUT Tbyp 0.083 rd_addr<6>
rd_addr_inst_cy_127
rd_addr_inst_cy_128
SLICE_X34Y50.CIN net (fanout=1) 0.000
rd_addr_inst_cy_128
SLICE_X34Y50.COUT Tbyp 0.083 rd_addr<8>
rd_addr_inst_cy_129
rd_addr_inst_cy_130
SLICE_X34Y51.CIN net (fanout=1) 0.000
rd_addr_inst_cy_130
SLICE_X34Y51.COUT Tbyp 0.083 rd_addr<10>
rd_addr_inst_cy_131
rd_addr_inst_cy_132
SLICE_X34Y52.CIN net (fanout=1) 0.000
rd_addr_inst_cy_132
SLICE_X34Y52.COUT Tbyp 0.083 rd_addr<12>
rd_addr_inst_cy_133
rd_addr_inst_cy_134
SLICE_X34Y53.CIN net (fanout=1) 0.000
rd_addr_inst_cy_134
SLICE_X34Y53.COUT Tbyp 0.083 rd_addr<14>
rd_addr_inst_cy_135
rd_addr_inst_cy_136
SLICE_X34Y54.CIN net (fanout=1) 0.000
rd_addr_inst_cy_136
SLICE_X34Y54.COUT Tbyp 0.083 rd_addr<16>
rd_addr_inst_cy_137
rd_addr_inst_cy_138
SLICE_X34Y55.CIN net (fanout=1) 0.000
rd_addr_inst_cy_138
SLICE_X34Y55.Y Tciny 0.891 rd_addr<18>
rd_addr_inst_cy_139
rd_addr_inst_sum_135
SLICE_X34Y55.DY net (fanout=1) 0.000
rd_addr_inst_sum_135
SLICE_X34Y55.CLK Tdyck 0.000 rd_addr<18>
rd_addr_73
-------------------------------------------------
---------------------------
Total 5.894ns (3.921ns logic, 1.973ns
route)
(66.5% logic, 33.5% route)
Any ideas?
Thanks!
John Providenza