Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Christina Yu
pyriscv
Commits
701d1688
Commit
701d1688
authored
Oct 20, 2021
by
Yu Christina Juan
Browse files
lab3
parent
a5ed2937
Changes
3
Hide whitespace changes
Inline
Side-by-side
alu.py
0 → 100644
View file @
701d1688
#alu.py
alu_ops
=
[
'X'
,
'^'
,
'cp'
,
'sltu'
,
'and'
,
'add'
,
'slt'
,
'sra'
,
'sub'
,
'srl'
,
'sll'
,
'or'
]
def
alu
(
op1
,
op2
,
alu_fun
):
# operation determined by the input alu_fun
if
alu_fun
==
0
:
# 0 (no operation)
return
0
if
alu_fun
==
1
:
#Xor
return
op1
^
op2
if
alu_fun
==
2
:
#Copy (input 1 copied to output)
return
op1
if
alu_fun
==
3
:
#Sltu (shift left unsigned)
return
op1
*
(
2
**
op2
)
if
alu_fun
==
4
:
#And
return
op1
&
op2
if
alu_fun
==
5
:
#Add
return
op1
+
op2
if
alu_fun
==
6
:
#Slt (set less than)
return
int
(
op1
<
op2
)
if
alu_fun
==
7
:
#Sra (shift right arithmetic)
return
op1
>>
op2
if
alu_fun
==
8
:
#Sub
return
op1
-
op2
if
alu_fun
==
9
:
#Srl (shift right logical)
return
(
op1
%
0x100000000
)
>>
op2
if
alu_fun
==
10
:
#Sll (shift left logical)
return
(
op1
%
0x100000000
)
<<
op2
if
alu_fun
==
11
:
#Or
return
op1
|
op2
return
#unit test
if
__name__
==
"__main__"
:
op1
=
0x100
op2
=
0x2
for
i
in
range
(
12
):
print
(
f
"
{
op1
:
X
}
\t
{
alu_ops
[
i
]
}
\t
{
op2
:
X
}
=
{
alu
(
op1
,
op2
,
i
)
:
X
}
"
)
\ No newline at end of file
mux.py
0 → 100644
View file @
701d1688
# filename: mux.py
def
make_mux
(
*
args
):
# Multiplexer that takes in variable # of args
return
lambda
i
:
args
[
i
]()
# testbench
if
__name__
==
"__main__"
:
mux
=
make_mux
(
lambda
:
1
,
lambda
:
2
,
lambda
:
3
,
lambda
:
4
,
lambda
:
5
)
for
i
in
range
(
5
):
print
(
f
"mux(
{
i
}
) ==
{
mux
(
i
)
}
"
)
\ No newline at end of file
regfile.py
0 → 100644
View file @
701d1688
#regfile.py
from
riscv_isa.isa
import
regNumToName
class
RegFile
:
def
__init__
(
self
):
self
.
regs
=
[
0
]
*
32
#set all registers as 0
def
read
(
self
,
rs
):
return
self
.
regs
[
rs
]
#read contents of register
def
clock
(
self
,
wa
,
wd
,
en
):
#only write on negative edge
if
wa
<=
0
or
wa
>=
32
or
wd
==
None
or
en
==
False
:
return
if
en
==
True
:
self
.
regs
[
wa
]
=
wd
# write wd to wa
def
display
(
self
):
for
i
in
range
(
0
,
32
,
4
):
# loop to display registers and their content
fmt_reg
=
lambda
i
:
f
"
{
self
.
regs
[
i
]
:
09
x
}
"
if
self
.
regs
[
i
]
!=
None
else
"xxxxxxxx"
print
(
" "
.
join
([
f
"
{
regNumToName
(
i
+
j
).
rjust
(
4
)
}
:
{
fmt_reg
(
i
+
j
)
}
"
for
j
in
range
(
4
)]))
"""testbench"""
if
__name__
==
"__main__"
:
regFile
=
RegFile
()
for
i
in
range
(
32
):
regFile
.
clock
(
i
,
0x42
+
i
,
True
)
regFile
.
display
()
\ No newline at end of file
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment