Skip to content

Commit 86b028e

Browse files
committed
All thread_ examples with AXI-master have an AXI-slave-lite interface.
1 parent 294141e commit 86b028e

File tree

8 files changed

+357
-175
lines changed

8 files changed

+357
-175
lines changed

examples/thread_matmul/thread_matmul.py

Lines changed: 90 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,44 @@
1515
axi_datawidth = 32
1616
datawidth = 32
1717

18+
matrix_size = 16
1819
a_offset = 0
1920
b_offset = 4096
2021
c_offset = 4096 * 2
2122

2223

23-
def mkLed(matrix_size=16):
24+
def mkLed():
2425
m = Module('blinkled')
2526
clk = m.Input('CLK')
2627
rst = m.Input('RST')
2728

28-
seq = Seq(m, 'seq', clk, rst)
29-
timer = m.Reg('timer', 32, initval=0)
30-
seq(
31-
timer.inc()
32-
)
33-
3429
addrwidth = 10
3530
ram_a = vthread.RAM(m, 'ram_a', clk, rst, datawidth, addrwidth)
3631
ram_b = vthread.RAM(m, 'ram_b', clk, rst, datawidth, addrwidth)
3732
ram_c = vthread.RAM(m, 'ram_c', clk, rst, datawidth, addrwidth)
38-
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, datawidth)
3933

40-
def matmul(matrix_size, a_offset, b_offset, c_offset):
41-
start_time = timer
42-
comp(matrix_size, a_offset, b_offset, c_offset)
43-
end_time = timer
44-
time = end_time - start_time
45-
print("Time (cycles): %d" % time)
46-
check(matrix_size, a_offset, b_offset, c_offset)
47-
vthread.finish()
34+
maxi = vthread.AXIM(m, 'maxi', clk, rst, datawidth)
35+
saxi = vthread.AXISLiteRegister(m, 'saxi', clk, rst, 32, length=8)
36+
37+
def matmul():
38+
while True:
39+
saxi.wait_flag(0, value=1, resetvalue=0)
40+
matrix_size = saxi.read(1)
41+
a_offset = saxi.read(2)
42+
b_offset = saxi.read(3)
43+
c_offset = saxi.read(4)
44+
comp(matrix_size, a_offset, b_offset, c_offset)
45+
saxi.write_flag(5, 1, resetvalue=0)
4846

4947
def comp(matrix_size, a_offset, b_offset, c_offset):
5048
a_addr, c_addr = a_offset, c_offset
5149

5250
for i in range(matrix_size):
53-
myaxi.dma_read(ram_a, 0, a_addr, matrix_size)
51+
maxi.dma_read(ram_a, 0, a_addr, matrix_size)
5452

5553
b_addr = b_offset
5654
for j in range(matrix_size):
57-
myaxi.dma_read(ram_b, 0, b_addr, matrix_size)
55+
maxi.dma_read(ram_b, 0, b_addr, matrix_size)
5856

5957
sum = 0
6058
for k in range(matrix_size):
@@ -65,38 +63,17 @@ def comp(matrix_size, a_offset, b_offset, c_offset):
6563

