/// <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); }
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; }
/// <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(); }
/// <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(); }
/// <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 }; }