Hello RapidWright
(RW) Community,
I am attempting to use the ftm_gpo/i pins from the Zynq as a low overhead
mechanism to stimulate my RW module instances. If successful, this example
would be largely useful to the community as there's no existing RW examples
that I could find that demonstrate a low overhead option to stimulate our DUTs.
Unfortunately, what I thought would be relatively simple has become a rather
complex issue.
Below is a
screenshot of the Zynq US+ block diagram and the block diagram of example
module instance design, slice_0, that I am attempting to connect via RW. In
addition, I have included the RW java code to load the zynq design, place the
slice module, make the connections, and save the result. In this example, I am
attempting to connect a subset of the zynq_o ports to I on slice_0 and slice_0
o output to zynq_i. What appears to be occurring is that by default, the
ftm_gpo/I connections are routed to pins by default by Vivado as shown in the
zynq_example.dcp. This results in additional connections to these pins
unroutable as there is no viable routing path from the pad output when attempting to route the design in Vivado. I've
attempted to circumvent this issue by creating a zynq design that has an
intermediary dummy input between the ftm_gpo/I connection but this approach
results in complex hierarchical connection modifications that I have yet to get
working (despite trying to follow the connectAcrossHierarchy method found in a
previous post). With that being said, does anyone have any thoughts as to how
best I could resolve this issue? I've included all the .dcp files,
zynq_example.dcp (the base design), example (slice_0), and zynq_test.dcp (the
output design) at the following link: https://drive.google.com/drive/folders/1PsbB70Bq1yFRDAWu-gEQhsgSplUgc16x?usp=sharing
public void Run_RW() {
System.out.println("Working Directory = " + System.getProperty("user.dir"));
String designName = "zynq_example.dcp";
String designEdif = "zynq_example.edif";
Design design = Design.readCheckpoint(designName, designEdif);
Device device = design.getDevice();
EDIFNetlist netlist = design.getNetlist();
EDIFCell top = design.getTopEDIFCell();
ModuleImpls modules = new ModuleImpls();
String[] slice_name = {"example"};
com.xilinx.rapidwright.design.Module m = new Module(Design.readCheckpoint("example.dcp", CodePerfTracker.SILENT), "example_0_metadata.txt");
m.setName("example");
m.getNetlist().changeTopName("example");
m.getNetlist().renameNetlistAndTopCell("example");
modules.add(m);
m.calculateAllValidPlacements(m.getDevice());
netlist.migrateCellAndSubCells(m.getNetlist().getTopCell());
ModuleInst mi = null;
Site[] sliceSites = device.getAllSitesOfType(SiteTypeEnum.SLICEL);
for(Site site: sliceSites) {
if(m.isValidPlacement(site, design.getDevice(), design)) {
mi = design.createModuleInst("slice_0_1", m);
mi.getCellInst().setCellType(m.getNetlist().getTopCell());
mi.place(site);
break;
}
}
mi.connect("o", "zynq_i", 0);
mi.connect("i", "zynq_o", 0);
System.out.println("Write output file");
design.writeCheckpoint("zynq_test.dcp", CodePerfTracker.SILENT);
}
Please note that Vivado 2020.2 & RW 2020.2.2 were used for this process.
Thank you in advance
for your assistance!
Best,
MC
I implemented the fix you suggested which does correct the output connection issues as shown in the image below; however, it doesn't resolve the second issue where the signal remain unroutable despite Vivado indicating the Route status is `Routable but not routed`. I've included the RW output dcp after executing the `route_design` command in Vivado. I've also attempting to select the individual To confirm this wasn't a visual bug in Vivado, I executed the report_route_status command and a find query to for routes labeled as unrouted which showed that indeed these nets are not routed. This was done using Vivado 2020.2 on Linux X86, and the problem .dcp been uploaded here for review: https://drive.google.com/file/d/1MIy29735EZmyQKVci_Cy5MBZc3k_ChrO/view?usp=sharing
Please let me know
if you have any suggestions for next steps or what additional information I
should provide to assist in debugging.
Thanks,
MC