save to correct files, unit test 15
[ieee754fpu.git] / src / add / test_buf_pipe.py
index f79863dfa4ba5763d00f86129b214180026e1064..7bf5257f15e07b08a172d1424728dd3b2badd897 100644 (file)
@@ -26,7 +26,9 @@ from example_buf_pipe import PrevControl, NextControl, BufferedPipeline
 from example_buf_pipe import StageChain, ControlBase, StageCls
 from singlepipe import UnbufferedPipeline2
 
-from random import randint
+from random import randint, seed
+
+#seed(0)
 
 
 def check_o_n_valid(dut, val):
@@ -225,6 +227,7 @@ class Test5:
             stall_range = randint(0, 3)
             for j in range(randint(1,10)):
                 ready = randint(0, stall_range) != 0
+                ready = True
                 yield self.dut.n.i_ready.eq(ready)
                 yield
                 o_n_valid = yield self.dut.n.o_valid
@@ -325,8 +328,8 @@ def data_chain2():
 def test9_resultfn(o_data, expected, i, o):
     res = expected + 2
     assert o_data == res, \
-                "%d-%d data %x not match %s\n" \
-                % (i, o, o_data, repr(expected))
+                "%d-%d received data %x not match expected %x\n" \
+                % (i, o, o_data, res)
 
 
 ######################################################################
