#概要
windowsでiverilogやってみた。
polyphonyでcpu書いてみる。
#サンプルコード
from polyphony import testbench, module, is_worker_running, rule
from polyphony.io import Port
from polyphony.typing import uint8
from polyphony.timing import clksleep
@module
class mpu:
def __init__(self):
self.out = Port(uint8, 'out')
self.append_worker(self.worker)
def worker(self):
rom = [
0x8000, #r0set 0 0
0xd000, #r0save 0 1
#loop:
0xc000, #r0load 0 2
0x841a, #r1set 26 3
0x6100, #r0 < r1 4
0x5090, #if pass 5
0xc000, #r0load 0 6
0x8461, #r1set 97 7
0x0100, #r0 + r1 8
0xa000, #r0out 9
0xc000, #r0load 0 10
0x8401, #r1set 1 11
0x0100, #r0 + r1 12
0xd000, #r0save 0 14
0x4002, #jp loop 15
0x400f, #pass: 16
]
ram = [0] * 8
reg = [0] * 4
pc = 0
while is_worker_running():
with rule(scheduling = 'pipeline'):
while pc < 100:
ins = rom[pc]
pc = pc + 1
op = (ins >> 14) & 0x3
funct = (ins >> 12) & 0x3
a = (ins >> 10) & 0x3
b = (ins >> 8) & 0x3
data = ins & 0xff
addr = ins & 0xff
if op == 0:
if funct == 0:
reg[a] = reg[a] + reg[b]
elif funct == 1:
reg[a] = reg[a] - reg[b]
elif funct == 2:
reg[a] = reg[a] * reg[b]
elif funct == 3:
reg[a] = reg[a] / reg[b]
else:
pc = 100
elif op == 1:
if funct == 0:
pc = addr
elif funct == 1:
if (reg[a] == 0):
pc = addr
elif funct == 2:
reg[a] = reg[a] < reg[b]
elif funct == 3:
reg[a] = reg[a] % reg[b]
else:
pc = 100
elif op == 2:
if funct == 0:
reg[a] = data
elif funct == 1:
reg[a] = reg[b] + data
elif funct == 2:
self.out(reg[a])
print(reg[a])
elif funct == 3:
self.out(data)
else:
pc = 100
elif op == 3:
if funct == 0:
reg[a] = ram[addr]
elif funct == 1:
ram[addr] = reg[a]
else:
pc = 100
else:
pc = 100
m = mpu()
@testbench
def test(m):
clksleep(120)
print("ok")
test(m)
#python実行結果
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
ok
121
122
以上。