def test_frameHeader(self): DW = 64 tmpl = TransTmpl(frameHeader) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(frameHeader_str, frames[0].__repr__())
def instantiateFrameForge(self, structT, DATA_WIDTH=64, maxFrameLen=inf, maxPaddingWords=inf, trimPaddingWordsOnStart=False, trimPaddingWordsOnEnd=False, randomized=True): tmpl = TransTmpl(structT) frames = list(FrameTmpl.framesFromTransTmpl( tmpl, DATA_WIDTH, maxFrameLen=maxFrameLen, maxPaddingWords=maxPaddingWords, trimPaddingWordsOnStart=trimPaddingWordsOnStart, trimPaddingWordsOnEnd=trimPaddingWordsOnEnd)) u = self.u = AxiS_frameForge(structT, tmpl, frames) self.DATA_WIDTH = DATA_WIDTH self.m = mask(self.DATA_WIDTH // 8) u.DATA_WIDTH.set(self.DATA_WIDTH) self.prepareUnit(self.u) if randomized: self.randomize(u.dataOut) for intf in u.dataIn._fieldsToInterfaces.values(): self.randomize(intf)
def _test(self, DW, t, ref_str): tmpl = TransTmpl(t) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW) frames = list(frames) self.assertEqual(len(frames), len(ref_str)) for f, ref in zip(frames, ref_str): self.assertEqual(repr(f), ref)
def test_sWithPadding(self): DW = 64 tmpl = TransTmpl(sWithPadding) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(sWithPadding_str, frames[0].__repr__())
def test_stream1_32(self): DW = 32 tmpl = TransTmpl(stream0) frames = list(FrameTmpl.framesFromTransTmpl(tmpl, DW)) self.assertEqual(len(frames), 1) s = frames[0].__repr__() self.assertEqual(stream1_32bit_str, s)
def test_union0at16b(self): DW = 16 tmpl = TransTmpl(union0) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(repr(frames[0]), union0_16b_str)
def test_basic_tripleFrame(self): DW = 64 tmpl = TransTmpl(s_basic) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW, maxFrameLen=64) frames = list(frames) self.assertEqual(len(frames), 3) for f, ref in zip(frames, s_basic_3frame_srt): self.assertEqual(repr(f), ref)
def parseTemplate(self): if self._tmpl is None: self._tmpl = TransTmpl(self._structT) if self._frames is None: DW = int(self.DATA_WIDTH) frames = FrameTmpl.framesFromTransTmpl(self._tmpl, DW) self._frames = list(frames)
def test_struct_with_union(self): DW = 64 tmpl = TransTmpl(struct_with_union) frames = FrameTmpl.framesFromTransTmpl( tmpl, DW, ) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(repr(frames[0]), struct_with_union_str)
def test_s2_oneFrame(self): DW = 64 tmpl = TransTmpl(s2) frames = FrameTmpl.framesFromTransTmpl( tmpl, DW, ) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(repr(frames[0]), s2_oneFrame)
def test_frameHeader_trimmed(self): DW = 64 tmpl = TransTmpl(frameHeader) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) frames = list(frames) self.assertEqual([f.__repr__() for f in frames], frameHeader_trimm_str)
def test_multiframe(self): tmpl = TransTmpl(s0) DATA_WIDTH = 64 frames = list( FrameTmpl.framesFromTransTmpl(tmpl, DATA_WIDTH, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True)) u = StructReader(s0, tmpl=tmpl, frames=frames) self._test_s0(u)
def test_multiframe(self): tmpl = TransTmpl(s0) DATA_WIDTH = 64 frames = list(FrameTmpl.framesFromTransTmpl( tmpl, DATA_WIDTH, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True)) u = StructReader(s0, tmpl=tmpl, frames=frames) self._test_s0(u)
def test_s2_oneFrame_tryToTrim(self): DW = 64 tmpl = TransTmpl(s2) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(repr(frames[0]), s2_oneFrame)
def test_sWithStartPaddingKept(self): DW = 64 tmpl = TransTmpl(sWithStartPadding) frames = FrameTmpl.framesFromTransTmpl( tmpl, DW, maxPaddingWords=2, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(sWithStartPadding_strKept, frames[0].__repr__())
def test_sWithStartPaddingKept(self): DW = 64 tmpl = TransTmpl(sWithStartPadding) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW, maxPaddingWords=2, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(sWithStartPadding_strKept, frames[0].__repr__())
def parseTemplate(self): if self._tmpl is None: self._tmpl = TransTmpl(self._structT) if self._frames is None: DW = int(self.DATA_WIDTH) frames = FrameTmpl.framesFromTransTmpl( self._tmpl, DW, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) self._frames = list(frames)
def test_s2_oneFrame_tryToTrim(self): DW = 64 tmpl = TransTmpl(s2) frames = FrameTmpl.framesFromTransTmpl( tmpl, DW, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True ) frames = list(frames) self.assertEqual(len(frames), 1) self.assertEqual(repr(frames[0]), s2_oneFrame)
def test_sWithPaddingMultiFrame(self): DW = 64 tmpl = TransTmpl(sWithPadding) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) frames = list(frames) self.assertEqual(len(frames), 2) for frame, s in zip(frames, sWithPaddingMultiframe_str): self.assertEqual(s, frame.__repr__())
def test_sWithPaddingMultiFrame(self): DW = 64 tmpl = TransTmpl(sWithPadding) frames = FrameTmpl.framesFromTransTmpl( tmpl, DW, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) frames = list(frames) self.assertEqual(len(frames), 2) for frame, s in zip(frames, sWithPaddingMultiframe_str): self.assertEqual(s, frame.__repr__())
def test_frameHeader_splited(self): DW = 64 tmpl = TransTmpl(frameHeader) frames = FrameTmpl.framesFromTransTmpl( tmpl, DW, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True ) frames = list(frames) self.assertEqual(len(frames), 2) for frame, s, end in zip(frames, frameHeader_split_str, [2 * DW, 5 * DW]): self.assertEqual(s, frame.__repr__()) self.assertEqual(frame.endBitAddr, end)
def test_frameHeader_splited(self): DW = 64 tmpl = TransTmpl(frameHeader) frames = FrameTmpl.framesFromTransTmpl(tmpl, DW, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True) frames = list(frames) self.assertEqual(len(frames), 2) for frame, s, end in zip(frames, frameHeader_split_str, [2 * DW, 5 * DW]): self.assertEqual(s, frame.__repr__()) self.assertEqual(frame.endBitAddr, end)
def test_simpleOp(self): DW = 64 AW = 32 u = EthAddrUpdater() u.DATA_WIDTH.set(DW) u.ADDR_WIDTH.set(AW) self.prepareUnit(u) r = self.randomize r(u.axi_m.ar) r(u.axi_m.r) r(u.axi_m.aw) r(u.axi_m.w) r(u.axi_m.b) m = Axi3DenseMem(u.clk, u.axi_m) tmpl = TransTmpl(frameHeader) frameTmpl = list(FrameTmpl.framesFromTransTmpl(tmpl, DW))[0] def randFrame(): rand = self._rand.getrandbits data = { "eth": { "src": rand(48), "dst": rand(48) }, "ipv4": { "src": rand(32), "dst": rand(32) } } d = list(frameTmpl.packData(data)) ptr = m.calloc(ceil(frameHeader.bit_length() / DW), DW // 8, initValues=d) return ptr, data framePtr, frameData = randFrame() u.packetAddr._ag.data.append(framePtr) self.runSim(1000 * Time.ns) updatedFrame = m.getStruct(framePtr, tmpl) self.assertValEqual(updatedFrame.eth.src, frameData["eth"]['dst']) self.assertValEqual(updatedFrame.eth.dst, frameData["eth"]['src']) self.assertValEqual(updatedFrame.ipv4.src, frameData["ipv4"]['dst']) self.assertValEqual(updatedFrame.ipv4.dst, frameData["ipv4"]['src'])
def test_simpleOp(self): DW = 64 AW = 32 u = EthAddrUpdater() u.DATA_WIDTH.set(DW) u.ADDR_WIDTH.set(AW) self.prepareUnit(u) r = self.randomize r(u.axi_m.ar) r(u.axi_m.r) r(u.axi_m.aw) r(u.axi_m.w) r(u.axi_m.b) m = Axi3DenseMem(u.clk, u.axi_m) tmpl = TransTmpl(frameHeader) frameTmpl = list(FrameTmpl.framesFromTransTmpl(tmpl, DW))[0] def randFrame(): rand = self._rand.getrandbits data = {"eth": {"src": rand(48), "dst": rand(48) }, "ipv4": {"src": rand(32), "dst": rand(32) } } d = list(frameTmpl.packData(data)) ptr = m.calloc(ceil(frameHeader.bit_length() / DW), DW // 8, initValues=d) return ptr, data framePtr, frameData = randFrame() u.packetAddr._ag.data.append(framePtr) self.runSim(1000 * Time.ns) updatedFrame = m.getStruct(framePtr, tmpl) self.assertValEqual(updatedFrame.eth.src, frameData["eth"]['dst']) self.assertValEqual(updatedFrame.eth.dst, frameData["eth"]['src']) self.assertValEqual(updatedFrame.ipv4.src, frameData["ipv4"]['dst']) self.assertValEqual(updatedFrame.ipv4.dst, frameData["ipv4"]['src'])
def test_simpleOp(self): DW = self.DW u = self.u r = self.randomize r(u.axi_m.ar) r(u.axi_m.r) r(u.axi_m.aw) r(u.axi_m.w) r(u.axi_m.b) m = AxiSimRam(u.axi_m) tmpl = TransTmpl(frameHeader) frameTmpl = list(FrameTmpl.framesFromTransTmpl(tmpl, DW))[0] def randFrame(): rand = self._rand.getrandbits data = { "eth": { "src": rand(48), "dst": rand(48), }, "ipv4": { "src": rand(32), "dst": rand(32), } } d = list(frameTmpl.packData(data)) ptr = m.calloc( ceil(frameHeader.bit_length() / DW), DW // 8, initValues=d, keepOut=self.OFFSET, ) return ptr, data framePtr, frameData = randFrame() u.packetAddr._ag.data.append(framePtr) self.runSim(100 * CLK_PERIOD) updatedFrame = m.getStruct(framePtr, tmpl) self.assertValEqual(updatedFrame.eth.src, frameData["eth"]['dst']) self.assertValEqual(updatedFrame.eth.dst, frameData["eth"]['src']) self.assertValEqual(updatedFrame.ipv4.src, frameData["ipv4"]['dst']) self.assertValEqual(updatedFrame.ipv4.dst, frameData["ipv4"]['src'])
def test_s2Pading_spliting(self): structT = s2Pading self.DATA_WIDTH = 64 tmpl = TransTmpl(structT) frames = list(FrameTmpl.framesFromTransTmpl( tmpl, self.DATA_WIDTH, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True)) u = self.u = AxiS_frameForge(structT, tmpl, frames) u.DATA_WIDTH.set(self.DATA_WIDTH) m = mask(self.DATA_WIDTH // 8) self.prepareUnit(self.u) def enDataOut(s): u.dataOut._ag.enable = False yield s.wait(50 * Time.ns) u.dataOut._ag.enable = True self.procs.append(enDataOut) MAGIC = 468 u.dataIn.item0_0._ag.data.append(MAGIC) u.dataIn.item0_1._ag.data.append(MAGIC + 1) u.dataIn.item1_0._ag.data.append(MAGIC + 2) u.dataIn.item1_1._ag.data.append(MAGIC + 3) t = 200 self.runSim(t * Time.ns) self.assertValSequenceEqual(u.dataOut._ag.data, [(MAGIC, m, 0), (MAGIC + 1, m, 1), (MAGIC + 2, m, 0), (MAGIC + 3, m, 1), ])
def instantiate(self, structT, DATA_WIDTH=64, maxFrameLen=inf, maxPaddingWords=inf, trimPaddingWordsOnStart=False, trimPaddingWordsOnEnd=False, randomized=True, use_strb=False, use_keep=True): if maxFrameLen is not inf\ or maxPaddingWords is not inf\ or trimPaddingWordsOnStart is not False\ or trimPaddingWordsOnEnd is not False: tmpl = TransTmpl(structT) frames = list( FrameTmpl.framesFromTransTmpl( tmpl, DATA_WIDTH, maxFrameLen=maxFrameLen, maxPaddingWords=maxPaddingWords, trimPaddingWordsOnStart=trimPaddingWordsOnStart, trimPaddingWordsOnEnd=trimPaddingWordsOnEnd)) else: tmpl = None frames = None u = self.u = AxiS_frameDeparser(structT, tmpl, frames) u.DATA_WIDTH = self.DATA_WIDTH = DATA_WIDTH u.USE_STRB = use_strb u.USE_KEEP = use_keep self.m = mask(self.DATA_WIDTH // 8) self.compileSimAndStart(self.u) if randomized: self.randomize(u.dataOut) for intf in u.dataIn._fieldsToInterfaces.values(): self.randomize(intf)
def test_s0at71bit(self): DW = 71 tmpl = TransTmpl(s0) frames = list(FrameTmpl.framesFromTransTmpl(tmpl, DW)) self.assertEqual(len(frames), 1) self.assertEqual(s0at71bit_str, frames[0].__repr__(scale=2))
def test_stream0(self): DW = 8 tmpl = TransTmpl(stream0) frames = list(FrameTmpl.framesFromTransTmpl(tmpl, DW)) self.assertEqual(len(frames), 1) self.assertEqual(stream0_8bit_str, frames[0].__repr__())
def test_s1at64(self): DW = 64 tmpl = TransTmpl(s1) frames = list(FrameTmpl.framesFromTransTmpl(tmpl, DW)) self.assertEqual(len(frames), 1) self.assertEqual(s1_str, frames[0].__repr__())
def _parseTemplate(self): self.WORD_ADDR_STEP = self._getWordAddrStep() self.ADDR_STEP = self._getAddrStep() AW = int(self.ADDR_WIDTH) SUGGESTED_AW = self._suggestedAddrWidth() assert SUGGESTED_AW <= AW, ("Address width too small", SUGGESTED_AW, AW) tmpl = TransTmpl(self.STRUCT_TEMPLATE) self._ADDR_MIN = TransTmpl_get_min_addr(tmpl) // self.ADDR_STEP self._ADDR_MAX = ceil(TransTmpl_get_max_addr(tmpl) / self.ADDR_STEP) # resolve addresses for bram port mapped fields self._bramPortMapped = [] def shouldEnterFn(trans_tmpl: TransTmpl): p = trans_tmpl.getFieldPath() intf = self.decoded._fieldsToInterfaces[p] if isinstance(intf, (StructIntf, UnionSink, UnionSource, HObjList)): shouldEnter = True shouldUse = False elif isinstance(intf, BramPort_withoutClk): shouldEnter = False shouldUse = True else: shouldEnter = False shouldUse = False return shouldEnter, shouldUse for ((base, end), t) in tmpl.walkFlatten(shouldEnterFn=shouldEnterFn): self._bramPortMapped.append(((base, end), t)) # resolve exact addresses for directly mapped field parts directly_mapped_fields = {} for p, out in self.decoded._fieldsToInterfaces.items(): if not isinstance(out, (RegCntrl, Signal)): continue a = directly_mapped_fields for _p in p: if isinstance(_p, int) and _p != 0: # we need spec only for first array item break a = a.setdefault(_p, {}) dmw = self._directly_mapped_words = [] if directly_mapped_fields: DW = self.DATA_WIDTH directly_mapped_t = HdlType_select(self.STRUCT_TEMPLATE, directly_mapped_fields) tmpl = TransTmpl(directly_mapped_t) frames = list( FrameTmpl.framesFromTransTmpl( tmpl, DW, maxPaddingWords=0, trimPaddingWordsOnStart=True, trimPaddingWordsOnEnd=True, )) for f in frames: f_word_offset = f.startBitAddr // DW for (w_i, items) in f.walkWords(showPadding=True): dmw.append((w_i + f_word_offset, items))