First, it's really not failing by much -- you got under 7 ns, so it's *almost* there.
Two suggestions: 1. If the input/output of the block does not go directly into axi_wrapper, try adding an axi_flop at the end to insert a one-cycle delay. This could break up a critical path if you have a few "0-delay" blocks in a row. If this goes into axi_wrapper, it should probably be fine 2. This is a smoking gun: `(vector_cnt == (of_n-1)*keep_m)` See if you can find a way around the multiply operation and I expect it will work just fine. EJ On Thu, Nov 8, 2018 at 9:47 AM Jason Matusiak <ja...@gardettoengineering.com> wrote: > Gents, thanks for the input. I actually found the section I needed in the > timing report just before you guys wrote (I hate trying to sift through > those). It is indeed my block that is causing issues. I was getting ready > to try to break out my testbench and start playing with it by adding some > registers to see if that helps (the testbench worked before, so I won't > know if this helps timing, but I could at least make sure I didn't break > anything. > > Excellent point on the clock differences. I was stuck down a rabbit hole > as to why the E310 would be fine, but not the X310, but that makes sense. > I was just getting lucky I guess at the slower clock rates. > > Here is the relevant timing issue: > > > --------------------------------------------------------------------------------------------------- > From Clock: ce_clk > To Clock: ce_clk > > Setup : 8006 Failing Endpoints, Worst Slack -2.711ns, Total Violation > -4376.156ns > Hold : 0 Failing Endpoints, Worst Slack 0.035ns, Total Violation 0.000ns > PW : 0 Failing Endpoints, Worst Slack 1.565ns, Total Violation 0.000ns > > --------------------------------------------------------------------------------------------------- > > > Max Delay Paths > > -------------------------------------------------------------------------------------- > Slack (VIOLATED) : -2.711ns (required time - arrival time) > Source: x300_core/inst_keepMinN/sr_n/out_reg[2]_replica/C > (rising edge-triggered cell FDRE clocked by ce_clk {rise@0.000ns > fall@2.333ns period=4.667ns}) > Destination: x300_core/inst_keepMinN/keepMinN/vector_cnt_reg[12]/R > (rising edge-triggered cell FDRE clocked by ce_clk {rise@0.000ns > fall@2.333ns period=4.667ns}) > Path Group: ce_clk > Path Type: Setup (Max at Slow Process Corner) > Requirement: 4.667ns (ce_clk rise@4.667ns - ce_clk rise@0.000ns) > Data Path Delay: 6.966ns (logic 5.340ns (76.654%) route 1.626ns (23.346%)) > Logic Levels: 10 (CARRY4=5 DSP48E1=2 LUT1=1 LUT3=1 LUT5=1) > Clock Path Skew: -0.053ns (DCD - SCD + CPR) > Destination Clock Delay (DCD): -1.659ns = ( 3.008 - 4.667 ) > Source Clock Delay (SCD): -2.028ns > Clock Pessimism Removal (CPR): -0.422ns > Clock Uncertainty: 0.054ns ((TSJ^2 + DJ^2)^1/2) / 2 + PE > Total System Jitter (TSJ): 0.071ns > Discrete Jitter (DJ): 0.082ns > Phase Error (PE): 0.000ns > > (and it continues with more stuff that I don't think is particularly > useful). > > > > So, it is plain to see that something I am doing inside my block is very > stupid (though accomplishes what I wanted. I can post the code, so maybe > someone can spot the issue (I really think it is a registering problem that > I need to do on the output side). Please excuse the simplicity of the > code, I needed to through something together VERY fast, and instead of > being elegant, I went with easy to code up. > > > > The block's title is a little misleading, it basically keeps M vectors out > of N vectors. So if the vector size is 512, and M==2 and N==10. I will > pass through 1024 samples, and then dump the next 4096 samples. Then wash, > rinse, repeat. The verilog is attached since I was having trouble keeping > formatting when I pasted it here. > > > > > > > --------- Original Message --------- > Subject: Re: [USRP-users] rfnoc build works for E310, doesn't meet timing > with X310 > From: "EJ Kreinar" <ejkrei...@gmail.com> > Date: 11/8/18 9:09 am > To: "Jason Matusiak" <ja...@gardettoengineering.com> > Cc: "USRP-users@lists.ettus.com" <usrp-users@lists.ettus.com> > > Hi Jason, > > That actually makes sense to me... Bus clk on the e310 is usually 50 MHz > if I remember correctly (and if it didn't change), and the max radio_clk is > something like 64ish MHz. > > Max clock rates on the x310 are, I believe, more like 200-215 MHz. So > logic in the x310 nominally needs to settle within 5 ns while logic on the > e310 can have a luxurious 15-20 ns. Xilinx will try very hard to optimize > timing and the build for x310 could take a LONG time. > > If you can access the timing report, it will often show critical paths, > but the text report is often unintelligible to me. I have also built in GUI > mode before (like setting up a ILA core) because the Vivado interface for > organizing and understanding timing failures are actually pretty helpful. > > I'd also suggest, if you'd like some verilog input, to send the relevant > code you think might continue to the timing errors, and we can take a look > for ideas? It could potentially lead to a quick solution if you're up for > it. A MaxNinM block sounds like it could easily contribute to poor timing > depending on the implementation. > > EJ > > > On Thu, Nov 8, 2018, 8:11 AM Jason Matusiak via USRP-users < > usrp-users@lists.ettus.com wrote: > >> OK, this has befuddled me for 3 days and I can't seem to get past it. I >> have a prefix that seems to work fine. >> >> Here are my working steps for building a bitfile on an E310: >> cd /opt/gnuradio/e300/src/uhd/fpga-src/usrp3/tools/scripts >> >> source ../../top/e300/setupenv.sh >> >> ./uhd_image_builder.py keepMinN ddc split_stream axi_fifo_loopback -d >> e310 -t E310_RFNOC_sg3 -I /opt/gnuradio/e300/src/rfnoc-nocblocks >> >> This build and runs fine. keepMinN is a small custom block I made that >> doesn't use much resources and has been working fine for weeks. >> >> Now, if I open a new terminal and run this: >> >> cd /opt/gnuradio/e300/src/uhd/fpga-src/usrp3/tools/scripts >> source ../../top/x300/setupenv.sh >> ./uhd_image_builder.py keepMinN ddc ddc split_stream axi_fifo_loopback -d >> x310 -t X310_RFNOC_XG -I /opt/gnuradio/e300/src/rfnoc-nocblocks -m 5 >> >> it never seems to meet timing. Now, I have done this with and without >> the "-m" directive, that doesn't seem to matter. The only real difference >> in the command is the second ddc block. >> >> So what the heck could be causing these issues? If anything, I would >> have expected the X310 build to be fine and the E310 to not meet timing. >> Another odd thing (though I am chalking it up to the X310 doing more) is >> that the X310 build is taking A LOT longer. I don't recall it taking this >> long before, but I am not sure. >> >> It tell me to look at the report_timing_summary, but it hasn't updated >> yet (it keeps running for a bit after throwing the timing warning). If I >> remember though, I think that the issue it had was with the ce_clk for some >> reason. >> _______________________________________________ >> USRP-users mailing list >> USRP-users@lists.ettus.com >> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com > >
_______________________________________________ USRP-users mailing list USRP-users@lists.ettus.com http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com