|
|
|
@ -1,36 +1,92 @@
|
|
|
|
|
import binandint
|
|
|
|
|
def alu(a,b,alu_ctrl): #a,b为两个运算数,alu_ctrl为控制信号,返回运算结果result与是否为0 zero
|
|
|
|
|
if alu_ctrl=='00000':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='00001':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='00010':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='00011':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='00100':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='00101':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='00110':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='00111':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01000':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01001':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01010':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01011':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01100':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01101':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01110':
|
|
|
|
|
pass
|
|
|
|
|
elif alu_ctrl=='01111':
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
from binandint import *
|
|
|
|
|
def alu(a,b,alu_ctrl): #a,b为两个运算数,alu_ctrl为控制信号,返回运算结果result与是否为0 zero
|
|
|
|
|
signed = a-b
|
|
|
|
|
if alu_ctrl=='00000': #add,jalr
|
|
|
|
|
alu_result = a+b
|
|
|
|
|
elif alu_ctrl=='00001': #sub
|
|
|
|
|
alu_result = a-b
|
|
|
|
|
elif alu_ctrl=='00010': #or
|
|
|
|
|
alu_result = a|b
|
|
|
|
|
elif alu_ctrl=='00011': #and
|
|
|
|
|
alu_result = a&b
|
|
|
|
|
elif alu_ctrl=='00100': #slt
|
|
|
|
|
if(signed >= 0):
|
|
|
|
|
alu_result = 0
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
elif alu_ctrl=='00101': #beq
|
|
|
|
|
if a == b:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
elif alu_ctrl=='00110': #bne
|
|
|
|
|
if a != b:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
elif alu_ctrl=='00111': #blt
|
|
|
|
|
if a<b:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
elif alu_ctrl=='01000': #bge
|
|
|
|
|
if a>=b:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
elif alu_ctrl=='01001':
|
|
|
|
|
if a<0:
|
|
|
|
|
ua = a+2**32
|
|
|
|
|
else:
|
|
|
|
|
ua=a
|
|
|
|
|
if b<0:
|
|
|
|
|
ub = b+2**32
|
|
|
|
|
else:
|
|
|
|
|
ub=b
|
|
|
|
|
if ua < ub:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
elif alu_ctrl=='01010':
|
|
|
|
|
if a<0:
|
|
|
|
|
ua = a+2**32
|
|
|
|
|
else:
|
|
|
|
|
ua=a
|
|
|
|
|
if b<0:
|
|
|
|
|
ub = b+2**32
|
|
|
|
|
else:
|
|
|
|
|
ub=b
|
|
|
|
|
if ua >= ub:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
elif alu_ctrl=='01011':
|
|
|
|
|
alu_result = 1
|
|
|
|
|
elif alu_ctrl=='01100':
|
|
|
|
|
alu_result = a^b
|
|
|
|
|
elif alu_ctrl=='01101':
|
|
|
|
|
alu_result=a<<b
|
|
|
|
|
elif alu_ctrl=='01110':
|
|
|
|
|
if a<0:
|
|
|
|
|
ua = a+2**32
|
|
|
|
|
else:
|
|
|
|
|
ua=a
|
|
|
|
|
if b<0:
|
|
|
|
|
ub = b+2**32
|
|
|
|
|
else:
|
|
|
|
|
ub=b
|
|
|
|
|
if ua <= ub:
|
|
|
|
|
alu_result = 1
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
elif alu_ctrl=='01111':
|
|
|
|
|
if a<0:
|
|
|
|
|
ua = a+2**32
|
|
|
|
|
else:
|
|
|
|
|
ua=a
|
|
|
|
|
alu_result=a>>b
|
|
|
|
|
elif alu_ctrl=='10000':
|
|
|
|
|
alu_result=a>>b
|
|
|
|
|
else:
|
|
|
|
|
alu_result = 0
|
|
|
|
|
return alu_result
|