Help us understand the problem. What is going on with this article?

windowsでiverilog その45

概要

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


以上。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away