This website uses cookies. By using this site, you consent to the use of cookies. For more information, please take a look at our Privacy Policy.
Home > FPGA Technical Tutorials > FPGA-Based Prototyping Methodology > Partitioning and reconnecting > General partitioning overview

TABLE OF CONTENTS

Xilinx FPGA FPGA Forum

General partitioning overview

FONT SIZE : AAA

The quality of the partitioning can significantly affect the resulting system size and  performance, especially for large and complex SoC designs.  

As we saw in chapter 3, there are a number of approaches to partitioning giving us  the general choices of partitioning at the RT level before synthesis or at netlist-level  after synthesis. In either case, the same general guides for success apply.  Partitioning is performed in a number of stages and requires some advance  planning. The prime goal of partitioning is to organize blocks of the SoC design into  FPGAs in such a way as to balance FPGA utilization and minimize the interconnect  resources. Therefore we need to know details of both the size of the different design  blocks and also the interconnections between them. We shall consider that in a  moment.

Recommended approach to partitioning

Let’s now look at the recommended order in which we should partition the FPGA ready part of the design. Table 17 summarizes the steps to be taken during an  interactive approach. We will consider each in detail in the coming sections and  then go on to consider automated partitioning.

Major steps in interactive manual partitioning.png

Describing board resources to the partitioner 

In the meantime, we will already have an understanding of the board resources onto  which we will need to map the design. We know the size of the FPGAs and have a  complete list of the interconnection between them on our board. The partitioning  tool will need to have this information presented in the correct format and in the  case of the Synopsys Certify® tool, this is called a board description file and is  written in Verilog. An excerpt from a board description file is shown in Figure 104,  in which we can see clock traces, other traces and an instantiation of a Xilinx® LX760 FPGA.  

Figure 104: Excerpt from typical board description for partitioning purposes

. . . .

. . . .

/wire [11:1] A_GCLKO; / board traces

/wire [11:1] B_GCLKO; / board traces

/wire [11:1] C_GCLKO; / board traces

/wire [11:1] D_GCLKO; / board traces

/ wire [32:1] SMAP_A, SMAP_B, SMAP_C, SMAP_D;

/ board traces to each device

wire [1:1] A_RESET_n, B_RESET_n, C_RESET_n, D_RESET_n, RESET_n;

wire [1:1] A_RESET_INT_n, B_RESET_INT_n, C_RESET_INT_n, 

D_RESET_INT_n;


/ Inter-FPGA traces

wire [44:1] AB;

wire [29:1] AC;

wire [62:1] AD;

wire [62:1] BC;

wire [29:1] BD;

wire [65:1] CD;

. . . .

. . . .

/ Device A Virtex-6 LX760