6664
b_addr += matrix_size * (datawidth // 8)
6765

68-
myaxi.dma_write(ram_c, 0, c_addr, matrix_size)
66+
maxi.dma_write(ram_c, 0, c_addr, matrix_size)
6967
a_addr += matrix_size * (datawidth // 8)
7068
c_addr += matrix_size * (datawidth // 8)
7169

72-
def check(matrix_size, a_offset, b_offset, c_offset):
73-
all_ok = True
74-
c_addr = c_offset
75-
for i in range(matrix_size):
76-
myaxi.dma_read(ram_c, 0, c_addr, matrix_size)
77-
for j in range(matrix_size):
78-
v = ram_c.read(j)
79-
if i == j and vthread.verilog.NotEql(v, (i + 1) * 2):
80-
all_ok = False
81-
print("NG [%d,%d] = %d" % (i, j, v))
82-
if i != j and vthread.verilog.NotEql(v, 0):
83-
all_ok = False
84-
print("NG [%d,%d] = %d" % (i, j, v))
85-
c_addr += matrix_size * (datawidth // 8)
86-
87-
if all_ok:
88-
print('# verify: PASSED')
89-
else:
90-
print('# verify: FAILED')
91-
9270
th = vthread.Thread(m, 'th_matmul', clk, rst, matmul)
93-
fsm = th.start(matrix_size, a_offset, b_offset, c_offset)
71+
fsm = th.start()
9472

9573
return m
9674

9775

9876
def mkTest(memimg_name=None):
99-
matrix_size = 16
10077

10178
a_shape = (matrix_size, matrix_size)
10279
b_shape = (matrix_size, matrix_size)
@@ -136,7 +113,7 @@ def mkTest(memimg_name=None):
136113
axi.set_memory(mem, a, axi_datawidth, datawidth, a_addr)
137114
axi.set_memory(mem, b, axi_datawidth, datawidth, b_addr)
138115

139-
led = mkLed(matrix_size)
116+
led = mkLed()
140117

141118
m = Module('test')
142119
params = m.copy_params(led)
@@ -148,7 +125,75 @@ def mkTest(memimg_name=None):
148125
mem_datawidth=axi_datawidth,
149126
memimg=mem, memimg_name=memimg_name)
150127

151-
memory.connect(ports, 'myaxi')
128+
memory.connect(ports, 'maxi')
129+
130+
# AXI-Slave controller
131+
_saxi = vthread.AXIMLite(m, '_saxi', clk, rst, noio=True)
132+
_saxi.connect(ports, 'saxi')
133+
134+
# Timer
135+
counter = m.Reg('counter', 32, initval=0)
136+
seq = Seq(m, 'seq', clk, rst)
137+
seq(
138+
counter.inc()
139+
)
140+
141+
def ctrl():
142+
for i in range(100):
143+
pass
144+
145+
awaddr = 4
146+
print('# matrix_size = %d' % matrix_size)
147+
_saxi.write(awaddr, matrix_size)
148+
149+
awaddr = 8
150+
print('# a_offset = %d' % a_offset)
151+
_saxi.write(awaddr, a_offset)
152+
153+
awaddr = 12
154+
print('# b_offset = %d' % b_offset)
155+
_saxi.write(awaddr, b_offset)
156+
157+
awaddr = 16
158+
print('# c_offset = %d' % c_offset)
159+
_saxi.write(awaddr, c_offset)
160+
161+
awaddr = 0
162+
start_time = counter
163+
print('# start time = %d' % start_time)
164+
_saxi.write(awaddr, 1)
165+
166+
araddr = 20
167+
v = _saxi.read(araddr)
168+
while v == 0:
169+
v = _saxi.read(araddr)
170+
171+
end_time = counter
172+
print('# end time = %d' % end_time)
173+
time = end_time - start_time
174+
print('# exec time = %d' % time)
175+
176+
all_ok = True
177+
for y in range(matrix_size):
178+
for x in range(matrix_size):
179+
v = memory.read(
180+
c_offset + (y * matrix_size + x) * datawidth // 8)
181+
if y == x and vthread.verilog.NotEql(v, (y + 1) * 2):
182+
all_ok = False
183+
print("NG [%d,%d] = %d" % (y, x, v))
184+
if y != x and vthread.verilog.NotEql(v, 0):
185+
all_ok = False
186+
print("NG [%d,%d] = %d" % (y, x, v))
187+
188+
if all_ok:
189+
print('# verify: PASSED')
190+
else:
191+
print('# verify: FAILED')
192+
193+
vthread.finish()
194+
195+
th = vthread.Thread(m, 'th_ctrl', clk, rst, ctrl)
196+
fsm = th.start()
152197

153198
uut = m.Instance(led, 'uut',
154199
params=m.connect_params(led),
@@ -189,3 +234,5 @@ def run(filename='tmp.v', simtype='iverilog', outputfile=None):
189234
if __name__ == '__main__':
190235
rslt = run(filename='tmp.v')
191236
print(rslt)
237+
238+
m = mkLed()

examples/thread_matmul_ipxact/thread_matmul_ipxact.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ def mkLed():
2626
m = Module('blinkled')
2727
clk = m.Input('CLK')
2828
rst = m.Input('RST')
29-
led = m.OutputReg('led', 8, initval=0)
3029

3130
addrwidth = 10
3231
ram_a = vthread.RAM(m, 'ram_a', clk, rst, datawidth, addrwidth)

examples/thread_matmul_narrow/thread_matmul_narrow.py

Lines changed: 89 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,47 +15,45 @@
1515
axi_datawidth = 32
1616
datawidth = 64
1717

18+
matrix_size = 16
1819
a_offset = 0
1920
b_offset = 4096
2021
c_offset = 4096 * 2
2122

2223

23-
def mkLed(matrix_size=16):
24+
def mkLed():
2425
m = Module('blinkled')
2526
clk = m.Input('CLK')
2627
rst = m.Input('RST')
2728

28-
seq = Seq(m, 'seq', clk, rst)
29-
timer = m.Reg('timer', 32, initval=0)
30-
seq(
31-
timer.inc()
32-
)
33-
3429
addrwidth = 10
3530
ram_a = vthread.RAM(m, 'ram_a', clk, rst, datawidth, addrwidth)
3631
ram_b = vthread.RAM(m, 'ram_b', clk, rst, datawidth, addrwidth)
3732
ram_c = vthread.RAM(m, 'ram_c', clk, rst, datawidth, addrwidth)
38-
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, datawidth //
39-
(datawidth // axi_datawidth))
4033

41-
def matmul(matrix_size, a_offset, b_offset, c_offset):
42-
start_time = timer
43-
comp(matrix_size, a_offset, b_offset, c_offset)
44-
end_time = timer
45-
time = end_time - start_time
46-
print("Time (cycles): %d" % time)
47-
check(matrix_size, a_offset, b_offset, c_offset)
48-
vthread.finish()
34+
maxi = vthread.AXIM(m, 'maxi', clk, rst, datawidth //
35+
(datawidth // axi_datawidth))
36+
saxi = vthread.AXISLiteRegister(m, 'saxi', clk, rst, 32, length=8)
37+
38+
def matmul():
39+
while True:
40+
saxi.wait_flag(0, value=1, resetvalue=0)
41+
matrix_size = saxi.read(1)
42+
a_offset = saxi.read(2)
43+
b_offset = saxi.read(3)
44+
c_offset = saxi.read(4)
45+
comp(matrix_size, a_offset, b_offset, c_offset)
46+
saxi.write_flag(5, 1, resetvalue=0)
4947

5048
def comp(matrix_size, a_offset, b_offset, c_offset):
5149
a_addr, c_addr = a_offset, c_offset
5250

5351
for i in range(matrix_size):
54-
myaxi.dma_read(ram_a, 0, a_addr, matrix_size)
52+
maxi.dma_read(ram_a, 0, a_addr, matrix_size)
5553

5654
b_addr = b_offset
5755
for j in range(matrix_size):
58-
myaxi.dma_read(ram_b, 0, b_addr, matrix_size)
56+
maxi.dma_read(ram_b, 0, b_addr, matrix_size)
5957

6058
sum = 0
6159
for k in range(matrix_size):
@@ -66,38 +64,17 @@ def comp(matrix_size, a_offset, b_offset, c_offset):
6664

6765
b_addr += matrix_size * (datawidth // 8)
6866

69-
myaxi.dma_write(ram_c, 0, c_addr, matrix_size)
67+
maxi.dma_write(ram_c, 0, c_addr, matrix_size)
7068
a_addr += matrix_size * (datawidth // 8)
7169
c_addr += matrix_size * (datawidth // 8)
7270

73-
def check(matrix_size, a_offset, b_offset, c_offset):
74-
all_ok = True
75-
c_addr = c_offset
76-
for i in range(matrix_size):
77-
myaxi.dma_read(ram_c, 0, c_addr, matrix_size)
78-
for j in range(matrix_size):
79-
v = ram_c.read(j)
80-
if i == j and vthread.verilog.NotEql(v, (i + 1) * 2):
81-
all_ok = False
82-
print("NG [%d,%d] = %d" % (i, j, v))
83-
if i != j and vthread.verilog.NotEql(v, 0):
84-
all_ok = False
85-
print("NG [%d,%d] = %d" % (i, j, v))
86-
c_addr += matrix_size * (datawidth // 8)
87-
88-
if all_ok:
89-
print('# verify: PASSED')
90-
else:
91-
print('# verify: FAILED')
92-
9371
th = vthread.Thread(m, 'th_matmul', clk, rst, matmul)
94-
fsm = th.start(matrix_size, a_offset, b_offset, c_offset)
72+
fsm = th.start()
9573

9674
return m
9775

9876

9977
def mkTest(memimg_name=None):
100-
matrix_size = 16
10178

10279
a_shape = (matrix_size, matrix_size)
10380
b_shape = (matrix_size, matrix_size)
@@ -137,7 +114,7 @@ def mkTest(memimg_name=None):
137114
axi.set_memory(mem, a, axi_datawidth, datawidth, a_addr)
138115
axi.set_memory(mem, b, axi_datawidth, datawidth, b_addr)
139116

140-
led = mkLed(matrix_size)
117+
led = mkLed()
141118

142119
m = Module('test')
143120
params = m.copy_params(led)
@@ -149,7 +126,75 @@ def mkTest(memimg_name=None):
149126
mem_datawidth=axi_datawidth,
150127
memimg=mem, memimg_name=memimg_name)
151128

152-
memory.connect(ports, 'myaxi')
129+
memory.connect(ports, 'maxi')
130+
131+
# AXI-Slave controller
132+
_saxi = vthread.AXIMLite(m, '_saxi', clk, rst, noio=True)
133+
_saxi.connect(ports, 'saxi')
134+
135+
# Timer
136+
counter = m.Reg('counter', 32, initval=0)
137+
seq = Seq(m, 'seq', clk, rst)
138+
seq(
139+
counter.inc()
140+
)
141+
142+
def ctrl():
143+
for i in range(100):
144+
pass
145+
146+
awaddr = 4
147+
print('# matrix_size = %d' % matrix_size)
148+
_saxi.write(awaddr, matrix_size)
149+
150+
awaddr = 8
151+
print('# a_offset = %d' % a_offset)
152+
_saxi.write(awaddr, a_offset)
153+
154+
awaddr = 12
155+
print('# b_offset = %d' % b_offset)
156+
_saxi.write(awaddr, b_offset)
157+
158+
awaddr = 16
159+
print('# c_offset = %d' % c_offset)
160+
_saxi.write(awaddr, c_offset)
161+
162+
awaddr = 0
163+
start_time = counter
164+
print('# start time = %d' % start_time)
165+
_saxi.write(awaddr, 1)
166+
167+
araddr = 20
168+
v = _saxi.read(araddr)
169+
while v == 0:
170+
v = _saxi.read(araddr)
171+
172+
end_time = counter
173+
print('# end time = %d' % end_time)
174+
time = end_time - start_time
175+
print('# exec time = %d' % time)
176+
177+
all_ok = True
178+
for y in range(matrix_size):
179+
for x in range(matrix_size):
180+
v = memory.read(
181+
c_offset + (y * matrix_size + x) * datawidth // 8)
182+
if y == x and vthread.verilog.NotEql(v, (y + 1) * 2):
183+
all_ok = False
184+
print("NG [%d,%d] = %d" % (y, x, v))
185+
if y != x and vthread.verilog.NotEql(v, 0):
186+
all_ok = False
187+
print("NG [%d,%d] = %d" % (y, x, v))
188+
189+
if all_ok:
190+
print('# verify: PASSED')
191+
else:
192+
print('# verify: FAILED')
193+
194+
vthread.finish()
195+
196+
th = vthread.Thread(m, 'th_ctrl', clk, rst, ctrl)
197+
fsm = th.start()
153198

154199
uut = m.Instance(led, 'uut',
155200
params=m.connect_params(led),

0 commit comments

Comments
 (0)