Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
84e97942
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
大约 1 年 前同步成功
通知
1183
Star
3914
Fork
526
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
X
XiangShan
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
84e97942
编写于
2月 08, 2019
作者:
Z
Zihao Yu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
core: pass sum
上级
d4960b72
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
46 addition
and
18 deletion
+46
-18
src/main/scala/core/Decode.scala
src/main/scala/core/Decode.scala
+22
-2
src/main/scala/core/EXU.scala
src/main/scala/core/EXU.scala
+19
-12
src/main/scala/core/IDU.scala
src/main/scala/core/IDU.scala
+2
-2
src/test/scala/core/NOOPTester.scala
src/test/scala/core/NOOPTester.scala
+3
-2
未找到文件。
src/main/scala/core/Decode.scala
浏览文件 @
84e97942
...
...
@@ -33,7 +33,7 @@ object Decode {
InstrI
->
(
Src1Reg
,
Src2Imm
),
InstrR
->
(
Src1Reg
,
Src2Reg
),
InstrS
->
(
Src1Reg
,
Src2Imm
),
InstrB
->
(
Src1Reg
,
Src2
Reg
),
InstrB
->
(
Src1Reg
,
Src2
Imm
),
InstrU
->
(
Src1Pc
,
Src2Imm
),
InstrJ
->
(
Src1Pc
,
Src2Imm
),
InstrN
->
(
Src1Pc
,
Src2Imm
)
...
...
@@ -48,7 +48,7 @@ object Decode {
val
FuTypeWidth
=
log2Up
(
FuTypeNum
).
W
/* ALU operation type */
private
val
FuOpTypeAluNum
=
1
0
private
val
FuOpTypeAluNum
=
1
1
val
AluAdd
=
"b0000"
.
U
val
AluSll
=
"b0001"
.
U
val
AluSlt
=
"b0010"
.
U
...
...
@@ -59,14 +59,18 @@ object Decode {
val
AluAnd
=
"b0111"
.
U
val
AluSub
=
"b1000"
.
U
val
AluSar
=
"b1101"
.
U
val
AluLui
=
"b1111"
.
U
/* BRU operation type */
private
val
FuOpTypeBruNum
=
10
val
BruJal
=
"b1000"
.
U
val
BruJalr
=
"b1001"
.
U
val
BruBeq
=
"b0000"
.
U
val
BruBne
=
"b0001"
.
U
/* LSU operation type */
private
val
FuOpTypeLsuNum
=
10
val
LsuLw
=
"b0010"
.
U
val
LsuSw
=
"b1010"
.
U
/* MDU operation type */
...
...
@@ -79,12 +83,20 @@ object Decode {
/* instruction pattern */
val
ADDI
=
BitPat
(
"b????????????_?????_000_?????_0010011"
)
val
SLTIU
=
BitPat
(
"b????????????_?????_011_?????_0010011"
)
val
ADD
=
BitPat
(
"b0000000_?????_?????_000_?????_0110011"
)
val
AUIPC
=
BitPat
(
"b????????????????????_?????_0010111"
)
val
LUI
=
BitPat
(
"b????????????????????_?????_0110111"
)
val
JAL
=
BitPat
(
"b????????????????????_?????_1101111"
)
val
JALR
=
BitPat
(
"b????????????_?????_000_?????_1100111"
)
val
BNE
=
BitPat
(
"b???????_?????_?????_001_?????_1100011"
)
val
BEQ
=
BitPat
(
"b???????_?????_?????_000_?????_1100011"
)
val
LW
=
BitPat
(
"b????????????_?????_010_?????_0000011"
)
val
SW
=
BitPat
(
"b???????_?????_?????_010_?????_0100011"
)
val
TRAP
=
BitPat
(
"b????????????_?????_000_?????_1101011"
)
...
...
@@ -96,12 +108,20 @@ object Decode {
/* Instr | FU | FU OP |
* Type | Type | Type | */
ADDI
->
List
(
InstrI
,
FuAlu
,
AluAdd
),
SLTIU
->
List
(
InstrI
,
FuAlu
,
AluSltu
),
ADD
->
List
(
InstrR
,
FuAlu
,
AluAdd
),
AUIPC
->
List
(
InstrU
,
FuAlu
,
AluAdd
),
LUI
->
List
(
InstrU
,
FuAlu
,
AluLui
),
JAL
->
List
(
InstrJ
,
FuBru
,
BruJal
),
JALR
->
List
(
InstrI
,
FuBru
,
BruJalr
),
BEQ
->
List
(
InstrB
,
FuBru
,
BruBeq
),
BNE
->
List
(
InstrB
,
FuBru
,
BruBne
),
LW
->
List
(
InstrI
,
FuLsu
,
LsuLw
),
SW
->
List
(
InstrS
,
FuLsu
,
LsuSw
),
TRAP
->
List
(
InstrI
,
FuAlu
,
AluAdd
)
...
...
src/main/scala/core/EXU.scala
浏览文件 @
84e97942
...
...
@@ -6,12 +6,16 @@ import chisel3.util._
import
Decode._
object
LookupTree
{
private
val
useMuxTree
=
true
def
apply
[
T
<:
Data
](
key
:
UInt
,
mapping
:
Iterable
[(
UInt
,
T
)])
:
T
=
Mux1H
(
mapping
.
map
(
p
=>
(
p
.
_1
===
key
,
p
.
_2
)))
def
apply
[
T
<:
Data
](
key
:
UInt
,
default
:
T
,
mapping
:
Iterable
[(
UInt
,
T
)])
:
T
=
if
(
useMuxTree
)
apply
(
key
,
mapping
)
else
MuxLookup
(
key
,
default
,
mapping
.
toSeq
)
}
class
ALU
{
private
val
useMuxTree
=
true
def
access
(
src1
:
UInt
,
src2
:
UInt
,
func
:
UInt
)
:
UInt
=
{
val
shamt
=
src2
(
4
,
0
)
val
funcList
=
List
(
...
...
@@ -24,25 +28,26 @@ class ALU {
AluOr
->
(
src1
|
src2
),
AluAnd
->
(
src1
&
src2
),
AluSub
->
(
src1
-
src2
),
AluLui
->
src2
,
AluSar
->
((
src1
.
asSInt
>>
shamt
).
asUInt
)
)
if
(
useMuxTree
)
LookupTree
(
func
,
funcList
)
else
MuxLookup
(
func
,
0.
U
,
funcList
)
LookupTree
(
func
,
0.
U
,
funcList
)
}
}
class
BRU
{
private
val
useMuxTree
=
true
def
access
(
src1
:
UInt
,
src2
:
UInt
,
func
:
UInt
)
:
(
UInt
,
Bool
)
=
{
def
access
(
pc
:
UInt
,
offset
:
UInt
,
src1
:
UInt
,
src2
:
UInt
,
func
:
UInt
)
:
(
UInt
,
Bool
)
=
{
val
funcList
=
List
(
BruJal
->
(
src1
+
src2
),
BruJalr
->
(
src1
+
src2
)
BruBeq
->
(
src1
===
src2
),
BruBne
->
(
src1
=/=
src2
),
BruJal
->
true
.
B
,
BruJalr
->
true
.
B
)
val
target
=
(
if
(
useMuxTree
)
LookupTree
(
func
,
funcList
)
else
MuxLookup
(
func
,
0.
U
,
funcList
))
val
isTaken
=
func
(
3
)
val
target
=
Mux
(
func
===
BruJalr
,
src1
+
src2
,
pc
+
offset
)
val
isTaken
=
LookupTree
(
func
,
false
.
B
,
funcList
)
(
target
,
isTaken
)
}
}
...
...
@@ -54,8 +59,7 @@ class LSU {
LsuSw
->
(
src1
+
src2
)
)
val
addr
=
(
if
(
useMuxTree
)
LookupTree
(
func
,
funcList
)
else
MuxLookup
(
func
,
0.
U
,
funcList
))
val
addr
=
LookupTree
(
func
,
0.
U
,
funcList
)
val
wen
=
func
(
3
)
(
addr
,
wen
)
}
...
...
@@ -72,7 +76,8 @@ class EXU extends Module {
val
(
src1
,
src2
,
fuType
,
fuOpType
)
=
(
io
.
in
.
data
.
src1
,
io
.
in
.
data
.
src2
,
io
.
in
.
ctrl
.
fuType
,
io
.
in
.
ctrl
.
fuOpType
)
val
aluOut
=
(
new
ALU
).
access
(
src1
=
src1
,
src2
=
src2
,
func
=
fuOpType
)
val
(
bruOut
,
bruIsTaken
)
=
(
new
BRU
).
access
(
src1
=
src1
,
src2
=
src2
,
func
=
fuOpType
)
val
(
bruOut
,
bruIsTaken
)
=
(
new
BRU
).
access
(
pc
=
io
.
in
.
pc
,
offset
=
src2
,
src1
=
src1
,
src2
=
io
.
in
.
data
.
dest
,
func
=
fuOpType
)
io
.
br
.
isTaken
:=
(
fuType
===
FuBru
)
&&
bruIsTaken
io
.
br
.
target
:=
bruOut
...
...
@@ -93,4 +98,6 @@ class EXU extends Module {
o
.
rfDest
:=
i
.
rfDest
}
io
.
out
.
pc
:=
io
.
in
.
pc
printf
(
"EXU: src1 = 0x%x, src2 = 0x%x\n"
,
src1
,
src2
)
}
src/main/scala/core/IDU.scala
浏览文件 @
84e97942
...
...
@@ -27,7 +27,7 @@ class IDU extends Module {
io
.
out
.
data
.
src2
:=
LookupTree
(
instrType
,
List
(
InstrI
->
Cat
(
Fill
(
20
,
instr
(
31
)),
instr
(
31
,
20
)),
InstrS
->
Cat
(
Fill
(
20
,
instr
(
31
)),
instr
(
31
,
25
),
instr
(
11
,
7
)),
InstrB
->
Cat
(
Fill
(
20
,
instr
(
31
)),
instr
(
7
),
instr
(
30
,
25
),
instr
(
11
,
6
),
0.
U
(
1.
W
)),
InstrB
->
Cat
(
Fill
(
20
,
instr
(
31
)),
instr
(
7
),
instr
(
30
,
25
),
instr
(
11
,
8
),
0.
U
(
1.
W
)),
InstrU
->
Cat
(
instr
(
31
,
12
),
0.
U
(
12.
W
)),
InstrJ
->
Cat
(
Fill
(
12
,
instr
(
31
)),
instr
(
19
,
12
),
instr
(
20
),
instr
(
30
,
21
),
0.
U
(
1.
W
))
))
...
...
@@ -37,5 +37,5 @@ class IDU extends Module {
io
.
out
.
ctrl
.
isTrap
:=
Cat
(
instrType
===
InstrN
,
instr
===
TRAP
)
printf
(
"IDU: pc = 0x%x, instr = 0x%x
, src1 = 0x%x, src2 = 0x%x\n"
,
io
.
in
.
pc
,
instr
,
io
.
out
.
data
.
src1
,
io
.
out
.
data
.
src2
)
printf
(
"IDU: pc = 0x%x, instr = 0x%x
\n"
,
io
.
in
.
pc
,
instr
)
}
src/test/scala/core/NOOPTester.scala
浏览文件 @
84e97942
...
...
@@ -39,8 +39,9 @@ class NOOPTester(noop: NOOP, imgPath: String) extends PeekPokeTester(noop)
poke
(
noop
.
io
.
imem
.
in
.
rdata
,
instr
)
val
addr
=
peek
(
noop
.
io
.
dmem
.
out
.
bits
.
addr
).
toInt
assert
((
addr
&
0x3
)
==
0
)
poke
(
noop
.
io
.
dmem
.
in
.
rdata
,
mem
(
addr
>>
2
))
val
valid
=
peek
(
noop
.
io
.
dmem
.
out
.
valid
)
assert
((
valid
!=
1
)
||
(
addr
&
0x3
)
==
0
)
poke
(
noop
.
io
.
dmem
.
in
.
rdata
,
if
(
valid
==
1
)
mem
(
addr
>>
2
)
else
0
)
val
wen
=
peek
(
noop
.
io
.
dmem
.
out
.
bits
.
wen
)
val
wdata
=
peek
(
noop
.
io
.
dmem
.
out
.
bits
.
wdata
).
toInt
if
(
wen
==
1
)
{
mem
(
addr
>>
2
)
=
wdata
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录