@@ -587,8 +590,9 @@ class ExampleStageDelayCls(StageCls):
         fashion
     """
 
-    def __init__(self):
+    def __init__(self, valid_trigger=2):
         self.count = Signal(2)
+        self.valid_trigger = valid_trigger
 
     def ispec(self):
         return Signal(16, name="example_input_signal")
@@ -598,12 +602,12 @@ class ExampleStageDelayCls(StageCls):
 
     @property
     def d_ready(self):
-        return self.count == 2
+        return (self.count == 1)# | (self.count == 3)
         return Const(1)
 
     @property
     def d_valid(self):
-        return self.count == 0
+        return self.count == self.valid_trigger
         return Const(1)
 
     def process(self, i):
@@ -629,29 +633,12 @@ class ExampleBufDelayedPipe(BufferedPipeline):
         return m
 
 
-class ExampleBufPipe3(ControlBase):
-    """ Example of how to do delayed pipeline, where the stage signals
-        whether it is ready.
-    """
-
-    def elaborate(self, platform):
-        m = ControlBase._elaborate(self, platform)
-
-        #pipe1 = ExampleBufPipe()
-        pipe1 = ExampleBufDelayedPipe()
-        pipe2 = ExampleBufDelayedPipe()
-
-        m.submodules.pipe1 = pipe1
-        m.submodules.pipe2 = pipe2
-
-        m.d.comb += self.connect([pipe1, pipe2])
-
-        return m
-
 def data_chain1():
         data = []
         for i in range(num_tests):
+            #data.append(1<<((i*2)%15))
             data.append(randint(0, 1<<16-2))
+            print (hex(data[-1]))
         return data
 
 
@@ -677,8 +664,58 @@ class ExampleUnBufDelayedPipe(UnbufferedPipeline):
         m.submodules.stage = self.stage
         return m
 
+######################################################################
+# Test 14
+######################################################################
+
+class ExampleBufPipe3(ControlBase):
+    """ Example of how to do delayed pipeline, where the stage signals
+        whether it is ready.
+    """
+
+    def elaborate(self, platform):
+        m = ControlBase._elaborate(self, platform)
+
+        pipe1 = ExampleBufDelayedPipe()
+        pipe2 = ExampleBufPipe()
+
+        m.submodules.pipe1 = pipe1
+        m.submodules.pipe2 = pipe2
+
+        m.d.comb += self.connect([pipe1, pipe2])
+
+        return m
+
+######################################################################
+# Test 15
+######################################################################
+
+class ExampleBufModeAdd1Pipe(BufferedPipeline):
+
+    def __init__(self):
+        stage = ExampleStageCls()
+        BufferedPipeline.__init__(self, stage, buffermode=False)
+
+
+class ExampleBufModeUnBufPipe(ControlBase):
+
+    def elaborate(self, platform):
+        m = ControlBase._elaborate(self, platform)
+
+        pipe1 = ExampleBufModeAdd1Pipe()
+        pipe2 = ExampleBufAdd1Pipe()
+
+        m.submodules.pipe1 = pipe1
+        m.submodules.pipe2 = pipe2
+
+        m.d.comb += self.connect([pipe1, pipe2])
+
+        return m
+
+
 ######################################################################
 # Test 999 - XXX FAILS
+# http://bugs.libre-riscv.org/show_bug.cgi?id=57
 ######################################################################
 
 class ExampleBufAdd1Pipe(BufferedPipeline):
@@ -688,11 +725,11 @@ class ExampleBufAdd1Pipe(BufferedPipeline):
         BufferedPipeline.__init__(self, stage)
 
 
-class ExampleUnBufAdd1Pipe(UnbufferedPipeline2):
+class ExampleUnBufAdd1Pipe(UnbufferedPipeline):
 
     def __init__(self):
         stage = ExampleStageCls()
-        UnbufferedPipeline2.__init__(self, stage)
+        UnbufferedPipeline.__init__(self, stage)
 
 
 class ExampleBufUnBufPipe(ControlBase):
@@ -703,6 +740,8 @@ class ExampleBufUnBufPipe(ControlBase):
         # XXX currently fails: any other permutation works fine.
         # p1=u,p2=b ok p1=u,p2=u ok p1=b,p2=b ok
         # also fails using UnbufferedPipeline as well
+        #pipe1 = ExampleUnBufAdd1Pipe()
+        #pipe2 = ExampleBufAdd1Pipe()
         pipe1 = ExampleBufAdd1Pipe()
         pipe2 = ExampleUnBufAdd1Pipe()
 
@@ -718,7 +757,7 @@ class ExampleBufUnBufPipe(ControlBase):
 # Unit Tests
 ######################################################################
 
-num_tests = 100
+num_tests = 10
 
 if __name__ == '__main__':
     print ("test 1")
@@ -817,7 +856,6 @@ if __name__ == '__main__':
 
 
     print ("test 12")
-    #dut = ExampleBufPipe3()
     dut = ExampleBufDelayedPipe()
     data = data_chain1()
     test = Test5(dut, test12_resultfn, data=data)
@@ -830,7 +868,6 @@ if __name__ == '__main__':
         f.write(vl)
 
     print ("test 13")
-    #dut = ExampleBufPipe3()
     dut = ExampleUnBufDelayedPipe()
     data = data_chain1()
     test = Test5(dut, test12_resultfn, data=data)
@@ -842,6 +879,30 @@ if __name__ == '__main__':
     with open("test_unbufpipe13.il", "w") as f:
         f.write(vl)
 
+    print ("test 14")
+    dut = ExampleBufPipe3()
+    data = data_chain1()
+    test = Test5(dut, test9_resultfn, data=data)
+    run_simulation(dut, [test.send, test.rcv], vcd_name="test_bufpipe14.vcd")
+    ports = [dut.p.i_valid, dut.n.i_ready,
+             dut.n.o_valid, dut.p.o_ready] + \
+             [dut.p.i_data] + [dut.n.o_data]
+    vl = rtlil.convert(dut, ports=ports)
+    with open("test_bufpipe14.il", "w") as f:
+        f.write(vl)
+
+    print ("test 15)")
+    dut = ExampleBufModeUnBufPipe()
+    data = data_chain1()
+    test = Test5(dut, test9_resultfn, data=data)
+    run_simulation(dut, [test.send, test.rcv], vcd_name="test_bufunbuf15.vcd")
+    ports = [dut.p.i_valid, dut.n.i_ready,
+             dut.n.o_valid, dut.p.o_ready] + \
+             [dut.p.i_data] + [dut.n.o_data]
+    vl = rtlil.convert(dut, ports=ports)
+    with open("test_bufunbuf15.il", "w") as f:
+        f.write(vl)
+
     print ("test 999 (expected to fail, which is a bug)")
     dut = ExampleBufUnBufPipe()
     data = data_chain1()