OpenCores
URL https://opencores.org/ocsvn/dmt_tx/dmt_tx/trunk

Subversion Repositories dmt_tx

[/] [dmt_tx/] [trunk/] [myhdl/] [test/] [test_queue.py] - Blame information for rev 33

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 33 dannori
 
2
import unittest
3
 
4
from myhdl import *
5
 
6
from rtl.queue import queue, simple_reg
7
 
8
 
9
class TestQueue(unittest.TestCase):
10
 
11
 
12
  def test_simple_reg(self):
13
    def bench():
14
      width = 4
15
      m = 2**(width-1)
16
 
17
      # set some stimulus values, need to be in range of width
18
      value1 = 7
19
      value2 = -8
20
      value3 = -3
21
 
22
      clk, reset, w_en = [Signal(bool(0)) for i in range(3)]
23
      d_i, d_o = [Signal(intbv(0, min=-m, max=m)) for i in range(2)]
24
      simple_reg_inst = simple_reg(clk, reset, w_en, d_i, d_o)
25
 
26
      @always(delay(10))
27
      def clkgen():
28
        clk.next = not clk
29
 
30
      @instance
31
      def stimulus():
32
 
33
        # reset the reg
34
        w_en.next = False
35
        reset.next = True
36
        yield clk.negedge
37
        reset.next = False
38
        yield clk.negedge
39
 
40
 
41
        # write a value and expect it as output
42
        w_en.next = True
43
        d_i.next = value1
44
        yield clk.negedge
45
 
46
        # apply a new input value with w_en=False and expect the old
47
        # output to remain
48
        w_en.next = False
49
        d_i.next = value2
50
        yield clk.negedge
51
 
52
        # apply a new input value with w_en=True and expect the output
53
        # to change
54
        w_en.next = True
55
        d_i.next = value3
56
        yield clk.negedge
57
 
58
        # and now reset again with active w_en and expect the value to
59
        # be 0
60
        w_en.next = True
61
        reset.next = True
62
        yield clk.negedge
63
 
64
        w_en.next = False
65
        reset.next = False
66
        yield clk.negedge
67
 
68
        raise StopSimulation
69
 
70
 
71
      @instance
72
      def verify():
73
 
74
        yield clk.negedge
75
        self.assertEqual(reset, True)
76
        yield clk.negedge
77
        self.assertEqual(reset, False)
78
        self.assertEqual(d_o, 0, '%d should be 0 at %d'%(d_o, now()))
79
 
80
        # verify that the first value appears as output
81
        yield clk.negedge
82
        self.assertEqual(d_o, value1)
83
 
84
        # expect still the old output value1 to remain
85
        yield clk.negedge
86
        self.assertEqual(d_o, value1)
87
 
88
        # expect now the new input value3 as output
89
        yield clk.negedge
90
        self.assertEqual(d_o, value3)
91
 
92
        # now expect the value to be reset, despite an active w_en
93
        yield clk.negedge
94
        self.assertEqual(d_o, 0)
95
 
96
        # and still remain 0
97
        yield clk.negedge
98
        self.assertEqual(d_o, 0)
99
 
100
      return instances()
101
 
102
    tb = bench()
103
    #tb = traceSignals(bench)    
104
    sim = Simulation(tb)
105
    sim.run()
106
 
107
 
108
 
109
  def test_queue(self):
110
 
111
    def bench():
112
 
113
      qlen = 3
114
      width = 4
115
      m = 2**(width-1)
116
 
117
      value1 = -m
118
      value2 = -1
119
      value3 = m-1
120
      value4 = 1
121
 
122
      clk, reset, shift = [Signal(bool(0)) for i in range(3)]
123
      d_i, d_o = [Signal(intbv(0, min=-m, max=m)) for i in range(2)]
124
 
125
      queue_inst = queue(clk, reset, shift, d_i, d_o, qlen)
126
 
127
      @always(delay(10))
128
      def clkgen():
129
        clk.next = not clk
130
 
131
      @instance
132
      def stimulus():
133
        # apply reset
134
        shift.next = False
135
        reset.next = True
136
        yield clk.negedge #1
137
        reset.next = False
138
        yield clk.negedge #2
139
        #print 'stim #2 ', now()
140
 
141
        ## Test the shift through
142
        #
143
        # fill in a different value for each register and expect the
144
        # output value to change, considering the 0 values from reset.
145
        # So when filling in value1, value2, value3, the expected
146
        # output is 0, 0, value1, value2, value3
