Maximo Balestrini
12/23/2021, 4:20 PMla_data_out
, wbs_dat_o
) into the mgmt_core, that help even out the difference in clocks to avoid hold violations. But it seems there are no delay cells on the user_irq
paths, and that is causing delay violations because of difference in clocks.
Taking a quick look at the mgmt_core.sdc
I see that is setting an input_delay of 1.0 to all the inputs (mprj_dat_i
, la_input
) but not the for the user_irqs, maybe that is the problem? Or is there a reason behind that?Matt Venn
12/23/2021, 4:28 PMKunal
12/23/2021, 5:12 PMMaximo Balestrini
12/23/2021, 6:05 PMmake caravel_timing
from the efabless/caravel repo, but adding the user_project_wrapper verilogs and spefs files to try to run STA on the whole chip, and see the issues that might arise from the mgmt_core <> user_project_wrapper paths
That `input_delay`I mentioned was used when they hardened the mgmt_core
, but I'm just using the results from that process, so in my analysis I think is not an in2reg case but a reg2reg case.
Here's the report for two inputs to the mgmt_core: user_irq[1]
(where the data changes a lot earlier than the clock) and from `wbs_dat_o[1]`( where the delays added to the mgmt_core makes the data change after the clock)
It seems they need to add the set input_delay 1.0000
for the user_irqs to the base.sdc of the mgmt_core so the flow adds the delays to even out the clocks (like they did on the other inputs mprj_dat_i
and la_input
)Maximo Balestrini
12/23/2021, 6:12 PMKunal
12/23/2021, 6:17 PMMaximo Balestrini
12/23/2021, 6:19 PM-0.69 7.60 clock reconvergence pessimism
Maximo Balestrini
12/23/2021, 6:23 PMcaravel_clk (net)
they both share, the path for the clock has a lot of clock tree cells that the data path doesn'tKunal
12/23/2021, 7:05 PMDinesh A
12/24/2021, 2:59 AMwbs_dat_o[*]
Typically interrupts (user_irq[*]
are consider as async, as there will be double sync logic inside the core before core consume it ..
I see double sync inside File: mgmt_core.v
Double Sync Logic:
multiregimpl131_regs0 <= user_irq[0];
multiregimpl131_regs1 <= multiregimpl131_regs0;
multiregimpl132_regs0 <= user_irq[1];
multiregimpl132_regs1 <= multiregimpl132_regs0;
multiregimpl133_regs0 <= user_irq[2];
multiregimpl133_regs1 <= multiregimpl133_regs0;
multiregimpl134_regs0 <= user_irq[3];
multiregimpl134_regs1 <= multiregimpl134_regs0;
multiregimpl135_regs0 <= user_irq[4];
multiregimpl135_regs1 <= multiregimpl135_regs0;
multiregimpl136_regs0 <= user_irq[5];
multiregimpl136_regs1 <= multiregimpl136_regs0;
Double Sync Status consumed by the core:
*assign gpioin0_in_status = multiregimpl131_regs1*;
assign gpioin1_in_status = multiregimpl132_regs1;
assign gpioin2_in_status = multiregimpl133_regs1;
assign gpioin3_in_status = multiregimpl134_regs1;
assign gpioin4_in_status = multiregimpl135_regs1;
assign gpioin5_in_status = multiregimpl136_regs1;
I see similar double sync for la_input[*] also ..
multiregimpl3_regs0 <= la_input[0];
multiregimpl3_regs1 <= multiregimpl3_regs0;
multiregimpl4_regs0 <= la_input[1];
multiregimpl4_regs1 <= multiregimpl4_regs0;
multiregimpl5_regs0 <= la_input[2];
multiregimpl5_regs1 <= multiregimpl5_regs0;
multiregimpl6_regs0 <= la_input[3];
multiregimpl6_regs1 <= multiregimpl6_regs0;
multiregimpl7_regs0 <= la_input[4];
multiregimpl7_regs1 <= multiregimpl7_regs0;
multiregimpl8_regs0 <= la_input[5];
multiregimpl8_regs1 <= multiregimpl8_regs0;
multiregimpl9_regs0 <= la_input[6];
I feel, effectively Wishbone interface only need to met w.r.t user_project_wrapper interface ..Maximo Balestrini
12/24/2021, 12:54 PMMaximo Balestrini
12/24/2021, 1:01 PM## FALSE PATHS (ASYNCHRONOUS INPUTS)
set_false_path -from [get_ports {resetb}]
set_false_path -from [get_ports mprj_io[*]]
set_false_path -from [get_ports gpio]
Dinesh A
12/24/2021, 2:04 PM