예제 #1
0
        /// <summary>
        /// Performs resource allocation and binding.
        /// </summary>
        /// <param name="dpb">datapath builder to use</param>
        /// <returns>resulting flow matrix</returns>
        public FlowMatrix Allocate(IDatapathBuilder dpb)
        {
            // Step 1: create intermediate storage for each instruction output slot
            var tempSignals = new SLVSignal[_func.SlotTypes.Length];

            for (int i = 0; i < _func.SlotTypes.Length; i++)
            {
                int width   = TypeLowering.Instance.GetWireWidth(_func.SlotTypes[i]);
                var initial = StdLogicVector.Us(width);
                tempSignals[i] = (SLVSignal)Signals.CreateInstance(initial);
                tempSignals[i].Descriptor.TagTemporary(i);
            }

            // Step 2: Allocate and establish unit bindings
            Action <IXILMapping> onAlloc = map => dpb.AddFU(map.TASite.Host);

            _alloc.OnFUAllocation += onAlloc;
            var mappings = new Dictionary <int, IXILMapping>();

            foreach (var xil3i in _func.Instructions)
            {
                TypeDescriptor[] otypes = xil3i.OperandSlots.Select(i => _func.SlotTypes[i]).ToArray();
                TypeDescriptor[] rtypes = xil3i.ResultSlots.Select(i => _func.SlotTypes[i]).ToArray();
                long             cstep  = CStep[xil3i];
                var mapping             = _alloc.TryBind(xil3i, cstep, otypes, rtypes);
                if (mapping == null)
                {
                    throw new XILSchedulingFailedException("Realization failed: " + xil3i.Command);
                }
                mappings[xil3i.Index] = mapping;
                mapping.TASite.Establish(dpb.FUBinder);
                Allocator.Policy.TellMapping(xil3i, cstep, mapping);
            }
            _alloc.OnFUAllocation -= onAlloc;

            // Step 3: Assemble flow matrix
            var result = new FlowMatrix();

            foreach (var xil3i in _func.Instructions)
            {
                long cstep   = CStep[xil3i];
                var  mapping = mappings[xil3i.Index];
                result.AddNeutral(mapping.TASite.DoNothing());
                var impl = mapping.Realize(
                    xil3i.OperandSlots.Select(s => tempSignals[s].AsSignalSource <StdLogicVector>()).ToArray(),
                    xil3i.ResultSlots.Select(s => tempSignals[s].AsCombSink()).ToArray());
                if (impl.Count() - Latency[xil3i] > 1)
                {
                    throw new XILSchedulingFailedException("Mapping length exceeds scheduled latency");
                }
                result.Add((int)cstep, impl);
                result.AppendComment((int)cstep, ToComment(xil3i));
                _mappingCache[xil3i.Index] = mapping;
            }

            return(result);
        }
예제 #2
0
            public override void Establish(IAutoBinder binder)
            {
                if (_realized)
                {
                    return;
                }

                _inSignals = _argWidths.Select((w, i) =>
                                               (SLVSignal)binder.GetSignal(EPortUsage.Default, "concat" + i, null,
                                                                           StdLogicVector.Us(w))).ToArray();
                int total = _argWidths.Sum();

                _outSignal = (SLVSignal)binder.GetSignal(EPortUsage.Default, "concout", null, StdLogicVector.Us(total));
                var pb  = new ConcatProcessBuilder(this);
                var alg = pb.GetAlgorithm();

                alg.Name = "concatenize";
                binder.CreateProcess(Process.EProcessKind.Triggered, alg, _inSignals.Select(s => s.Descriptor).ToArray());
                _realized = true;
            }
예제 #3
0
 /// <summary>
 /// Constructs an instance.
 /// </summary>
 /// <param name="depth">desired ROM capacity (number of data words)</param>
 /// <param name="width">desired data word width</param>
 public ROM(uint depth, uint width)
 {
     _depth   = depth;
     _width   = width;
     _content = Enumerable.Repeat(StdLogicVector.Us(width), (int)depth).ToArray();
 }
