Answers Database


1.5i, 2.1i XC4000XL PAR - Router duplicates registers for use as output to output route-thrus.


Record #3813

Product Family: Software

Product Line: FPGA Implementation

Product Part: par

Product Version: 1.4.

Problem Title:

1.5i, 2.1i XC4000XL PAR - Router duplicates registers for use as output to output route-thrus.



Problem Description:
PAR will sometimes duplicate flops to drive seperate
sections of a net. This is considered an output to
output route-thru. This is a problem when the input
net is asynchronous, there is a chance that the
flops will be clocked while the input is changing and the
two flops could end up in different states.



Solution 1:

An environment variable (CM_EXCLUDE_XQYQ) has been
created that disables the use of CLB Flop outputs
for output to output route-thrus.

This feature is available in all versions of M1.5.

To set the variable:
setenv CM_EXCLUDE_XQYQ (work stations)
set CM_EXCLUDE_XQYQ=TRUE (PCs)



Solution 2:

The following perl script can be used to detected occurrances of duplicated
registers in XC4000X* designs. The routed .ncd file is used as a command
line argument. A valid Xilinx environment must be present for the script to run successfully. It may be necessary to modify the first line to the correct location perl5 on your system.

Sample output:
      swissx [186] dup_flop.pl test.ncd

      A register has been replicated for net "DONE",
      which is driven by CLB "ACTIVE_N" at site CLB_R9C14.

dup_flop.pl:

#!/usr/local/bin/perl5

@ncd_root=split(/\./,$ARGV[0]);
`xdl -nopips -ncd2xdl $ncd_root[0]`;

open (FILE,"$ncd_root[0].xdl");
while(<FILE>){
   chomp;
   @fields=split(/\s+/);
   if ($fields[0] eq "inst" && $fields[2] eq "CLB"){
      $comp_name=$fields[1];
      $site_name=$fields[6];
   }

   if (/ROUTETHROUGH-XQ-YQ/) {

      open (FILE2,"$ncd_root[0].xdl");
      while(<FILE2>){
        chomp;
        @fields2=split(/\s+/);
        if ($fields2[0] eq "net") {
        $net=$fields2[1];
        }
        if ($fields2[1] eq "outpin" && $fields2[2] eq $comp_name && ($fields2[3] eq "YQ" || $fields2[
3] eq "XQ")) {
           $net_name=$net;
        }
      }

   print "\n";
   print "A register has been replicated for net $net_name,\n";
   print "which is driven by CLB $comp_name at site $site_name.\n";
   print "\n";

   }
}

exit;





End of Record #3813 - Last Modified: 01/05/00 10:46

For the latest news, design tips, and patch information on the Xilinx design environment, check out the Technical Tips!