XC6VLX760FF1760 uA (

.pin_AR8 ( A1_A[1] ), 

.pin_AT7 ( A1_A[2] ),

.pin_AM11 ( A1_A[3] ),

.pin_AN10 ( A1_A[4] ),

. . . .


It is not necessary to describe parts of the board that do not affect signal  connectivity, so items such as power rails, pull-up resistors, decoupling capacitors or FPGA configuration pins need not be included. It is most important that the  connectivity information is absolutely correct and if possible, the Verilog board  description should be obtained directly from the original board layout tool. A script  can be used to remove unwanted board items and to ensure correlation between the  traces on the board and the wires in the Verilog. 

Some boards and systems will have methods for generating this board description  automatically, reflecting any configurable features on the board or daughter cards  connected. For example, some systems have deferred interconnect or switched  interconnect, as discussed in chapter 6, and so the board description will need to  reflect the actual configuration of the board in our project. We will come back to  consider adjustable interconnect in a moment. 

Considering the area and interconnect requirements for the design as a logical  database, and the board description as a physical database, then our partitioning task  becomes a matter of mapping one onto the other and then joining up the pieces. If  we take a step-by-step approach to this, we should achieve maximum performance  in the shortest time.

Estimate area of each sub-block

In chapter 4 we used FPGA synthesis very early in the project in order to ascertain  how many FPGAs we need for our platform. For partitioning, we need to know the  size of each block to be partitioned in terms of the FPGA resources. We can do this  by analyzing the area report for the first-pass synthesis either manually or by using  grep and a small formatting script to create a block-by-block report. However,  partitioning tools usually make this process more productive, and provide a number  of ways to estimate the block area for LUTs, FFs and specific resources (e.g., RAM,  DSP blocks). Most importantly, the tools should also estimate the boundary IO for  each block and its connectivity to all other blocks.

Rather than running the full synthesis and mapping to achieve area estimates, we  can optionally perform a quick-pass run of the synthesis or a specific estimation  tool. For example the runtime vs accuracy trade-offs for the Certify tools are shown  in Table 18.  

The Certify tool can make these estimates, but more importantly, will also display  and use those estimates during the partitioning procedures, as we shall see in a  moment.

Options for resource estimation in the Certify tool.png

The result of estimation will yield values which are general very accurate for IO  count, but the area will probably be an over-estimate. However, a good by-product  of this over-estimation is that it encourages us to leave more room in our FPGAs.  The results of a quick-pass estimation may be displayed in many formats, including  text files which can be manipulated and sorted using scripts to extract important  information. However the most useful time and place to see the results is during the  partitioning, in order to prevent us making poor assignment decisions which cause  problems later in the flow.

Assign SoC top-level IO

Certain external resources or connectors on the board may need to connect with  specific blocks of the design, for example a RAM daughter card will need to  connect with the DDR drivers in the design. This will dictate that the RAM subsystem will need to be partitioned into that FPGA which is connected to the RAM  daughter board. Other pins of this kind may be connected to external PHY chips, or  to test points or logic analyzer header on the board that will monitor certain internal  activity. 

The location of these kinds of fixed resources should be assigned first, since they  are forced upon us anyway. Depending on how flexible your platform may be, it  might be possible to alter which FPGA pins connect to these external resources by  rearranging the board topology, for example, by placing daughter cards in a  different place on the motherboard.

Some teams find that it helps to configure the platform so that one FPGA drives as  much of the external SoC IO as possible. This may seem to over-constrain one FPGA but the freedom it gives to assignments in the remaining FPGAs is very  helpful.

Note: take care over FPGA IO voltage regions

In a typical SoC there will be ports that run at different voltage levels in order to  connect to external resources. Consequently in our prototype, we need to configure  our FPGA pins so that they can interface at the same voltages. FPGA pins are very  flexible and can be set to different voltage standards but they must be configured in  banks or regions of the same voltage rather than by individual pin, as we learned in  chapter 3 

We therefore do not have complete freedom in our FPGA pin placement, so we  should assign SoC ports that require specific voltage pins next, although it will still  be possible later to move pins within the given voltage region if necessary. For  example, in the Virtex®-6 family there are 40 pins in a voltage bank. It is very  useful if the partitioning tool gives guidance and feedback on voltage regions and  required voltages of the IO while we are partitioning and warns against incorrect IO  placements or configuration,

Assign highly connected blocks

We can now start assigning the blocks of the SoC design into specific FPGAs. This  first partitioning operation will steer all remaining decisions. As in most projects, it  is important to make a good start. We begin with those blocks which share the most  interconnect with other blocks, but how do identify those?  


Immediate indication of resource and IO usage in each FPGA.png

It is useful before and during partitioning to compare notes with the SoC back-end engineers who floorplan and layout the IC itself. They will probably be working through a trial implementation of the chip around the same time as the prototype is  being created (see chapter 4). Both teams face the same partitioning challenges,  especially if there are areas of congestion and high-connectivity in the RTL.  

The RTL designers or back-end team may also provide connectivity information,  but in many cases we have to ascertain this by inspecting the block-level  interconnect information ourselves. This is where some tools can help by displaying  or ordering this information for easy inspection, for example, by overlaying the  block-level area and interconnect information onto other design views. For example,  Figure 105, shows a board view from the Certify partitioning environment where  we can see indicators of IO and Logic usage for each FPGA. Interconnect  information is also crucial and Figure 106 shows the Certify tool’s display of block level interconnect data at a particular level of the design hierarchy.

Mutual interconnect between blocks displayed as a matrix.png

Here we can immediately see that blocks b2v_inst1 and b2v_inst2 share 82 mutual  connections but that b2v_inst3 has the most connections (106) to the block’s top level IO.  

The important task when partitioning multiple blocks with large numbers of  mutually connected signals is to ensure that these blocks are placed in the same  FPGA. If highly connected blocks are placed in different FPGAs then we will need  a large number of FPGA IO pins to reconnect them. For example, when using 64 bit  and larger buses, it is quite possible that two blocks assigned into different FPGAs  can require hundreds of extra FPGA IO. So in our example above, we might try to  assign b2v_inst3 first into one FPGA while b2v_inst1 and b2v_ins2 can be assigned  together into a different FPGA because they are mutually connected, but share little  connectivity with b2v_inst3.  

If it is not possible to put highly-interconnected blocks together because they  overflow the resources of one FPGA, then we will need to step down a level of  hierarchy and look for blocks at the next level which are less connected and extract  those to be assigned in a different FPGA. In this way we may still increase the  number of required FPGA IO, but by less than would be the case if the higher-level  block were assigned elsewhere. If there is no such partition at this lower level then we might go even lower, but specifying partitioning at finer and finer logic  granularity makes it more likely that the partition will be affected by design  iterations as these finer grains are optimized differently or renamed. If we find  ourselves having to go deep into a hierarchy to find a solution then it may be better  to go back and restart at the top-level with a different coarse partitioning.

Recommendation: try different starting points and partially complete the  assignments to “get a feel” for the fit into the FPGAs and interconnect. If a  partitioning effort quickly becomes hard to balance then they are unlikely to  complete satisfactorily.

In cases of IO overflow or resource overflow, it is useful to have immediate  feedback that this is happening as we proceed through our partitioning tasks. As an  example, when block assignments are made to FPGAs in Certify partitioner, we see  immediate feedback on IO and resources usage in a number of ways, including the  “thermometer” indicators on the FPGAs of the board view, as shown in Figure 105.  Here we can see a graphical representation of the four FPGAs on a HAPS® board  and in each FPGA, there are three fields showing the proportion of the internal logic  resources and the IO pins used in this partition so far. As we assign blocks to each  FPGA we will see these thermometers change up, and sometimes down. A glance at  this display tells us that the IO and logic usage is well within limits.

Assign largest blocks

Using our estimation for the area of each block, we can assign the rest of the design  blocks to FPGA resources, starting with the largest of the blocks. We start with the  larger block because this naturally leaves the smaller blocks for later in the  partitioning process. Then, with the FPGA resources perhaps becoming over-full  (remember 50% to 70% utilization is a good target) we have more freedom in the  placement of smaller blocks of finer granularity and lower number of inputs and  outputs. 

As we partition, we look to balance the resource usage of the FPGAs while keeping  the utilization within tolerable limits i.e., less than 70% recommendation. This will  help avoid long place & route runtimes and make it easier to reach required timing.

Recommendation: if there is a new block of RTL which is likely to be updated  often or to have its instrumentation altered frequently, then keeping utilization low  for its FPGA will speed up design iterations for that RTL and save us time in the  lab.

As each block is assigned, we may find that the available IO for a given FPGA is  exceeded. The remedy for this is to go back and find a different partition or replicate  some blocks (see below) or consider the use of time-division multiplexing of signals  onto the same IO pin (see also below). At all stages the feedback on current utilization and IO usage will help us to make immediate decisions regarding all the  above items.

Note: help assigning blocks

Having selected a candidate block for partitioning we might make trial assignments  until we find the best solution, however, that is inefficient in a prototype with many  FPGAs. We have seen how useful it is to have immediate feedback on our  assignment decisions. In fact, it is even more useful to have the feedback before the  assignment is made. This allows us to see in advance what would be the effect on  IO and resources if a selected block were to be placed in such-and-such FPGAs.  This kind of pre-warning is called impact analysis.  

In the case of Certify, impact analysis can instantly make the trial assignment to all  FPGAs on our behalf and then show us the impact in a graphical view, as shown in  Figure 107.

View of impact analysis in Certify tool.png

Here we can see that our selected block has an area of 672 logic elements, extracted  from a previous resource estimate. If we choose to assign our block to mb.uB, we  will increase that FPGA’s area by 672 logic elements (out of a total of 478080) and  we will increase the IO count by 137, bringing it to a total of 150. We can also see  that if we assign our block to mb.uA, then the area will still increase by the same  amount but the IO requirement will fall by 83 pins, presumably because our block  connects to some logic already assigned to mb.uA. We can select mb.uA based on  this quick analysis and then click assign. 

As with all tools driven by an interactive user interface it is good to be able to use  scripts and command line once we are familiar with the approach. In the case of  Certify’s impact analysis, a set of TCL commands is available to return the requested calculation results on the specified instances for the indicated devices.  Results can be displayed on the command line or written to a specified file for  analysis. T

his semi-automated approach to block assignment leads us to ask why a fully  automated partitioning would not be able to perform the same analysis and then act  upon the result. We shall look at automated partitioning in a later section.

Assign remaining blocks

After the major hierarchical blocks have been placed, we can simply fill in the gaps  with smaller blocks using the same approach. The order is not so important with the  smaller blocks and we can be guided by information such as connectivity and  resource usage. Some tools also offer on-screen guidance such as “rats-nest” lines  of various weights based on required connections which appear to pull the selected  block towards the best FPGA to choose.  

Having made their key assignments manually, some teams will switch to using  automated partitioning at this stage. If this can operate in the same environment as  the manual partitioner then that is more efficient. We simply get to a point where we  are satisfied that we have controlled our crucial assignments and push a button for  the rest to be completed. For example, Certify’s quick partitioning technology  (QPT) can be invoked from within the partitioning environment at any time.

Replicate blocks to save IO

While partitioning a system as large as a complex SoC we are likely at some time to  reach a point where a block needs to be in two places at once.  

For example, the next block we wish to partition needs to drive a wide bus to two  blocks which were previously partitioned into different FPGAs, as shown in Figure  108.

A partitioning task; where to place the next block.png

Which FPGA is the right place to put our next block? Either choice will cause  thereto be a large number of IO which need to leave the chosen FPGA to connect  the bus across to the un-chosen one, as shown in Figure 109.  

Partitioning into either FPGA requires 136 extra IO pins.png

The answer is to put the block into both FPGAs as shown in Figure 110. In this way  each downstream block has its own copy of the new block inside its FPGA and so  no IO is required except for that which feeds the new block, IO requirement drops  from 136 to 16.  

Our partitioning tool should allow us to make multiple copies of the same block for  partitioning into different FPGAs. If not, then it might mean a lot of rewriting of  RTL, which may not be practical, even with the use of XMRs and other short cuts. 

Partitioning tools will have different ways to achieve this replication but in the case  of Certify it is simply a matter of assigning a block to multiple destinations. The  multiple assignments will infer additional logic and interconnections, splitting the  original blocks fanout into local sub-trees for each FPGA if possible.

Replication and partitioning into both FPGAs requires only 16 extra.png

Because we are making two copies of our new block, the end use of resources will  increase, although maybe not as much as first anticipated. Part of the replicated  block placed in the second FPGA may not be required to drive logic there while that  part of the original is already driving the logic in the first FPGA. Hence parts of the  replicant and original will be pruned out during synthesis. 

Replication can also be used to reduce the number of IO for a high-fanout block  driving multiple FPGAs. The simple, albeit unlikely scenario of an address decoder  driving three FPGAs is a good illustration of how we can reduce the number of  required on-board traces by using replication to create extra decoders, and then  allowing the synthesis to remove unnecessary logic in each FPGA.

Replication is such a helpful trick that, when we are partitioning, or preferably  before, we should be on the look-out for replication opportunities to lower the IO  requirement. Replication is also very useful for distributing chip support items such as clock and  reset across the FPGAs, as we shall see in section 8.5.

Multiplex excessive FPGA interconnect

As mentioned, large SoCs with wide buses may not partition into a number of  FPGAs without overflowing the available IO resources, even when using replication  and other techniques. In that case we can resort to using time-division multiplexing  of more than one signal onto the same trace.  

Multiplexing is a large subject, so in order not to break the flow of our discussion  here, we shall defer the detail until section 8.6 below. 

Let us assume for the moment that and necessary signal multiplexing has been  added and that the interconnect between the FPGAs has been defined. We are now  ready to fix the FPGA pin locations. We do this directly by assigning signals to  traces.

Assign traces

We have reached the stage in our project where we have partitioned all the SoC into  FPGAs, but before running synthesis and place & route, we need to fix the pinout of  our FPGAs. All along we have been considering the number of FPGA IO pins as  being limited. However, really we should be talking about the connections between  those pins on the different FPGAs. The number of traces on the board or the width  of cables and routing switches which are able to connect between those FPGA IO  pins are the real limitation. 

In a well-designed platform, every FPGA IO pin will be connected to something  useful and accurately represented in the board description file. Then the partitioning  tools will know exactly, and without error, which traces are available and to which  FPGA pins they connect. If the board description is accurate then the pin  assignments will be accurate as a result.

This section of the chapter is called “Assign traces,” rather than “Assign FPGA  pins,” because that is what we are doing. We should not think that we are assigning  the signals at the top of each FPGA to a pin on that FPGA, but rather we should  think of it as assigning signals to traces so that these propagate to fix all FPGA pins  to which the trace runs.

Certify tool’s trace assignment environment.png

EDA tools such as Certify automate the trace assignment process while keeping  track of available traces on the board and permissible voltage regions and allowing  automatic signal assignment. The trace assignment environment should help us  recognize clock, resets and other critical signals. It should also help us to sort traces  by their destinations and fanout and filter suitable candidates for assignment of  particular traces. One view of Certify’s trace assignment window is shown in Figure  111, in which we can see the signals which require assignment listed on the left.  Here we can see that the user has selected a bus of eight signals called aluout which,  as the adjacent list shows, needs to connect to logic which has been partitioned into  devices mb.uA, mb.uB and mb.uC. Once a signal or group of signals is selected, at  the bottom right there appears a filtered list of candidate traces on the board i.e.,  those which are available and which connect to at least the required FPGAs (or  other board resources should that be the case). We then pick our candidate and  confirm the assignment with the relevant button.

The recommended order to assign our signals to traces is as follows:  

• Assign clock, reset and other global inputs if any. 

• Assign test points or probe outputs to match the on-board connections. 

• Assign top-level ports which connect to dedicated resources or connectors. 

• Assign rest of inter-device signals, being aware of voltage-level  requirements. 

In each case, there will probably be more than one candidate trace for any selected  signal.  We choose from candidate traces in the following preference order:

• Any available trace that has the same end-points as the signal. 

• If no trace meets the criteria in 1, then a trace with the same end-points as  the signal, plus minimum number of superfluous end-points. Superfluous  end-points mean that FPGA pins will be wasted.  

• If no trace meets the criteria in 2, then we must split the signal onto two  traces using two output pins at the signal’s source FPGA, as seen in Figure  112.

Splitting signal onto two FPGA pins, using two traces to reach.png

When there is no trace including at least the end-points required by the signal, then  multiple traces between the driving FPGA and each of the receiving FPGAs can be  used.  

Our EDA tools should be able to split the output onto two FPGA pins automatically  without a change to the RTL. This is achieved in Certify by simply assigning the  signal to more than one trace. Then the tool increments the pin count on the driving  FPGA and the signal is replicated onto the extra trace, or traces. 

In general, while following the above recommended preference order there may be  multiple equivalent candidate traces to which a signal can be applied and in those  cases it is irrelevant which one we choose. This reinforces the notion that for many  signals it is not important which FPGA pins we use, as long as they are all  connected together on the same trace.

Note: automatic trace assignment

Given that the above procedure is fairly methodical, it is relatively simple for EDA  tools to make automated assignment following the same rules. In fact, we can take a  hybrid approach by making the most important connections manually and allowing  the tools to automatically complete the assignments for less critical signals. Automatic tools will follow a similar order of assignment as we would ourselves.  We can minimize the manual assignment steps by giving guidance to the automated  tool when it is assigning traces from FPGA to other resources. By naming the  signals and the resource pins using the same naming convention, the tools can then  recognize, for example, that signal addr1 connects to ram addr1 and its associated  trace, rather than any other candidate.  

In this way we can methodically step through the trace assignments and guided by  our tools, we can quickly assign thousands of FPGA pins without error.

Note: trace assignment without EDA tools

The authors are aware of at least one team that has developed its own pin  assignment scripts over many projects. These scripts extract the top-level signal  names from the log file of dummy FPGA synthesis runs and put them into a simple  format that can be imported into the usual desktop spreadsheet applications. The  team then uses the spreadsheet to text search the signal names and assigns them to  correct FPGA pins. A bespoke board description which includes all the FPGA  connections of note is also imported into the spreadsheet. The spreadsheet would  then generate pin lists which can be exported and scripted again into the correct  UCF format for place & route. 

This approach is rare because not only is there the effort of developing and  supporting the scripts, spreadsheet and so forth, but it may not also be the core  competency of the prototyping team and the best use of its time. In addition, we are  introducing another opportunity for error in the project. However, this example does  underline the point that we can do FPGA-based prototyping without specialist EDA  tools if we are skilled and determined. This might be a “make vs buy” decision that  most would avoid, and instead default to using the commercially tried and tested  partitioning tools available on the market today.

Iterate partitioning to improve speed and fit

Our first aim, as stated at the start of this chapter, was to organize blocks of the SoC  design into FPGAs in such a way as to balance FPGA utilization and minimize the  interconnect resources. Once this is achieved, we might want to step back and tweak  the partition to improve it, possibly to improve performance.  

Recommendation: Take a number of different approaches to partitioning, perhaps  with different team members working in parallel, because the starting point can  make a big difference to the final outcome The initial block assignment in particular has such a strong impact on later partitioning decisions, so even just having a  number of tries at the initial partition may bring some reward.

For example, the major blocks might be split differently and partitioned so that  multiplexing is required on a different set of signals, over a different set of traces.  The multiplexed paths often become the most critical in the design, so if we can  perform multiplexing in a less critical part of the design, then this might raise the  overall system performance. Similarly, replicating larger blocks early in the partitioning, rather than smaller  blocks later on, might yield better overall results. If we can make a collection of  different coarse partitioning decisions at the start and then explore these as far along  the flow as is practical then we can pick the most promising for first completion but  perhaps revisiting others when we have learned from our first attempts.  

It is often rewarding to discuss partitioning strategies with the SoC back-end layout  team as they may have partitioning ideas to share which yield lower routing  congestion. 

Once we have a finished partition for taking on to the rest of the flow and  downloading onto the boards, we can split our efforts and while the FPGA is being  brought up and debugged in the lab, we can spare some time in parallel to explore  improved results.  

During the partitioning task, not only does the design need to be split into individual  sub-designs but also consideration must be given to the overall system-level  performance of the prototype in the lab. Let us look now at general methods for  improving performance in a prototype.

Note: explore non-obvious partitions

As we explore different partition ideas, we should try to look beyond the natural  functional boundaries within the design. For example, a prime reason why an  acceptable partition cannot be found at first might be that a large interconnected  block takes up too much FPGA resource. Looking into the next-level hierarchy we  find a similar situation, but taking a different view on the blocks might show a  datapath structure or a regular channel arrangement which can be split along its  length rather than across its block boundaries.  

Another alternative partitioning strategy might be to identify all logic within a  particular clock domain and then assign it all into the same FPGA. Partitioning tools  should have a scripting or graphical method for selecting all logic that is driven by a  specific clock. This may also increase performance in a design because the critical  path within a domain would avoid traversing an inter-FPGA path. This ideal  situation may not arise often in practice, however, owing to other constraints, and in  particular, the natural tendency to partition by functionality, rather than by clock  domain.



  • XC2C512-10FT256C

    Manufacturer:Xilinx

  • CPLD CoolRunner -II Family 12K Gates 512 Macro Cells 128MHz 0.18um Technology 1.8V 256-Pin FTBGA
  • Product Categories: Embedded - CPLDs (Complex Programmable Logic Devices)

    Lifecycle:Active Active

    RoHS: No RoHS

  • XC5215-5HQ208C

    Manufacturer:Xilinx

  • FPGA XC5200 Family 23K Gates 1936 Cells 83MHz 0.5um Technology 5V 208-Pin HSPQFP EP
  • Product Categories: FPGAs

    Lifecycle:Obsolete -

    RoHS: No RoHS

  • XC3S50-5VQ100C

    Manufacturer:Xilinx

  • FPGA Spartan-3 Family 50K Gates 1728 Cells 725MHz 90nm Technology 1.2V 100-Pin VTQFP
  • Product Categories: FPGAs

    Lifecycle:Active Active

    RoHS: No RoHS

  • XC3S50A-4FTG256I

    Manufacturer:Xilinx

  • FPGA Spartan-3A Family 50K Gates 1584 Cells 667MHz 90nm Technology 1.2V 256-Pin FTBGA
  • Product Categories: FPGAs

    Lifecycle:Active Active

    RoHS:

  • XC3S50A-4VQ100I

    Manufacturer:Xilinx

  • FPGA Spartan-3A Family 50K Gates 1584 Cells 667MHz 90nm Technology 1.2V 100-Pin VTQFP
  • Product Categories: FPGAs

    Lifecycle:Active Active

    RoHS: No RoHS

Need Help?

Support

If you have any questions about the product and related issues, Please contact us.