예제 #4
0
 /// <summary>
 /// Constructs a new instance.
 /// </summary>
 /// <param name="depth">desired capacity (number of data words)</param>
 /// <param name="width">desired data word width</param>
 public SimpleDPRAM(uint depth, uint width)
 {
     _depth   = MathExt.CeilPow2(depth);
     _width   = width;
     _content = Enumerable.Repeat(StdLogicVector.Us(width), (int)_depth).ToArray();
 }
예제 #5
0
        /// <summary>
        /// Creates an instance.
        /// </summary>
        /// <param name="userLogic">component under test</param>
        public AXIMasterUserLogicTestbench(AXIMasterUserLogic userLogic)
        {
            user_logic = userLogic;

            _sig_Bus2IP_Clk    = new SLSignal();
            _sig_Bus2IP_Resetn = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_Bus2IP_Data = new SLVSignal(userLogic.SLVDWidth)
            {
                InitialValue = StdLogicVector.Xs(userLogic.SLVDWidth)
            };
            _sig_Bus2IP_BE = new SLVSignal(userLogic.SLVDWidth / 8)
            {
                InitialValue = StdLogicVector._0s(userLogic.SLVDWidth / 8)
            };
            _sig_Bus2IP_RdCE = new SLVSignal(userLogic.NumRegs)
            {
                InitialValue = StdLogicVector._0s(userLogic.NumRegs)
            };
            _sig_Bus2IP_WrCE = new SLVSignal(userLogic.NumRegs)
            {
                InitialValue = StdLogicVector._0s(userLogic.NumRegs)
            };
            _sig_IP2Bus_Data = new SLVSignal(userLogic.SLVDWidth)
            {
                InitialValue = StdLogicVector._0s(userLogic.SLVDWidth)
            };
            _sig_IP2Bus_RdAck = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_IP2Bus_WrAck = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_IP2Bus_Error = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_ip2bus_mstrd_req = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_ip2bus_mstwr_req = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_ip2bus_mst_addr = new SLVSignal(userLogic.MasterAXIAddrWidth)
            {
                InitialValue = StdLogicVector.Us(userLogic.MasterAXIAddrWidth)
            };
            _sig_ip2bus_mst_be = new SLVSignal(userLogic.NativeDataWidth / 8)
            {
                InitialValue = StdLogicVector._1s(userLogic.NativeDataWidth / 8)
            };
            _sig_ip2bus_mst_length = new SLVSignal(userLogic.LengthWidth)
            {
                InitialValue = StdLogicVector._0s(userLogic.LengthWidth)
            };
            _sig_ip2bus_mst_type = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_ip2bus_mst_lock = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_ip2bus_mst_reset = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mst_cmdack = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mst_cmplt = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mst_error = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mst_rearbitrate = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mst_cmd_timeout = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mstrd_d   = new SLVSignal(userLogic.NativeDataWidth);
            _sig_bus2ip_mstrd_rem = new SLVSignal(userLogic.NativeDataWidth / 8)
            {
                InitialValue = StdLogicVector._0s(userLogic.NativeDataWidth / 8)
            };
            _sig_bus2ip_mstrd_sof_n = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mstrd_eof_n = new SLSignal()
            {
                InitialValue = '0'
            };
            _sig_bus2ip_mstrd_src_rdy_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_bus2ip_mstrd_src_dsc_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_ip2bus_mstrd_dst_rdy_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_ip2bus_mstrd_dst_dsc_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_ip2bus_mstwr_d   = new SLVSignal(userLogic.NativeDataWidth);
            _sig_ip2bus_mstwr_rem = new SLVSignal(userLogic.NativeDataWidth / 8)
            {
                InitialValue = StdLogicVector._0s(userLogic.NativeDataWidth / 8)
            };
            _sig_ip2bus_mstwr_src_rdy_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_ip2bus_mstwr_src_dsc_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_ip2bus_mstwr_sof_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_ip2bus_mstwr_eof_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_bus2ip_mstwr_dst_rdy_n = new SLSignal()
            {
                InitialValue = '1'
            };
            _sig_bus2ip_mstwr_dst_dsc_n = new SLSignal()
            {
                InitialValue = '1'
            };

            userLogic.Bus2IP_Clk             = _sig_Bus2IP_Clk;
            userLogic.Bus2IP_BE              = _sig_Bus2IP_BE;
            userLogic.Bus2IP_Clk             = _sig_Bus2IP_Clk;
            userLogic.Bus2IP_Data            = _sig_Bus2IP_Data;
            userLogic.Bus2IP_RdCE            = _sig_Bus2IP_RdCE;
            userLogic.Bus2IP_Resetn          = _sig_Bus2IP_Resetn;
            userLogic.Bus2IP_WrCE            = _sig_Bus2IP_WrCE;
            userLogic.IP2Bus_Data            = _sig_IP2Bus_Data;
            userLogic.IP2Bus_Error           = _sig_IP2Bus_Error;
            userLogic.IP2Bus_RdAck           = _sig_IP2Bus_RdAck;
            userLogic.IP2Bus_WrAck           = _sig_IP2Bus_WrAck;
            userLogic.ip2bus_mstrd_req       = _sig_ip2bus_mstrd_req;
            userLogic.ip2bus_mstwr_req       = _sig_ip2bus_mstwr_req;
            userLogic.ip2bus_mst_addr        = _sig_ip2bus_mst_addr;
            userLogic.ip2bus_mst_be          = _sig_ip2bus_mst_be;
            userLogic.ip2bus_mst_length      = _sig_ip2bus_mst_length;
            userLogic.ip2bus_mst_type        = _sig_ip2bus_mst_type;
            userLogic.ip2bus_mst_lock        = _sig_ip2bus_mst_lock;
            userLogic.ip2bus_mst_reset       = _sig_ip2bus_mst_reset;
            userLogic.bus2ip_mst_cmdack      = _sig_bus2ip_mst_cmdack;
            userLogic.bus2ip_mst_cmplt       = _sig_bus2ip_mst_cmplt;
            userLogic.bus2ip_mst_error       = _sig_bus2ip_mst_error;
            userLogic.bus2ip_mst_rearbitrate = _sig_bus2ip_mst_rearbitrate;
            userLogic.bus2ip_mst_cmd_timeout = _sig_bus2ip_mst_cmd_timeout;
            userLogic.bus2ip_mstrd_d         = _sig_bus2ip_mstrd_d;
            userLogic.bus2ip_mstrd_rem       = _sig_bus2ip_mstrd_rem;
            userLogic.bus2ip_mstrd_sof_n     = _sig_bus2ip_mstrd_sof_n;
            userLogic.bus2ip_mstrd_eof_n     = _sig_bus2ip_mstrd_eof_n;
            userLogic.bus2ip_mstrd_src_rdy_n = _sig_bus2ip_mstrd_src_rdy_n;
            userLogic.bus2ip_mstrd_src_dsc_n = _sig_bus2ip_mstrd_src_dsc_n;
            userLogic.ip2bus_mstrd_dst_rdy_n = _sig_ip2bus_mstrd_dst_rdy_n;
            userLogic.ip2bus_mstrd_dst_dsc_n = _sig_ip2bus_mstrd_dst_dsc_n;
            userLogic.ip2bus_mstwr_d         = _sig_ip2bus_mstwr_d;
            userLogic.ip2bus_mstwr_rem       = _sig_ip2bus_mstwr_rem;
            userLogic.ip2bus_mstwr_src_rdy_n = _sig_ip2bus_mstwr_src_rdy_n;
            userLogic.ip2bus_mstwr_src_dsc_n = _sig_ip2bus_mstwr_src_dsc_n;
            userLogic.ip2bus_mstwr_sof_n     = _sig_ip2bus_mstwr_sof_n;
            userLogic.ip2bus_mstwr_eof_n     = _sig_ip2bus_mstwr_eof_n;
            userLogic.bus2ip_mstwr_dst_rdy_n = _sig_bus2ip_mstwr_dst_rdy_n;
            userLogic.bus2ip_mstwr_dst_dsc_n = _sig_bus2ip_mstwr_dst_dsc_n;

            _clockGen = new Clock(new Time(10.0, ETimeUnit.ns))
            {
                Clk = _sig_Bus2IP_Clk
            };
        }