概要
windowsでiverilogやってみた。
polyphonyでcpu書いてみる。
俺cpu仕様案
命令長 16ビット
レジスタ 8ビット4本
命令メモリー 8ビット256バイト
データメモリー 8ビット256バイト
命令セット
bit15,bit14  算術命令、転送命令、ジャンプ、アドレスを分ける。
bit13,bit12  上の細分
bit11,bit10  レジスタ指定
bit9,bit8    レジスタ指定
bit7~bit0    アドレス、データ
俺cpu命令セット案
|ニーモニック|bit15,bit14	|bit13,bit12|bit11,bit10|bit9,bit8|bit7,bit0|説明|
|:--|:--|:--|:--|:--|:--|:--|:--|
|+	|0	|0	|0-3	|0-3	|-	|加算|
|-	|0	|1	|0-3	|0-3	|-	|減算|
|*      |0	|2	|0-3	|0-3	|-	|乗算|
|/	|0	|3	|0-3	|0-3	|-	|除算|
|jmp	|1	|0	|-	|-	|0-255	|ジャンプ|
|if jmp	|1	|1	|-	|-	|0-255	|条件ジャンプ|
|>	|1	|2	|0-3	|0-3	|-	|条件|
|%	|1	|3	|0-3	|0-3	|-	|剰余|
|set    |2	|0	|0-3	|-	|0-255	|レジスタセット|
|set2   |2	|1	|0-3	|0-3	|0-255	|レジスタセット|
|out	|2	|2	|0-3	|-	|-	|出力|
|out2	|2	|3	|-	|-	|0-255	|出力|
|load   |3	|0	|0-3	|-	|0-255	|メモリロード|
|save   |3	|1	|0-3	|-	|0-255	|メモリセーブ|
|load2  |3	|2	|0-3	|0-3	|0-255	|メモリロード|
|save2  |3	|3	|0-3	|0-3	|0-255	|メモリセーブ|
サンプルコード
				while pc != 0:
					iaddr = pc
					ins = imem[iaddr]
					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:#keisan
						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 = 0
					elif op == 2:#jump
						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 = 0
					elif op == 3:#data
						if funct == 0:
							reg[a] = data
						elif funct == 1:
							reg[a] = reg[b] + data
						#elif funct == 2:
							#reg[a] = reg[b] + 1
						#elif funct == 3:
							#reg[a] = reg[a] < reg[b]
						else:
							pc = 0
					else:#mem
						if funct == 0:
							reg[a] = dmem[addr]
						elif funct == 1:
							dmem[addr] = reg[a]
						elif funct == 2:
							reg[a] = dmem[reg[b] + addr]
						elif funct == 3:
							dmem[reg[b] + addr] = reg[a]
						else:
							pc = 0
アセンブラ案
a-zをout
  r0set  0
  r0save  0
loop:
  r0load  0
  r1set  26
  r0  <  r1
  if  pass 
  r0load  0
  r1set  97
  r0  +  r1
  r0out 
  r0load  0
  r1set  1
  r0  +  r1
  r0save  0
  jp  loop
pass:
メモリーに落とす。
imem = [
0x8000,  #r0set  0
0xd000,  #r0save  0
       #loop:
0xc000,  #r0load  0
0x841a,  #r1set  26
0x6100,  #r0  <  r1
0x400f,  #if  pass 
0xc000,  #r0load  0
0x8461,  #r1set  97
0x0100,  #r0  +  r1
0xa000,  #r0out 
0xc000,  #r0load  0
0x8401,  #r1set  1
0x0100,  #r0  +  r1
0xd000,  #r0save  0
0x5002,  #jp  loop
0x500f, #pass:
]
以上。
