LoginSignup
0
0

More than 3 years have passed since last update.

windowsでiverilog その48

Last updated at Posted at 2020-07-09

概要

windowsでiverilogやってみた。
polyphonyでcpu書いてみた。
cpuでfizzbuzz、やってみた。

サンプルコード

from polyphony import testbench, module, is_worker_running
from polyphony.io import Port
from polyphony.typing import bit, uint8
from polyphony.timing import clksleep

@module
class mpu2:
    def __init__(self):
        self.data = Port(uint8, 'out', init = 0)
        self.start = Port(bit, 'out', init = 0)
        self.append_worker(self.worker)
    def _wait(self):
        for i in range(100000):
            pass
    def send(self, c:uint8):
        self.data(c);
        self.start(1)
        clksleep(1)
        self.start(0)
        self._wait()
    def worker(self):
        rom = [
            0x8000, #  r0set  0     0
            0xd000, #  r0save 0     1
            0x8030, #  r0set '0'    2
            0xd001, #  r0save 1     3
            0x8030, #  r0set '0'    4
            0xd002, #  r0save 2     5
                    #label_20:
            0xc002, #  r0load  2    6
            0x8401, #  r1set  1     7
            0x0100, #  r0 + r1      8
            0xd002, #  r0save  2    9
            0x8439, #  r1set  '9'   a
            0x7100, #  r0 < r1      b
            0x5013, #  if label_32  c
            0xc001, #  r0load  1    d
            0x8401, #  r1set  1     e
            0x0100, #  r0 + r1      f
            0xd001, #  r0save  1    10
            0x8030, #  r0set  '0'   11
            0xd002, #  r0save  2    12
                    #label_32:
            0xc000, #  r0load  0    13
            0x8401, #  r1set  1     14
            0x0100, #  r0 + r1      15
            0xd000, #  r0save 0     16
            0xc000, #  r0load  0    17
            0x8464, #  r1set  100   18
            0x6100, #  r0 < r1      19
            0x5057, #  if label_255 1a
            0xc000, #  r0load  0    1b
            0x840f, #  r1set  15    1c
            0xf100, #  r0 % r1      1d
            0x502e, #  if label_120 1e
            0xc000, #  r0load  0    1f
            0x8405, #  r1set  5     20
            0xf100, #  r0 % r1      21
            0x5041, #  if label_140 22
            0xc000, #  r0load  0    23
            0x8403, #  r1set  3     24
            0xf100, #  r0 % r1      25
            0x504c, #  if label_160 26
            0xc001, #  r0load  1    27
            0xa000, #  r0out        28
            0xc002, #  r0load  2    29
            0xa000, #  r0out        2a
            0x8020, #  r0set  ' '   2b
            0xa000, #  r0out        2c
            0x4006, #  jp label_20  2d
                    #label_120:
            0x8066, #  r0set  'f'   2e
            0xa000, #  r0out        2f
            0x8069, #  r0set  'i'   30
            0xa000, #  r0out        31
            0x807a, #  r0set  'z'   32
            0xa000, #  r0out        33
            0x807a, #  r0set  'z'   34
            0xa000, #  r0out        35
            0x8062, #  r0set  'b'   36
            0xa000, #  r0out        37
            0x8075, #  r0set  'u'   38
            0xa000, #  r0out        39
            0x807a, #  r0set  'z'   3a
            0xa000, #  r0out        3b
            0x807a, #  r0set  'z'   3c
            0xa000, #  r0out        3d
            0x8020, #  r0set  ' '   3e
            0xa000, #  r0out        3f
            0x4006, #  jp label_20  40
                    #label_140:
            0x8062, #  r0set  'b'   41
            0xa000, #  r0out        42
            0x8075, #  r0set  'u'   43
            0xa000, #  r0out        44
            0x807a, #  r0set  'z'   45
            0xa000, #  r0out        46
            0x807a, #  r0set  'z'   47
            0xa000, #  r0out        48
            0x8020, #  r0set  ' '   49
            0xa000, #  r0out        4a
            0x4006, #  jp label_20  4b
                    #label_160:
            0x8066, #  r0set  'f'   4c
            0xa000, #  r0out        4d
            0x8069, #  r0set  'i'   4e
            0xa000, #  r0out        4f
            0x807a, #  r0set  'z'   50
            0xa000, #  r0out        51
            0x807a, #  r0set  'z'   52
            0xa000, #  r0out        53
            0x8020, #  r0set  ' '   54
            0xa000, #  r0out        55
            0x4006, #  jp label_20  56
                    #label_255:
            0x4090, #  end          57
        ]
        ram = [0] * 8
        reg = [0] * 4
        pc = 0
        while is_worker_running():
            while pc < 100:
                ins = rom[pc]
                #print(pc)
                pc = pc + 1
                op = (ins >> 14) & 0x3
                funct = (ins >> 12) & 0x3
                a = (ins >> 10) & 0x3
                b = (ins >> 8) & 0x3
                data = ins & 0xff
                if op == 0:
                    if funct == 0:
                        reg[a] = reg[a] + reg[b]
                    else:
                        pc = 100
                elif op == 1:
                    if funct == 0:#4
                        pc = data
                    elif funct == 1:#5
                        if (reg[a] == 0):
                            pc = data
                    elif funct == 2:#6
                        if (reg[a] < reg[b]):
                            reg[a] = 1
                        else:
                            reg[a] = 0
                    elif funct == 3:#7
                        if (reg[a] > reg[b]):
                            reg[a] = 1
                        else:
                            reg[a] = 0
                    else:
                        pc = 100
                elif op == 2:
                    if funct == 0:#8
                        reg[a] = data
                    elif funct == 2:#a
                        self.send(reg[a])
                        print(chr(reg[a]))
                    else:
                        pc = 100
                elif op == 3:
                    if funct == 0:#c
                        reg[a] = ram[data]
                    elif funct == 1:#d
                        ram[data] = reg[a]
                    elif funct == 3:#f
                        #print(reg[a], reg[b])
                        reg[a] = reg[a] % reg[b]
                        #print(reg[a])
                    else:
                        pc = 100
                else:
                    pc = 100

m = mpu2()

@testbench
def test(m):
    clksleep(8820)
    print("ok")

test(m)




python実行結果


f
i
z
z
b
u
z
z

3
1

3
2

f
i
z
z

3
4

b
u
z
z

f
i
z
z

3
7

3
8

f
i
z
z

b
u
z
z

4
1

f
i
z
z

4
3

4
4

f
i
z
z
b
u
z
z

4
6

4
7

f
i
z
z

4
9

b
u
z
z

f
i
z
z

5
2

5
3

f
i
z
z

b
u
z
z

5
6

f
i
z
z

5
8

5
9

f
i
z
z
b
u
z
z

6
1

6
2

f
i
z
z

6
4

b
u
z
z

f
i
z
z

6
7

6
8

f
i
z
z

b
u
z
z

7
1

f
i
z
z

7
3

7
4

f
i
z
z
b
u
z
z

7
6

7
7

f
i
z
z

7
9

b
u
z
z

f
i
z
z

8
2

8
3

f
i
z
z

b
u
z
z

8
6

f
i
z
z

8
8

8
9

f
i
z
z
b
u
z
z

9
1

9
2

f
i
z
z

9
4

b
u
z
z

f
i
z
z

9
7

9
8

f
i
z
z

ok


以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0