Abstract:
A VLAN memory access system to provide VLAN address table look-ups with the ability to simultaneously do processor read cycles or processor write cycles to the same memory structure with anatomical accesses. The system encompasses the interaction between a memory look-up table that stores the slot allowed transition bit mask for a multi-slot hub based VLAN switch, a switch processor interface that is used to upgrade the memory access table by writing entries into the table or reading the table to verify its contents, and a look-up processor that uses the VLAN table to make forwarding decisions on the destination of a packet based on the value read from the VLAN memory look-up table. The VLAN table accesses must be arbitrated between the look-up processor, which has the highest priority, and read or write accesses from the switch processor. The look-up processor takes the VLAN ID field of a packet and uses this as the address of the slot allowed transmit bit mask to be applied to the destination slot bit mask. This logical AND function is used to determine the final bit mask of slots that will receive this packet.

Description:
FIELD OF THE INVENTION 
     The present invention relates to a virtual local area network (VLAN) system where packets are redirected in a switch according to a look-up table. In particular the present invention relates to a system for using a memory look-up table to redirect packets, while at the same time updating and maintaining the look-up table without access conflicts. 
     BACKGROUND OF THE INVENTION 
     In a local area network (LAN) information is sent from workstation to workstation in the form of packets. Each packet contains a header and data portion. The header portion contains control type information such as destination address, source address, the type of information being transferred, and error correcting codes. The data portion contains the actual information to be transferred from one workstation to another. 
     Workstations are connected to each other over a medium such as wire cables or fiber optic cables. The cables usually lead from the individual workstations to a hub or concentrator. The plurality of workstations connected to a single concentrator is often known as a segment. A plurality of segments, each having their own concentrator, can be connected to each other by connecting the concentrators. 
     One of the simpler embodiments of a concentrator is provided with only a repeater function. Any packet that is received by a repeater from a workstation is sent out to all other workstations connected to the repeater. When a plurality of segments, each having repeaters, are connected to each other, a packet generated by one workstation is spread throughout the entire LAN. The destination address of the workstation to receive the packet is included in the header of the packet. Workstations that are not to receive the packet, disregard or ignore the packet. 
     As the number of segments and workstations increase on a LAN, the number of packets traversing the LAN, or the traffic, also increases. With all the workstations and segments connected by repeaters, the packets going to all workstations causes delays for the packets and a corresponding lowering of performance of the network. 
     Bridges and routers are known to connect segments and only transfer packets from one segment to another segment if the destination address of the packet is on the other segment. Otherwise a packet will not be delivered into a segment. 
     Routers are more sophisticated than bridges and can route packets according to additional conditions. Routers are also more complicated and more expensive than bridges or repeaters. Correspondingly, bridges are more complicated and more expensive than repeaters. 
     Very often it is desirable to provide individual groups of workstations within a single segment, or to have a single group encompass several segments. Also, it may be desirable to have several different groups each contain separate portions of several different segments. The routing of packets to only members of the same group can become very complicated and expensive if routers are used. Also very often a single workstation will send a multi-cast or broadcast packet intended for all members of its own group. With traditional bridges and routers, a broadcast packet would go to all members of all groups. This is not desirable since it needlessly increases traffic and may also be undesirable from a security view point. 
     Also when a workstation is moved, or a person wants to move to a different workstation and still receive their same information, reconfiguration of a router is very involved. The same is true when additional workstations must be added to a router&#39;s configuration, or a particular workstation wants to be associated with a different group of workstations on the LAN. 
     SUMMARY AND OBJECTS OF THE INVENTION 
     It is an object of the present invention to overcome the problem of excessive traffic on a LAN by subdividing the individual workstations into groups of workstations or VLAN&#39;s. Packet traffic is only directed to the destination workstations, and broadcast packets only go to workstations of the desired VLAN. Moving a workstation or person to another physical location on a LAN, but still maintaining their same address is much simpler in the present invention. Adding additional workstations to a VLAN, or changing a workstation to a different VLAN is much easier in the present invention. 
     The present invention accomplishes this by adding a VLAN ID field to each packet or by associating a port with a particular VLAN ID field. The packets are then sent from a workstation to a VLAN switch. In the VLAN switch, the VLAN ID field is read. The VLAN switch contains information indicating where a packet from a particular VLAN is to be sent to reach the correct VLAN and workstation. The VLAN switch then property directs the packet based on the information stored in the VLAN switch. 
     VLAN information is stored in the VLAN switch in a memory address look-up table. When a packet comes in, its VLAN ID field is used as an address in the memory address look-up table, and the data in that address is then read out and used to redirect the packet. A VLAN controller reads the VLAN ID field from the VLAN packet, goes to the corresponding address in the memory look-up table, reads the data in that address and then the VLAN controller redirects the packet. This operation can happen many times a second and can be completely random. 
     The memory look-up table also needs to be updated and maintained while the VLAN controller is performing the VLAN look-up process. This causes two separate entities to be reading and writing the memory look-up table at possibly the same time. Errors can occur if one entity interrupts in the middle of an operation of the other entity. 
     The present invention provides a system which prevents one entity from interfering in the middle of the operation of the other entity. This system involves two separate state machines, namely a first state machine referred to herein as a req --  arb state machine and a second state machine referred to herein as a VFI state machine. The req --  arb state machine has the states idle, look-up also referred to as gbi, and processor also referred to as proc. The VFI state machine has an off state, a read state and a write state. 
     The VLAN look-up controller, or process, generates a look-up signal, also referred to as a read-request signal or ftt --  read --  req signal, when the VLAN look-up process needs to process an incoming packet. The switch processor which updates and maintains the memory look-up table generates a processor request signal, also referred to as a proc-request signal, when the switch processor needs to read and write to the memory look-up table. The switch processor also generates a read signal where the switch processor needs to read from the memory look-up table. The switch processor also generates a write signal when the switch processor needs to write to the memory look-up table. The req --  arb state machine goes into the idle state when the read-request signal and the proc-request signal are not present or not active. The req --  arb state machine goes into the gbi state when the read-request signal is present or active. The req --  arb state machine goes into the proc state when the read-request signal is not present and the proc-request signal is present. 
     The VFI state machine transitions between states based on conditions A and B. Condition A is present when the gbi state is active or (the proc state is active and the read signal is present). The logic statements in the parenthesis are performed first and the outcome is then logically or&#39;ed with the fact if the gbi state is active. Condition B is present when the proc state is active and the write signal is present. The VFI state machine goes into the read state when condition A is present. The VFI state machine goes into the write state when condition A is not present and condition B is present. The VFI state machine goes into the off state when conditions A and B are not present. Also any combinations of the above signals which are not defined cause the present invention to go into the idle state and the off state. 
     In this way the VLAN process is given priority and performance of the network does not suffer. Also the switch processor is able to maintain an update in the memory look-up table without interfering with the VLAN look-up process, or the VLAN look-up process interfering with the switch processor. 
     The various features of novelty which characterize the invention are pointed out with particularity in the claims annexed to and forming a part of this disclosure. For a better understanding of the invention, its operating advantages and specific objects attained by its uses, reference is made to the accompanying drawings and descriptive matter in which preferred embodiments of the invention are illustrated. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     In the drawings: 
     FIG. 1 is a view of a hub or concentrator for connecting a plurality of workstations; 
     FIG. 2 is a schematic view of a plurality of workstations connected to a plurality of concentrators: 
     FIG. 3 is a diagram of a packet; 
     FIG. 4 is a schematic view of the inside of the hub or concentrator; 
     FIG. 5 is a diagram of the req --  arb state machine; and 
     FIG. 6 is a diagram of the VFI state machine. 
    
    
     DESCRIPTION OF THE PREFERRED EMBODIMENTS 
     Referring to the figures, and especially FIG. 1, a hub or concentrator 10 contains a plurality of slots 16. Media modules 14 can be placed into these slots. Each media module 14 has a plurality of ports 2 for connection to workstations, as shown in FIG. 2. 
     The concentrator 10 can be connected to other concentrators 10&#39; and 10&#34; over a medium 50 which could be similar to medium 4. FIG. 2 shows a LAN with three concentrators and their corresponding segments. The present invention further subdivides the LAN into a plurality of VLAN&#39;s. Workstations 22, 24, 26, 27 and 29 call be considered to be a first VLAN, workstations 32, 34 and 38 can be considered to be a second VLAN and workstations 42, 44, 46 and 48 can be considered to be a third VLAN. In order to reduce traffic and increase security, it is desirable that packets from one VLAN are not sent to workstations on another VLAN, especially broadcast packets from one of the VLAN&#39;s. 
     Each packet 6 has a header portion 8 and a data portion 12 (FIG. 3). In the packet is a VLAN ID field 18. 
     The concentrator 10 in the present invention is a VLAN switch which contains a VLAN controller means 20 for redirecting the packets onto the proper medium 4 or 50 (FIG. 4). The VLAN controller means reads the VLAN ID field 18 of an incoming VLAN packet and uses the value in the VLAN ID field to properly position an address pointer 28 to a corresponding memory location 36 in a memory look-up table 30. Data from the look-up address indicated by pointer 28 is then transferred in and out of the memory look-up address 36 by an input/output (I/O) means 40. The VLAN controller means uses the look-up data from the I/O means 40 and the look-up address 36 to determine how the incoming packet should be directed. 
     The memory look-up table 30 needs to be initialized, maintained and updated. It is desirable that all of these functions be performed while the VLAN switch 10 is functional and redirecting packets. A switch processor 52 initializes, updates and maintains the memory-look up table 30. In order for the switch processor to operate, it must perform read and write operations which could interfere with the read operations of the VLAN controller means 20. It is very desirable that the memory look-up table be updated without having to significantly stop traffic on the LAN, and without causing errors in operation of either the VLAN controller means or the switch processor 52. 
     When the VLAN controller means 20 needs to read information from the memory look-up table, the VLAN controller means 20 generates a read-request signal 41. When the switch processor needs to read or write to the memory look-up table, the switch processor generates a proc-request signal 43. Further when the switch processor 52 needs to read from the memory look-up table 30, the switch processor 52 generates a RAM read signal 45. When the switch processor 52 needs to write to the memory look-up table 30, the switch processor 52 generates a RAM write signal 47. 
     The read-request signal 41, the proc-request signal 43, the RAM read signal 45 and the RAM write signal 47 are all received by a state machine 51. 
     The state machine 51 actually contains two separate state machines, a req --  arb state machine represented in FIG. 5 and a VFI state machine represented by FIG. 6. 
     The req --  arb state machine goes into the gbi state when the read-request signal is present or active. The req --  arb state machine goes into the proc state when the read-request signal is not present and the proc-request signal is present. When both the read-request signal and the proc-request signal are not present, or in any other undefined set of conditions, the req --  arb state machine goes into the idle state. 
     When the req --  arb state machine is in the gbi state, the VLAN controller means 20 controls the address pointer 28 of the memory look-up table 30. The address pointer 28 is then directed to the address equaling the VLAN ID field of the present packet. The output of the memory look-up table 30 in this state is the VLAN ID field of the packet that requires a VLAN address look-up. Any access from the processor, read or write, is stalled until the look-up is completed. When the req --  arb state machine is in the proc state, the switch processor 52 controls the location of the address pointer 28. The address pointer 28 is then directed to a memory location designated by the switch processor 52. The output of the look-up table 30 in this state is the address location that the processor is accessing with either a read or write cycle. The processor access will take only one cycle so as to guarantee that a request from the VLAN controller means 20 can be accomplished for a VLAN address look-up from a next packet. 
     In the idle state, the address pointer 28 is not set to an address of any significance with regard to the VLAN controller or the switch processor. The address pointer 28 can be set to a non-significant address such as &#34;00000000&#34;. 
     The VFI state machine as represented by FIG. 6, has an off state, a read state and a write state. The VFI state machine transitions between the states based on conditions A and B. Condition A is present when the gbi state is active or (the proc state is active and the RAM read signal is present). Again, the logic operation inside the parenthesis is performed first. Condition B is present when the proc state is active and the RAM write signal is present. The VFI state machine goes into the read state when condition A is present. The VFI state machine goes into the write state when condition A is not present and condition B is present. The VFI state machine goes into the off state when conditions A and B are not present. Also any combination of the above signals which are not defined causes the VFI state machine to go into the off state. 
     When the VFI machine is in the write state, the state machine 51 generates a write enable signal 49 which is sent to the memory look-up table 30. This enables data from the switch processor 52 to be written into the memory look-up table 30. When the off or read state is active in the state machine 51, the write enable signal is not present or active. 
     When the read and gbi state is active, data from the memory look-up table 30 is accepted by the VLAN controller 20. When the read and proc states are active, data from the memory look-up table 30 is read by the switch processor 52. 
     In each of the req --  arb and VFI state machines, only one of the states is active at any one time. 
     The present invention thus gives priority to read requests from the VLAN controller with requests from the switch processor being processed when there are no requests from the VLAN controller. The states change in the state machine at the transition from one processing cycle to another. During a processing cycle, the states remain in their present state until the end of the cycle, where the new states are then determined by new input conditions. In this way activities of the switch processor 52 and the VLAN controller 20 do not interfere with each other during the middle of an operation. In this way the present invention is able to maintain system performance, while at the same time updating and maintaining a look-up table while the network is operational. 
     Attached as an Appendix, is software code implementing the present invention. 
     While specific embodiments of the invention have been shown and described in detail to illustrate the application of the principles of the invention, it will be understood that the invention may be embodied otherwise without departing from such principles. 
     
         __________________________________________________________________________*********************************************************************model vfi.vhdldescription: this model serves as an interface between thevfr model, pci model and the ftt models for use in vlanmulticast filtering.*********************************************************************history:0 09-20-94 gl - original1 09-29-94 gl - first compiled version of model.2 10-07-94 gl - changed data bus to seperate inputs &amp; outputs.3 10-19-94 gl - added iresetl and fixed initialization of signals.4 10-28-94 gl - replaced pci.sub.-- gmc.sub.-- enb with iresetl in allequations.5 11-08-94 FI - changed initialization of arb.sub.-- state statemachine.6 11-13-94 gl - changed name of model and replaced 32 MHz clock with25 MHz clock since model now interfaces to FTT block.7 11-30-94 gl - made changes for synopsys compile.8 12-14-94 gl - added flip flops to hold write data into ram.9 01-05-95 FI - added scan test input added test.sub.-- mode input tolatch, andchanged latch for insert.sub.-- to10 01-14-95 FI - made change to keep vn.sub.-- wrenl asserted in testmode11 01-30-95 FI - added control for ramtest mode12 02-08-95 FI - added wrenl.sub.-- in input, changed reset toasynchronous13 02-23-95 gl - fixed arbitration bugs in state machines and fixeddelayed processor cycle access.14 02-24-95 gl - fixed clearing of processor accesses.*********************************************************************library ieee;use ieee.std.sub.-- logic.sub.-- 1164.all;library parts;use parts.std.sub.-- logic.sub.-- unsigned.all;entity vfi isport (vfi.sub.-- data   out std.sub.-- logic.sub.-- vector(16 downto 0);vfi.sub.-- ramtest.sub.-- data    :             out std.sub.-- logic.sub.-- vector(16 downto 0);vfi.sub.-- wrenl  out std.sub.-- logic;vfi.sub.-- addr   out std.sub.-- logic.sub.-- vector(7 downto 0);vfi.sub.-- multicast.sub.-- mask    :             out std.sub.-- logic.sub.-- vector(16 downto 0);vfi.sub.-- multicast.sub.-- valid    :             out std.sub.-- logic;vfi.sub.-- read.sub.-- bus    :                 out std.sub.-- logic.sub.-- vector(15 downto 0);test.sub.-- so  out std.sub.-- logic;vfr.sub.-- data   in std.sub.-- logic.sub.-- vector(16 downto 0);ftt.sub.-- vlan.sub.-- id    :             in std.sub.-- logic.sub.-- vector(7 downto 0);ftt.sub.-- read.sub.-- reg    :             in std.sub.-- logic;pci.sub.-- wr.sub.-- vfi.sub.-- data    :             in std.sub.-- logic;pci.sub.-- wr.sub.-- vfi.sub.-- datb    :             in std.sub.-- logic;pci.sub.-- vfr.sub.-- wr.sub.-- strobe    :             in std.sub.-- logic;pci.sub.-- vfr.sub.-- rd.sub.-- strobe    :             in std.sub.-- logic;pci.sub.-- vfi.sub.-- addr     :             in std.sub.-- logic.sub.-- vector(7 downto 0);pci.sub.-- wdata      :                 in std.sub.-- logic.sub.-- vector(15 downto 0);pci.sub.-- read.sub.-- addr    :             in std.sub.-- logic;pci.sub.-- gmc.sub.-- enb    :             in std.sub.-- logic;pci.sub.-- ramtest.sub.-- write    :             in std.sub.-- logic;pci.sub.-- ramtest.sub.-- read.sub.-- vfi    :             in std.sub.-- logic;ramtest.sub.-- write.sub.-- data    :             in std.sub.-- logic.sub.-- vector(16 downto 0);wrenl.sub.-- in   in std.sub.-- logic;test.sub.-- mode  in std.sub.-- logic;test.sub.-- se  in std.sub.-- logic;test.sub.-- si  in std.sub.-- logic;isymclk      :  in std.sub.-- logic;iresetl    :      in std.sub.-- logic);end vfi;architecture behavior of vfi istype vfistatetype is (off, read, write);type req.sub.-- arb.sub.-- statetype is (idle, gbi, proc);signal vfi.sub.-- stateq, vfi.sub.-- stated : vfistatetype;signal req.sub.-- arb.sub.-- stateq, req.sub.-- arb.sub.-- stated:req.sub.-- arb.sub.-- statetype;signal ram.sub.-- wr.sub.-- strobeq   : std.sub.-- logic;signal ram.sub.-- rd.sub.-- strobeq   : std.sub.-- logic;signal holding.sub.-- wr.sub.-- strobeq  : std.sub.-- logic;signal holding.sub.-- reg.sub.-- strobeq  : std.sub.-- logic;signal ram.sub.-- wr.sub.-- strobed   : std.sub.-- logic;signal ram.sub.-- rd.sub.-- strobed   : std.sub.-- logic;signal holding.sub.-- wr.sub.-- strobed  : std.sub.-- logic;signal holding.sub.-- reg.sub.-- strobed  : std.sub.-- logic;gbus multicast filter reg asignal multicast.sub.-- filter.sub.-- regaq           : std.sub.-- logic.sub.-- vector(15 downto 0);signal multicast.sub.-- filter.sub.-- regad           : std.sub.-- logic.sub.-- vector(15 downto 0);gbus multicast filter reg bsignal multicast.sub.-- filter.sub.-- regbq           : std.sub.-- logic;signal multicast.sub.-- filter.sub.-- regbd           : std.sub.-- logic;holding reg asignal holding.sub.-- regaq           : std.sub.-- logic.sub.-- vector(15 downto 0);signal holding.sub.-- regad           : std.sub.-- logic.sub.-- vector(15 downto 0);holding reg bsignal holding.sub.-- regbq           : std.sub.-- logic;signal holding.sub.-- regbd           : std.sub.-- logic;write address latch signalssignal next.sub.-- addr.sub.-- sig           : std.sub.-- logic.sub.-- vector(7 downto 0);signal ramtest.sub.-- addrq           : std.sub.-- logic.sub.-- vector(8 downto 0);signal ramtest.sub.-- addrd           : std.sub.-- logic.sub.-- vector(8 downto 0);constant read.sub.-- ram.sub.-- data           :   std.sub.-- logic := &#39;1&#39;;constant read.sub.-- ram.sub.-- datb           :   std.sub.-- logic := &#39;0&#39;;constant addr.sub.-- zero    : std.sub.-- logic.sub.-- vector(7 downto 0):= &#34;00000000&#34;;constant data.sub.-- zero  : std.sub.-- logic.sub.-- vector(16 downto 0):= &#34;00000000000000000&#34;;constant false    :     std.sub.-- logic := &#34;0&#34;;constant true    :     std.sub.-- logic := &#34;1&#34;;constant low    :     std.sub.-- logic := &#34;0&#34;;constant high    :     std.sub.-- logic := &#34;1&#34;;constant deasserted.sub.-- low    :           std.sub.-- logic := &#34;0&#34;;constant asserted.sub.-- high    :           std.sub.-- logic := &#34;1&#34;;constant asserted.sub.-- low    :           std.sub.-- logic := &#34;0&#34;;constant deasserted.sub.-- high    :           std.sub.-- logic := &#34;1&#34;;begincombo: process(vfr.sub.-- data,ftt.sub.-- vlan.sub.-- id,ftt.sub.-- read.sub.--req,pci.sub.-- wr.sub.-- vfi.sub.-- data,pci.sub.-- wr.sub.-- vfi.sub.--datbpci.sub.-- vfr.sub.-- wr.sub.-- strobe,pci vfr.sub.-- rd.sub.-- strobe,pci.sub.-- vfi.sub.-- addr,pci.sub.-- wdata,pci.sub.-- read.sub.-- addr,pci.sub.-- gmc.sub.-- enb,pci.sub.-- ramtest.sub.-- write,pci.sub.-- ramtest.sub.-- read.sub.-- vfiramtest.sub.-- write.sub.-- data,isymclk,req.sub.-- arb.sub.-- state.sub.-- vfi.sub.-- stateq,ram.sub.-- wr.sub.-- strobeq,ram.sub.-- rd.sub.-- strobeq,holding.sub.--wr.sub.-- strobeq,holding.sub.-- reg.sub.-- strobeq,multicast.sub.-- filter.sub.-- regaq,multicast.sub.-- filter.sub.-- regbq,holding.sub.-- regaq,holding.sub.-- regbq,ramtest.sub.-- addrq,test.sub.-- mode)variable read.sub.-- bus    : std.sub.-- logic.sub.-- vector(15 downto0);variable wrenl    : std.sub.-- logic;variable wrenl.sub.-- or.sub.-- clk    : std.sub.-- logic;variable req.sub.-- arb.sub.-- state    : req.sub.-- arb.sub.-- statetype;variable proc.sub.-- request    : std.sub.-- logic;variable next.sub.-- addr    : std.sub.-- logic.sub.-- vector(7 downto0);variable out.sub.-- data    : std.sub.-- logic.sub.-- vector(16 downto0);variable multicast.sub.-- valid    : std.sub.-- logic;variable multicast.sub.-- mask    : std.sub.-- logic.sub.-- vector(16downto 0);variable mask.sub.-- or.sub.-- bypass    : std.sub.-- logic.sub.--vector(16 downto 0);begingbus multicast filter reg aif pci.sub.-- wr.sub.-- vfi.sub.-- data = asserted.sub.-- high then multicast.sub.-- filter.sub.-- regad &lt;= pci.sub.-- wdata(15 downto 0);elsif holding.sub.-- wr.sub.-- strobeq = asserted.sub.-- high then multicast.sub.-- filter.sub.-- regad &lt;= holding.sub.-- regaq;else multicast.sub.-- filter.sub.-- regad &lt;= multicast.sub.-- filter.sub.--regaq;end if;gbus multicast filter reg bif pci.sub.-- wr.sub.-- vfi.sub.-- datb = asserted.sub.-- high then multicast.sub.-- filter.sub.-- regbd &lt;= pci.sub.-- wdata(0);elsif holding.sub.-- wr.sub.-- strobeq = asserted.sub.-- high then multicast.sub.-- filter.sub.-- regbd &lt;= holding.sub.-- regbq;else multicast.sub.-- filter.sub.-- regbd &lt;= multicast.sub.-- filter.sub.--regbq;end if;case pci.sub.-- read.sub.-- addr is when read.sub.-- ram.sub.-- data =&gt;  read.sub.-- bus := multicast.sub.-- filter.sub.-- regaq(15 downto 0); when read.sub.-- ram.sub.-- datb =&gt;  read.sub.-- bus := (&#34;000000000000000&#34; &amp; multicast.sub.-- filter.sub.--regbq); when others =&gt;  read.sub.-- bus := multicast.sub.-- filter.sub.-- regaq(15 downto 0);end case;proc.sub.-- request := ram.sub.-- rd.sub.-- strobeq or ram.sub.--wr.sub.-- strobeq;if holding.sub.-- reg.sub.-- strobeq = asserted.sub.-- high then  holding.sub.-- wr.sub.-- strobed &lt;= asserted.sub.-- high;else  holding.sub.-- wr.sub.-- strobed &lt;= deasserted.sub.-- low;end if;case req.sub.-- arb.sub.-- stateq iswhen idle =&gt;next.sub.-- addr(7 downto 0) := std.sub.-- logic.sub.-- vector&#39;(&#34;00000000&#34;);if ftt.sub.-- read.sub.-- req = asserted.sub.-- high then     req.sub.-- arb.sub.-- state := gbi;elsif proc.sub.-- request = asserted.sub.-- high then     req.sub.-- arb.sub.-- state := proc;else -- no requests     req.sub.-- arb.sub.-- state := idle;end if;when gbi =&gt;next.sub.-- addr(7 downto 0) := ftt.sub.-- vlan.sub.-- id(7 downto 0);if ftt.sub.-- read.sub.-- req = asserted.sub.-- high then     req.sub.-- arb.sub.-- state := gbi;elsif proc.sub.-- request = asserted.sub.-- high then     req.sub.-- arb.sub.-- state := proc;else -- no requests     req.sub.-- arb.sub.-- state := idle;end if;when proc =&gt;next.sub.-- addr(7 downto 0) := pci.sub.-- vfi.sub.-- addr(7 downto 0);if ftt.sub.-- read.sub.-- req = asserted.sub.-- high then     req.sub.-- arb.sub.-- state := gbi;elsif proc.sub.-- request = asserted.sub.-- high then     req.sub.-- arb.sub.-- state := proc;else -- no requests     req.sub.-- arb.sub.-- state := idle;end if;when others =&gt;next.sub.-- addr(7 downto 0) := std.sub.-- logic.sub.-- vector&#39;(&#34;00000000&#34;);     req.sub.-- arb.sub.-- state := idle;end case;req.sub.-- arb.sub.-- stated &lt;= req.sub.-- arb.sub.-- state;multicast.sub.-- mask := &#34;00000000000000000&#34;;multicast.sub.-- valid := deasserted.sub.-- low;holding.sub.-- reg.sub.-- strobed &lt;= deasserted.sub.-- low;holding.sub.-- regad &lt;= holding.sub.-- regaq;holding.sub.-- regbd &lt;= holding.sub.-- regbq;case vfi.sub.-- stateq iswhen off =&gt;wrenl := deasserted.sub.-- high;if (req.sub.-- arb.sub.-- state = gbi) or ((req.sub.-- arb.sub.-- state =proc) and     (ram.sub.-- rd.sub.-- strobeq = asserted.sub.-- high)) then     vfi.sub.-- stated &lt;= read;elsif (req.sub.-- arb.sub.-- state = proc) and(ram.sub.-- wr.sub.-- strobeq = asserted.sub.-- high) then     vfi.sub.-- stated &lt;= write;else     vfi.sub.-- stated &lt;= off;end if;when read =&gt;wrenl := deasserted.sub.-- high;if (req.sub.-- arb.sub.-- stateq = gbi) then     multicast.sub.-- mask := vfr.sub.-- data;     multicast.sub.-- valid := asserted.sub.-- high;elsif (req.sub.-- arb.sub.-- stateq = proc) then     holding.sub.-- regad &lt;= vfr.sub.-- data(15 downto 0);     holding.sub.-- regbd &lt;= vfr.sub.-- data(16);     holding.sub.-- reg.sub.-- strobed &lt;= asserted.sub.-- high;end if;if (req.sub.-- arb.sub.-- state = gbi) or ((req.sub.-- arb.sub.-- state =proc) and     (ram.sub.-- rd.sub.-- strobeq = asserted.sub.-- high)) then     vfi.sub.-- stated &lt;= read;elsif (req.sub.-- arb.sub.-- state = proc) and(ram.sub.-- wr.sub.-- strobeq = asserted.sub.-- high) then     vfi.sub.-- stated &lt;= write;else     vfi.sub.-- stated &lt;= off;end if;when write =&gt;wrenl := asserted.sub.-- low;if (req.sub.-- arb.sub.-- state = gbi) or ((req.sub.-- arb.sub.-- state =proc) and     (ram.sub.-- rd.sub.-- strobeq = asserted.sub.-- high)) then     vfi.sub.-- stated &lt;= read;elsif (req.sub.-- arb.sub.-- state = proc) and(ram.sub.-- wr.sub.-- strobeq = asserted.sub.-- high) then     vfi.sub.-- stated &lt;= write;else     vfi.sub.-- stated &lt;= off;end if;when others =&gt;wrenl := deasserted.sub.-- high;vfi.sub.-- stated &lt;= off;end case;if pci.sub.-- vfr.sub.-- rd.sub.-- strobe = asserted.sub.-- high then ram.sub.-- rd.sub.-- strobed &lt;= asserted.sub.-- high;elsif req.sub.-- arb.sub.-- state = proc then ram.sub.-- rd.sub.-- strobed &lt;= deasserted.sub.-- low;else ram.sub.-- rd.sub.-- strobed &lt;= ram.sub.-- rd.sub.-- strobeq;end if;if pci.sub.-- vfr.sub.-- wr.sub.-- strobe = asserted.sub.-- high then ram.sub.-- wr.sub.-- strobed &lt;= asserted.sub.-- high;elsif req.sub.-- arb.sub.-- state = proc then ram.sub.-- wr.sub.-- strobed &lt;= deasserted.sub.-- low,else ram.sub.-- wr.sub.-- strobed &lt;= ram.sub.-- wr.sub.-- strobeq;end if;if ((pci.sub.-- gmc.sub.-- enb = deasserted.sub.-- low) and ((pci.sub.--ramtest.sub.-- write = asserted.sub.-- high)  or (pci.sub.-- ramtest.sub.-- read.sub.-- vfi = asserted.sub.-- high)))then next.sub.-- addr.sub.-- sig &lt;= ramtest.sub.-- addrq(7 downto 0); if(ramtest.sub.-- addrq(8) = &#39;1&#39;) then  ramtest.sub.-- addrd &lt;= ramtest.sub.-- addrq; else  ramtest addrd &lt;= ramtest.sub.-- addrq + &#39;1&#39;; end if,else next.sub.-- addr.sub.-- sig &lt;= next.sub.-- addr; ramtest.sub.-- addrd &lt;= &#34;000000000&#34;;end if;if ((pci.sub.-- gmc.sub.-- enb = deasserted.sub.-- low) and (pci.sub.--ramtest.sub.-- write = asserted.sub.-- high)) then out.sub.-- data := ramtest.sub.-- write.sub.-- data; if (ramtest.sub.-- addrq(8) = &#39;0&#39;) then  wrenl.sub.-- or.sub.-- clk := (isymclk or test.sub.-- mode); else  wrenl.sub.-- or.sub.-- clk := deasserted.sub.-- high; end if;else out.sub.-- data := multicast.sub.-- filter.sub.-- regbq &amp;multicast.sub.-- filter.sub.-- regaq; wrenl.sub.-- or.sub.-- clk := (wrenl or isymclk or test.sub.-- mode);end if,if (test.sub.-- mode = asserted.sub.-- high) then mask.sub.-- or.sub.-- bypass := multicast.sub.-- filter.sub.-- regbq &amp;multicast.sub.-- filter.sub.-- regaq;else mask.sub.-- or.sub.-- bypass := multicast.sub.-- mask;end if;vfi.sub.-- data   &lt;= out.sub.-- data after 2 ns;vfi.sub.-- ramtest.sub.-- data  &lt;= vfr.sub.-- data after 2 ns;vfi.sub.-- wrenl  &lt;= wrenl.sub.-- or.sub.-- clk after 2 ns;vfi.sub.-- read.sub.-- bus  &lt;= read.sub.-- bus after 2 ns;vfi.sub.-- multicast.sub.-- valid  &lt;= multicast.sub.-- valid after 2 ns;vfi.sub.-- multicast.sub.-- mask  &lt;= mask.sub.-- or.sub.-- bypass after 2ns;end process combo;isymclk.sub.-- rise : process(isymclk)beginif (isymclk&#39;event and isymclk = `1&#39;) then multicast.sub.-- filter.sub.-- regaq &lt;= multicast.sub.-- filter.sub.--regad; multicast.sub.-- filter.sub.-- regbq &lt;= multicast.sub.-- filter.sub.--regbd;end if;end process isymclk.sub.-- rise;isymclk.sub.-- rise.sub.-- clear : process(isymclk,iresetl)beginif (iresetl = asserted.sub.-- low) then ram.sub.-- rd.sub.-- strobeq &lt;= deasserted.sub.-- low; ram.sub.-- wr.sub.-- strobeq &lt;= deasserted.sub.-- low; holding.sub.-- wr.sub.-- strobeq &lt;= deasserted.sub.-- low; req.sub.-- arb.sub.-- stateq &lt;= idle; vfi.sub.-- stateq &lt;= off; holding.sub.-- regaq &lt;= &#34;0000000000000000&#34;; holding.sub.-- regbq &lt;= deasserted.sub.-- low; holding.sub.-- reg.sub.-- strobeq &lt;= deasserted.sub.-- low; ramtest.sub.-- addrq &lt;= &#34;000000000&#34;;elsif (isymclk&#39;event and isymclk = &#39;1&#39;) then ram.sub.-- rd.sub.-- strobeq &lt;= ram.sub.-- rd.sub.-- strobed; ram.sub.-- wr.sub.-- strobeq &lt;= ram.sub.-- wr.sub.-- strobed; holding.sub.-- wr.sub.-- strobeq &lt;= holding.sub.-- wr.sub.-- strobed; req.sub.-- arb.sub.-- stateq &lt;= req.sub.-- arb.sub.-- stated; vfi.sub.-- stateq &lt;= vfi.sub.-- stated; holding.sub.-- regaq &lt;= holding.sub.-- regad; holding.sub.-- regbq &lt;= holding.sub.-- regbd; holding.sub.-- reg.sub.-- strobeq &lt;= holding.sub.-- reg.sub.-- strobed; ramtest.sub.-- addrq &lt;= ramtest.sub.-- addrd;end if;end process isymclk.sub.-- rise.sub.-- clear;latch.sub.-- wraddr : process(wrenl.sub.-- in,next.sub.-- addr.sub.-- sig,test.sub.-- mode,iresetl)beginif (iresetl = asserted.sub.-- low) then vfi.sub.-- addr &lt;= addr zero after 2 ns;elsif ((test.sub.-- mode = &#39;1&#39;) OR (wrenl.sub.-- in = &#39;1&#39;)) then vfi.sub.-- addr &lt;= next.sub.-- addr.sub.-- sig after 2 ns;end if,end process latch.sub.-- wraddr;end behavior;__________________________________________________________________________