147
        shift.next = True
148
        d_i.next = value1
149
        yield clk.negedge #3
150
        d_i.next = value2
151
        yield clk.negedge #4
152
        d_i.next = value3
153
        yield clk.negedge #5
154
        #print 'stim #5 ', now()
155
 
156
        # needed to shift the values out for verification and fill in
157
        # value4, but only 2 times
158
        d_i.next = value4
159
        yield clk.negedge #6
160
        yield clk.negedge #7
161
 
162
        ## Hold values
163
        # now hold, should see value3 3 times 
164
        shift.next = False
165
        yield clk.negedge #8
166
 
167
        yield clk.negedge #9
168
        yield clk.negedge #10
169
        yield clk.negedge #11
170
        #print 'stim time sync: ', now()
171
 
172
        ## Shift out again
173
        # shifting out value4 vor verification and filling in value2
174
        d_i.next = value2
175
        shift.next = True
176
        yield clk.negedge #12
177
        #print 'stim #12 ', now()
178
        yield clk.negedge #13
179
        yield clk.negedge #14
180
 
181
        ## Reset and then shift
182
        # now reset and then shift, expecting qlen x 0 to come out
183
        reset.next = True
184
        yield clk.negedge #15
185
        reset.next = False
186
        yield clk.negedge #16
187
        yield clk.negedge #17
188
        yield clk.negedge #18
189
 
190
        raise StopSimulation
191
 
192
 
193
      @instance
194
      def verify():
195
 
196
        # verify that output is 0
197
        yield clk.negedge #1
198
        self.assertEqual(reset, True)
199
        yield clk.negedge #2
200
        #print 'veri #2 ', now()
201
        self.assertEqual(reset, False)
202
        self.assertEqual(shift, False)
203
        self.assertEqual(d_o, 0, '%d should be 0 at %d'%(d_o, now()))
204
 
205
        ## Test the shift through
206
        # expecting 0, 0, value1, value2, value3
207
        yield clk.negedge #3
208
        self.assertEqual(shift, True)
209
        self.assertEqual(d_o, 0, '%d should be 0 at %d'%(d_o, now()))
210
        yield clk.negedge #4
211
        self.assertEqual(d_o, 0, '%d should be 0 at %d'%(d_o, now()))
212
        yield clk.negedge #5
213
        #print 'verify #5 ', now()
214
        self.assertEqual(d_o, value1)
215
        yield clk.negedge #6
216
        self.assertEqual(d_o, value2)
217
        yield clk.negedge #7
218
        self.assertEqual(d_o, value3)
219
 
220
        ## Hold values (2 x value4, 1 x value3)
221
        # now expect 3x value3 -- always output from last register, as
222
        # no shifting is done
223
        yield clk.negedge #8
224
        self.assertEqual(d_o, value3)
225
        yield clk.negedge #9
226
        self.assertEqual(d_o, value3)
227
        yield clk.negedge #10
228
        self.assertEqual(d_o, value3)
229
        yield clk.negedge #11
230
        self.assertEqual(d_o, value3)
231
 
232
        ## Shift out again
233
        # should get 3x value4 -- this time shifting is active and
234
        # values from all registers should get shifted out
235
        #print 'verify time sync: ', now()
236
        #self.assertEqual(shift, True)
237
        yield clk.negedge #12
238
        #print 'verify #12 ', now()
239
        self.assertEqual(d_o, value4)
240
        yield clk.negedge #13
241
        self.assertEqual(d_o, value4)
242
 
243
        ## Expect value2 from #12
244
        yield clk.negedge #14
245
        self.assertEqual(d_o, value2, '%d should be %d at %d'%(d_o, value2, now()))
246
        #self.assertEqual(reset, True, 
247
        #    'reset is "%d" should be "True" at %d'%(reset, now()))
248
 
249
        ## Reset and shift
250
        # now expecting a reset and then qlen x 0
251
 
252
        yield clk.negedge #15
253
        self.assertEqual(d_o, 0, '%d should be 0 at %d'%(d_o, now()))
254
        yield clk.negedge #16
255
        self.assertEqual(d_o, 0, '%d should be 0 at %d'%(d_o, now()))
256
        yield clk.negedge #17
257
        self.assertEqual(d_o, 0, '%d should be 0 at %d'%(d_o, now()))
258
 
259
      return instances()
260
 
261
    tb = bench()
262
    #tb = traceSignals(bench)    
263
    sim = Simulation(tb)
264
    sim.run()
265
 
266
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.