From 85b1c81d04be030b133f3a8921aa3d49ae2f0f55 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Thu, 18 Jul 2024 11:15:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A010.=20=D0=A0=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Исправлена ошибка в изображении с уровнями абстракций в системе RISCV. Изображение векторизовано. - Изменено взаимодействие с регистром mie, чтобы соответствовать привилегированной спецификации. - Удалено дублирование текста из дополнительных материалов по CSR. - Обновлена программа с обработчиком перехватов: теперь регистр mie выставляется в последнюю очередь. --- .pic/Labs/lab_10_irq.drawio.svg | 2 +- .pic/Labs/lab_10_irq/fig_01.drawio.svg | 4 + .pic/Labs/lab_10_irq/fig_01.png | Bin 32099 -> 0 bytes .pic/Labs/lab_10_irq/fig_03.drawio.svg | 2 +- .pic/Labs/lab_11_irq_integration.drawio.svg | 2 +- .../lab_11_irq_integration/fig_01.drawio.svg | 2 +- .pic/Labs/lab_13_peripheral_units.drawio.svg | 2 +- .../Labs/lab_15_programming_device.drawio.svg | 2 +- Labs/10. Interrupt subsystem/README.md | 129 ++++++++---------- .../11. Interrupt integration/irq_program.mem | 4 +- Other/CSR.md | 21 +-- 11 files changed, 79 insertions(+), 91 deletions(-) create mode 100644 .pic/Labs/lab_10_irq/fig_01.drawio.svg delete mode 100644 .pic/Labs/lab_10_irq/fig_01.png diff --git a/.pic/Labs/lab_10_irq.drawio.svg b/.pic/Labs/lab_10_irq.drawio.svg index 7cc0d3e..dc9cbcb 100644 --- a/.pic/Labs/lab_10_irq.drawio.svg +++ b/.pic/Labs/lab_10_irq.drawio.svg @@ -1,4 +1,4 @@ -
+
ALU
Register
File
instr
mem

clk_i

clk_i

RD1
RD2
WE
RA1
RA2
WA
WD
RA
RD
RAM

clk_i

Main 
Decoder

gpr_we
wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
jalr
mret
mem_req 
 illegal_instr
csr_we
csr_op
jalr
+
RD1
{[31:1],1'b0}
2
3
5
2

32
/

12
/

12
/

21
/

13
/

5
/

[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
4
0

0
1
2
3
4

0
1
2

PC

flag

0
2
1
csr_wd

1

0

wb_data
4
PC

clk_i

rst_i

0

1

0

1

flag

32
en
rst

32
/

stall_i

32
/

imm_S
imm_U
imm_J
imm_B
SE
SE
SE

32
/

32
/

SE

imm_I

32
/

ZE

32
/

imm_Z

jalr

32
/

stall_i

imm_I

не подключен
не подключен
не подключен
не подключен
LOAD/
STORE
UNIT
REQ
WE
SZ
WD
WA
 ST
RD
clk_i
rst_i

rst_i

stall_i

mem_size_o

32
32
32
3
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mc
rs
rst
imm
trap
op
rd
mie
mepc
mtvec
trap
rst_i
IRQ
CTRL
exc

clk_i

ireq
mei
rst_i
irq_c
iret
rst_i
mret
irq
\ No newline at end of file +
+
+
ALU
ALU
Register
File
Register...
instr
mem
instr...

clk_i

clk_i

clk_i

clk_i
RD1
RD1
RD2
RD2
WE
WE
RA1
RA1
RA2
RA2
WA
WA
WD
WD
RA
RA
RD
RD
RAM
RAM

clk_i

clk_i

Main 
Decoder

Main...
gpr_we
gpr_we
wb_sel
wb_sel
 mem_size
 mem_size
mem_we
mem_we
alu_op
alu_op
b_sel
b_sel
a_sel
a_sel
jal
jal
b
b
instr
instr
jalr
jalr
mret
mret
mem_req 
mem_req 
 illegal_instr
illegal_in...
csr_we
csr_we
csr_op
csr_op
jalr
jalr
+
+
RD1
RD1
{[31:1],1'b0}
{[31:1],1'b0}
2
2
3
3
5
5
2
2

32
/

32...

12
/

12...

12
/

12...

21
/

21...

13
/

13...

5
/

5...
[31:20]
[31:20]
[31:12], 12'h000
[31:12], 12'h000
[31:25][11:7]
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
[19:15]
4
4
0
0

0
1
2
3
4

0...

0
1
2

0...
PC
PC

flag

flag
0
0
2
2
1
1
csr_wd
csr_wd

1

0

1...
wb_data
wb_data
4
4
PC
PC

clk_i

clk_i

rst_i

rst_i

0

1

0...

0

1

0...

flag

flag
32
32
en
en
rst
rst

32
/

32...
stall_i
stall_i

32
/

32...
imm_S
imm_S
imm_U
imm_U
imm_J
imm_J
imm_B
imm_B
SE
SE
SE
SE
SE
SE

32
/

32...

32
/

32...
SE
SE

imm_I

imm_I

32
/

32...
ZE
ZE

32
/

32...

imm_Z

imm_Z
jalr
jalr

32
/

32...
stall_i
stall_i

imm_I

imm_I
не подключен
не подключен
не подключен
не подключен
не подключен
не подключен
не подключен
не подключен
LOAD/
STORE
UNIT
LOAD/...
REQ
REQ
WE
WE
SZ
SZ
WD
WD
WA
WA
 ST
 ST
RD
RD
clk_i
clk_i
rst_i
rs...

rst_i

rst_i
stall_i
stall_i

mem_size_o

mem_size_o
32
32
32
32
32
32
3
3
CONTROL
STATUS
REGISTERS
CONTROL...
WE
WE

clk_i

clk_i
addr
addr
pc
pc
mc
mc
rs
rs
rst
rst
imm
imm
trap
trap
op
op
rd
rd
mie
mie
mepc
mepc
mtvec
mtvec
trap
trap
rst_i
rst_i
IRQ
CTRL
IRQ...
exc
exc

clk_i

clk_i
ireq
ireq
mie
mie
rst_i
rst_i
irq_c
irq_c
iret
iret
rst_i
rst_i
mret
mret
irq
irq
Text is not SVG - cannot display
\ No newline at end of file diff --git a/.pic/Labs/lab_10_irq/fig_01.drawio.svg b/.pic/Labs/lab_10_irq/fig_01.drawio.svg new file mode 100644 index 0000000..54f9d14 --- /dev/null +++ b/.pic/Labs/lab_10_irq/fig_01.drawio.svg @@ -0,0 +1,4 @@ + + + +
Hardware
Hardware Abstraction Layer
Hypervisor Execution Environment
Hypervisor Binary Interface
Hypervisor
Supervisor Binary Interface
Operating System
Application Binary Interface
Application Binary Interface
App
App
App
App
Supervisor Binary Interface
Operating System
Application Binary Interface
Application Binary Interface
App
App
App
App
\ No newline at end of file diff --git a/.pic/Labs/lab_10_irq/fig_01.png b/.pic/Labs/lab_10_irq/fig_01.png deleted file mode 100644 index 4f18217efa33b67d81aa7530aed2fcf497b05121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32099 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 diff --git a/.pic/Labs/lab_10_irq/fig_03.drawio.svg b/.pic/Labs/lab_10_irq/fig_03.drawio.svg index 0116964..51e787c 100644 --- a/.pic/Labs/lab_10_irq/fig_03.drawio.svg +++ b/.pic/Labs/lab_10_irq/fig_03.drawio.svg @@ -1,4 +1,4 @@ -

Main
Decoder

flag

Register
File
imm_S
imm_U
4
0
RD1
RD2
gpr_we
WE

clk_i

wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
RA1
RA2
WA
WD
[19:15]
[24:20]
[11:07]
[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][19:12][20][30:21],1'b0
[31][7][30:25][11:8],1'b0
imm_J
imm_B
4
PC

clk_i

rst_i

jalr
ALU
SE
SE
+
mem_wd_o
instr_i
mem_addr_o
instr_addr_o
mem_rd_i
mem_we_o
mem_size_o
instr_addr_o

instr_i

mem_addr_o

mem_we_o

mem_size_o

rst_i

clk_i

SE

0

1

0

1

flag

32
/

32
/

32
/

32
/

32
/

12
/

12
/

21
/

13
/

32
/

mret
SE
mem_req 

mem_req_o

imm_I

— входные сигналы
выходные сигналы
mem_req_o

imm_I

RD1

flag

провода, разорванные        для удобства                    отображения схемы
PC

0
1
2
3
4

0
1
2

32
stall_i
stall_i

32
/

2
3
3
5
mem_wd_o
mem_rd_i
wb_data
wb_data
wb_data
32
PC
2
0
2
1
csr_wd
 illegal_instr
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mcause
rs1_data
rst
imm_data
trap
opcode
read_data
mie
mepc
mtvec
csr_we
csr_op
3
irq
trap
rst_i
csr_wd
mie
RD1
PC
[19:15]
ZE

5
/

32
/

imm_Z

imm_Z

instr_i[31:20]

mret
IRQ
CONTROLLER
exception_i

clk_i

irq_req_i
mie_i
rst_i
irq_cause_o
irq_ret_o
rst_i
trap
mret
irq
irq_ret_o
irq_req_i
mie[0]

imm_Z

csr_wd
irq
trap
mret
mie
irq_req_i
irq_ret_o
jalr
PC
jalr
32
32
32
32
12
32
32
32
32

1

0

stall_i
trap
trap
trap
ill_instr

0

1

ill_instr
32
32
irq
ill_instr
ill_instr
mret_i
irq_o
32'h0000_0002

imm_I

+
RD1
jalr
{[31:1],1'b0}

1

0

1

0

trap
trap
en
rst
\ No newline at end of file +

Main
Decoder

flag

Register
File
imm_S
imm_U
4
0
RD1
RD2
gpr_we
WE

clk_i

wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
RA1
RA2
WA
WD
[19:15]
[24:20]
[11:07]
[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][19:12][20][30:21],1'b0
[31][7][30:25][11:8],1'b0
imm_J
imm_B
4
PC

clk_i

rst_i

jalr
ALU
SE
SE
+
mem_wd_o
instr_i
mem_addr_o
instr_addr_o
mem_rd_i
mem_we_o
mem_size_o
instr_addr_o

instr_i

mem_addr_o

mem_we_o

mem_size_o

rst_i

clk_i

SE

0

1

0

1

flag

32
/

32
/

32
/

32
/

32
/

12
/

12
/

21
/

13
/

32
/

mret
SE
mem_req 

mem_req_o

imm_I

— входные сигналы
выходные сигналы
mem_req_o

imm_I

RD1

flag

провода, разорванные        для удобства                    отображения схемы
PC

0
1
2
3
4

0
1
2

32
stall_i
stall_i

32
/

2
3
3
5
mem_wd_o
mem_rd_i
wb_data
wb_data
wb_data
32
PC
2
0
2
1
csr_wd
 illegal_instr
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mcause
rs1_data
rst
imm_data
trap
opcode
read_data
mie
mepc
mtvec
csr_we
csr_op
3
irq
trap
rst_i
csr_wd
mie
RD1
PC
[19:15]
ZE

5
/

32
/

imm_Z

imm_Z

instr_i[31:20]

mret
IRQ
CONTROLLER
exception_i

clk_i

irq_req_i
mie_i
rst_i
irq_cause_o
irq_ret_o
rst_i
trap
mret
irq
irq_ret_o
irq_req_i
mie[16]

imm_Z

csr_wd
irq
trap
mret
mie
irq_req_i
irq_ret_o
jalr
PC
jalr
32
32
32
32
12
32
32
32
32

1

0

stall_i
trap
trap
trap
ill_instr

0

1

ill_instr
32
32
irq
ill_instr
ill_instr
mret_i
irq_o
32'h0000_0002

imm_I

+
RD1
jalr
{[31:1],1'b0}

1

0

1

0

trap
trap
en
rst
\ No newline at end of file diff --git a/.pic/Labs/lab_11_irq_integration.drawio.svg b/.pic/Labs/lab_11_irq_integration.drawio.svg index 0efbe69..ad33d12 100644 --- a/.pic/Labs/lab_11_irq_integration.drawio.svg +++ b/.pic/Labs/lab_11_irq_integration.drawio.svg @@ -1,4 +1,4 @@ -
+
ALU
Register
File
instr
mem

clk_i

clk_i

RD1
RD2
WE
RA1
RA2
WA
WD
RA
RD
RAM

clk_i

Main 
Decoder

gpr_we
wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
jalr
mret
mem_req 
 illegal_instr
csr_we
csr_op
jalr
+
RD1
{[31:1],1'b0}
2
3
5
2

32
/

12
/

12
/

21
/

13
/

5
/

[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
4
0

0
1
2
3
4

0
1
2

PC

flag

0
2
1
csr_wd

1

0

wb_data
4
PC

clk_i

rst_i

0

1

0

1

flag

32
en
rst

32
/

stall_i

32
/

imm_S
imm_U
imm_J
imm_B
SE
SE
SE

32
/

32
/

SE

imm_I

32
/

ZE

32
/

imm_Z

jalr

32
/

stall_i

imm_I

LOAD/
STORE
UNIT
REQ
WE
SZ
WD
WA
 ST
RD
clk_i
rst_i

rst_i

stall_i

mem_size_o

32
32
32
3
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mc
rs
rst
imm
trap
op
rd
mie
mepc
mtvec
trap
rst_i
IRQ
CTRL
exc

clk_i

ireq
mei
rst_i
irq_c
iret
rst_i
mret
irq
32

1

0

1

0

trap
mret
trap
3
32
32
trap
irq
ill_instr
trap
mem_we_o

mem_req_o

trap
trap
csr_wd
mie
RD1

imm_Z

instr_i[31:20]

mret
irq
PC
32
32
32
32
12
32
32


0

1

ill_instr
32
32
ill_instr
mie
32'h02
\ No newline at end of file +
+
+
ALU
ALU
Register
File
Register...
instr
mem
instr...

clk_i

clk_i

clk_i

clk_i
RD1
RD1
RD2
RD2
WE
WE
RA1
RA1
RA2
RA2
WA
WA
WD
WD
RA
RA
RD
RD
RAM
RAM

clk_i

clk_i

Main 
Decoder

Main...
gpr_we
gpr_we
wb_sel
wb_sel
 mem_size
 mem_size
mem_we
mem_we
alu_op
alu_op
b_sel
b_sel
a_sel
a_sel
jal
jal
b
b
instr
instr
jalr
jalr
mret
mret
mem_req 
mem_req 
 illegal_instr
illegal_in...
csr_we
csr_we
csr_op
csr_op
jalr
jalr
+
+
RD1
RD1
{[31:1],1'b0}
{[31:1],1'b0}
2
2
3
3
5
5
2
2

32
/

32...

12
/

12...

12
/

12...

21
/

21...

13
/

13...

5
/

5...
[31:20]
[31:20]
[31:12], 12'h000
[31:12], 12'h000
[31:25][11:7]
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
[19:15]
4
4
0
0

0
1
2
3
4

0...

0
1
2

0...
PC
PC

flag

flag
0
0
2
2
1
1
csr_wd
csr_wd

1

0

1...
wb_data
wb_data
4
4
PC
PC

clk_i

clk_i

rst_i

rst_i

0

1

0...

0

1

0...

flag

flag
32
32
en
en
rst
rst

32
/

32...
stall_i
stall_i

32
/

32...
imm_S
imm_S
imm_U
imm_U
imm_J
imm_J
imm_B
imm_B
SE
SE
SE
SE
SE
SE

32
/

32...

32
/

32...
SE
SE

imm_I

imm_I

32
/

32...
ZE
ZE

32
/

32...

imm_Z

imm_Z
jalr
jalr

32
/

32...
stall_i
stall_i

imm_I

imm_I
LOAD/
STORE
UNIT
LOAD/...
REQ
REQ
WE
WE
SZ
SZ
WD
WD
WA
WA
 ST
 ST
RD
RD
clk_i
clk_i
rst_i
rs...

rst_i

rst_i
stall_i
stall_i

mem_size_o

mem_size_o
32
32
32
32
32
32
3
3
CONTROL
STATUS
REGISTERS
CONTROL...
WE
WE

clk_i

clk_i
addr
addr
pc
pc
mc
mc
rs
rs
rst
rst
imm
imm
trap
trap
op
op
rd
rd
mie
mie
mepc
mepc
mtvec
mtvec
trap
trap
rst_i
rst_i
IRQ
CTRL
IRQ...
exc
exc

clk_i

clk_i
ireq
ireq
mie
mie
rst_i
rst_i
irq_c
irq_c
iret
iret
rst_i
rst_i
mret
mret
irq
irq
32
32

1

0

1...

1

0

1...
trap
trap
mret
mret
trap
trap
3
3
32
32
32
32
trap
trap
irq
irq
ill_instr
ill_in...
trap
trap
mem_we_o
mem_we_o

mem_req_o

mem_req_o
trap
trap
trap
trap
csr_wd
csr_wd
mie
mie
RD1
RD1

imm_Z

imm_Z

instr_i[31:20]

instr_i[31:2...
mret
mret
irq
irq
PC
PC
32
32
32
32
32
32
32
32
12
12
32
32
32
32


0

1

0...
ill_instr
ill_in...
32
32
32
32
ill_instr
ill_in...
mie[16]
mie[16]
32'h02
32'h02
Text is not SVG - cannot display
\ No newline at end of file diff --git a/.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg b/.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg index f8b9483..ae109ef 100644 --- a/.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg +++ b/.pic/Labs/lab_11_irq_integration/fig_01.drawio.svg @@ -1,4 +1,4 @@ -

Main
Decoder

flag

Register
File
imm_S
imm_U
4
0
RD1
RD2
gpr_we
WE

clk_i

wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
RA1
RA2
WA
WD
[19:15]
[24:20]
[11:07]
[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][19:12][20][30:21],1'b0
[31][7][30:25][11:8],1'b0
imm_J
imm_B
4
PC

clk_i

rst_i

jalr
ALU
SE
SE
+
mem_wd_o
instr_i
mem_addr_o
instr_addr_o
mem_rd_i
mem_we_o
mem_size_o
instr_addr_o

instr_i

mem_addr_o

mem_we_o

mem_size_o

rst_i

clk_i

SE

0

1

0

1

flag

32
/

32
/

32
/

32
/

32
/

12
/

12
/

21
/

13
/

32
/

mret
SE
mem_req 

mem_req_o

imm_I

— входные сигналы
выходные сигналы
mem_req_o

imm_I

RD1

flag

провода, разорванные        для удобства                    отображения схемы
PC

0
1
2
3
4

0
1
2

32
stall_i
stall_i

32
/

2
3
3
5
mem_wd_o
mem_rd_i
wb_data
wb_data
wb_data
32
PC
2
0
2
1
csr_wd
 illegal_instr
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mcause
rs1_data
rst
imm_data
trap
opcode
read_data
mie
mepc
mtvec
csr_we
csr_op
3
irq
trap
rst_i
csr_wd
mie
RD1
PC
[19:15]
ZE

5
/

32
/

imm_Z

imm_Z

instr_i[31:20]

mret
IRQ
CONTROLLER
exception_i

clk_i

irq_req_i
mie_i
rst_i
irq_cause_o
irq_ret_o
rst_i
trap
mret
irq
irq_ret_o
irq_req_i
mie[0]

imm_Z

csr_wd
irq
trap
mret
mie
irq_req_i
irq_ret_o
jalr
PC
jalr
32
32
32
32
12
32
32
32
32

1

0

stall_i
trap
trap
trap
ill_instr

0

1

ill_instr
32
32
irq
ill_instr
ill_instr
mret_i
irq_o
32'h0000_0002

imm_I

+
RD1
jalr
{[31:1],1'b0}

1

0

1

0

trap
trap
en
rst
\ No newline at end of file +

Main
Decoder

flag

Register
File
imm_S
imm_U
4
0
RD1
RD2
gpr_we
WE

clk_i

wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
RA1
RA2
WA
WD
[19:15]
[24:20]
[11:07]
[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][19:12][20][30:21],1'b0
[31][7][30:25][11:8],1'b0
imm_J
imm_B
4
PC

clk_i

rst_i

jalr
ALU
SE
SE
+
mem_wd_o
instr_i
mem_addr_o
instr_addr_o
mem_rd_i
mem_we_o
mem_size_o
instr_addr_o

instr_i

mem_addr_o

mem_we_o

mem_size_o

rst_i

clk_i

SE

0

1

0

1

flag

32
/

32
/

32
/

32
/

32
/

12
/

12
/

21
/

13
/

32
/

mret
SE
mem_req 

mem_req_o

imm_I

— входные сигналы
выходные сигналы
mem_req_o

imm_I

RD1

flag

провода, разорванные        для удобства                    отображения схемы
PC

0
1
2
3
4

0
1
2

32
stall_i
stall_i

32
/

2
3
3
5
mem_wd_o
mem_rd_i
wb_data
wb_data
wb_data
32
PC
2
0
2
1
csr_wd
 illegal_instr
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mcause
rs1_data
rst
imm_data
trap
opcode
read_data
mie
mepc
mtvec
csr_we
csr_op
3
irq
trap
rst_i
csr_wd
mie
RD1
PC
[19:15]
ZE

5
/

32
/

imm_Z

imm_Z

instr_i[31:20]

mret
IRQ
CONTROLLER
exception_i

clk_i

irq_req_i
mie_i
rst_i
irq_cause_o
irq_ret_o
rst_i
trap
mret
irq
irq_ret_o
irq_req_i
mie[16]

imm_Z

csr_wd
irq
trap
mret
mie
irq_req_i
irq_ret_o
jalr
PC
jalr
32
32
32
32
12
32
32
32
32

1

0

stall_i
trap
trap
trap
ill_instr

0

1

ill_instr
32
32
irq
ill_instr
ill_instr
mret_i
irq_o
32'h0000_0002

imm_I

+
RD1
jalr
{[31:1],1'b0}

1

0

1

0

trap
trap
en
rst
\ No newline at end of file diff --git a/.pic/Labs/lab_13_peripheral_units.drawio.svg b/.pic/Labs/lab_13_peripheral_units.drawio.svg index 5069e90..2ef7a19 100644 --- a/.pic/Labs/lab_13_peripheral_units.drawio.svg +++ b/.pic/Labs/lab_13_peripheral_units.drawio.svg @@ -1,4 +1,4 @@ -
+
ALU
Register
File
instr
mem

clk_i

clk_i

RD1
RD2
WE
RA1
RA2
WA
WD
RA
RD
RAM

clk_i

Main 
Decoder

gpr_we
wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
jalr
mret
mem_req 
 illegal_instr
csr_we
csr_op
jalr
+
RD1
{[31:1],1'b0}
2
3
5
2

32
/

12
/

12
/

21
/

13
/

5
/

[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
4
0

0
1
2
3
4

0
1
2

PC

flag

0
2
1
csr_wd

1

0

wb_data
4
PC

clk_i

rst_i

0

1

0

1

flag

32
en
rst

32
/

stall_i

32
/

imm_S
imm_U
imm_J
imm_B
SE
SE
SE

32
/

32
/

SE

imm_I

32
/

ZE

32
/

imm_Z

jalr

32
/

stall_i

imm_I

LOAD/
STORE
UNIT
REQ
WE
SZ
WD
WA
 ST
RD
clk_i
rst_i

rst_i

stall_i

mem_size_o

32
32
32
3
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mc
rs
rst
imm
trap
op
rd
mie
mepc
mtvec
trap
rst_i
IRQ
CTRL
exc

clk_i

ireq
mei
rst_i
irq_c
iret
rst_i
mret
irq
32

1

0

1

0

trap
mret
trap
3
32
32
trap
irq
ill_instr
trap
mem_we_o

mem_req_o

trap
trap
csr_wd
mie
RD1

imm_Z

instr_i[31:20]

mret
irq
PC
32
32
32
32
12
32
32


0

1

ill_instr
32
32
ill_instr
mie
32'h02
PU 0
PU 1

clk_i

clk_i

vga
ps/2
\ No newline at end of file +
+
+
ALU
ALU
Register
File
Register...
instr
mem
instr...

clk_i

clk_i

clk_i

clk_i
RD1
RD1
RD2
RD2
WE
WE
RA1
RA1
RA2
RA2
WA
WA
WD
WD
RA
RA
RD
RD
RAM
RAM

clk_i

clk_i

Main 
Decoder

Main...
gpr_we
gpr_we
wb_sel
wb_sel
 mem_size
 mem_size
mem_we
mem_we
alu_op
alu_op
b_sel
b_sel
a_sel
a_sel
jal
jal
b
b
instr
instr
jalr
jalr
mret
mret
mem_req 
mem_req 
 illegal_instr
illegal_in...
csr_we
csr_we
csr_op
csr_op
jalr
jalr
+
+
RD1
RD1
{[31:1],1'b0}
{[31:1],1'b0}
2
2
3
3
5
5
2
2

32
/

32...

12
/

12...

12
/

12...

21
/

21...

13
/

13...

5
/

5...
[31:20]
[31:20]
[31:12], 12'h000
[31:12], 12'h000
[31:25][11:7]
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
[19:15]
4
4
0
0

0
1
2
3
4

0...

0
1
2

0...
PC
PC

flag

flag
0
0
2
2
1
1
csr_wd
csr_wd

1

0

1...
wb_data
wb_data
4
4
PC
PC

clk_i

clk_i

rst_i

rst_i

0

1

0...

0

1

0...

flag

flag
32
32
en
en
rst
rst

32
/

32...
stall_i
stall_i

32
/

32...
imm_S
imm_S
imm_U
imm_U
imm_J
imm_J
imm_B
imm_B
SE
SE
SE
SE
SE
SE

32
/

32...

32
/

32...
SE
SE

imm_I

imm_I

32
/

32...
ZE
ZE

32
/

32...

imm_Z

imm_Z
jalr
jalr

32
/

32...
stall_i
stall_i

imm_I

imm_I
LOAD/
STORE
UNIT
LOAD/...
REQ
REQ
WE
WE
SZ
SZ
WD
WD
WA
WA
 ST
 ST
RD
RD
clk_i
clk_i
rst_i
rs...

rst_i

rst_i
stall_i
stall_i

mem_size_o

mem_size_o
32
32
32
32
32
32
3
3
CONTROL
STATUS
REGISTERS
CONTROL...
WE
WE

clk_i

clk_i
addr
addr
pc
pc
mc
mc
rs
rs
rst
rst
imm
imm
trap
trap
op
op
rd
rd
mie
mie
mepc
mepc
mtvec
mtvec
trap
trap
rst_i
rst_i
IRQ
CTRL
IRQ...
exc
exc

clk_i

clk_i
ireq
ireq
mie
mie
rst_i
rst_i
irq_c
irq_c
iret
iret
rst_i
rst_i
mret
mret
irq
irq
32
32

1

0

1...

1

0

1...
trap
trap
mret
mret
trap
trap
3
3
32
32
32
32
trap
trap
irq
irq
ill_instr
ill_in...
trap
trap
mem_we_o
mem_we_o

mem_req_o

mem_req_o
trap
trap
trap
trap
csr_wd
csr_wd
mie
mie
RD1
RD1

imm_Z

imm_Z

instr_i[31:20]

instr_i[31:2...
mret
mret
irq
irq
PC
PC
32
32
32
32
32
32
32
32
12
12
32
32
32
32


0

1

0...
ill_instr
ill_in...
32
32
32
32
ill_instr
ill_in...
mie[16]
mie[16]
32'h02
32'h02
PU 0
PU 0
PU 1
PU 1

clk_i

clk_i

clk_i

clk_i
vga
vga
ps/2
ps/2
Text is not SVG - cannot display
\ No newline at end of file diff --git a/.pic/Labs/lab_15_programming_device.drawio.svg b/.pic/Labs/lab_15_programming_device.drawio.svg index 528a169..5ea63a9 100644 --- a/.pic/Labs/lab_15_programming_device.drawio.svg +++ b/.pic/Labs/lab_15_programming_device.drawio.svg @@ -1,4 +1,4 @@ -
+
ALU
Register
File
instr
mem

clk_i

clk_i

RD1
RD2
WE
RA1
RA2
WA
WD
RA
RD
RAM

clk_i

Main 
Decoder

gpr_we
wb_sel
 mem_size
mem_we
alu_op
b_sel
a_sel
jal
b
instr
jalr
mret
mem_req 
 illegal_instr
csr_we
csr_op
jalr
+
RD1
{[31:1],1'b0}
2
3
5
2

32
/

12
/

12
/

21
/

13
/

5
/

[31:20]
[31:12], 12'h000
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
4
0

0
1
2
3
4

0
1
2

PC

flag

0
2
1
csr_wd

1

0

wb_data
4
PC

clk_i

rst_i

0

1

0

1

flag

32
en
rst

32
/

stall_i

32
/

imm_S
imm_U
imm_J
imm_B
SE
SE
SE

32
/

32
/

SE

imm_I

32
/

ZE

32
/

imm_Z

jalr

32
/

stall_i

imm_I

LOAD/
STORE
UNIT
REQ
WE
SZ
WD
WA
 ST
RD
clk_i
rst_i

rst_i

stall_i

mem_size_o

32
32
32
3
CONTROL
STATUS
REGISTERS
WE

clk_i

addr
pc
mc
rs
rst
imm
trap
op
rd
mie
mepc
mtvec
trap
rst_i
IRQ
CTRL
exc

clk_i

ireq
mei
rst_i
irq_c
iret
rst_i
mret
irq
32

1

0

1

0

trap
mret
trap
3
32
32
trap
irq
ill_instr
trap
mem_we_o

mem_req_o

trap
trap
csr_wd
mie
RD1

imm_Z

instr_i[31:20]

mret
irq
PC
32
32
32
32
12
32
32


0

1

ill_instr
32
32
ill_instr
mie
32'h02
PU 0
PU 1

clk_i

clk_i

vga
ps/2
Bluster
WD
WA
WE

clk_i

UART
WE
WA
WD
\ No newline at end of file +
+
+
ALU
ALU
Register
File
Register...
instr
mem
instr...

clk_i

clk_i

clk_i

clk_i
RD1
RD1
RD2
RD2
WE
WE
RA1
RA1
RA2
RA2
WA
WA
WD
WD
RA
RA
RD
RD
RAM
RAM

clk_i

clk_i

Main 
Decoder

Main...
gpr_we
gpr_we
wb_sel
wb_sel
 mem_size
 mem_size
mem_we
mem_we
alu_op
alu_op
b_sel
b_sel
a_sel
a_sel
jal
jal
b
b
instr
instr
jalr
jalr
mret
mret
mem_req 
mem_req 
 illegal_instr
illegal_in...
csr_we
csr_we
csr_op
csr_op
jalr
jalr
+
+
RD1
RD1
{[31:1],1'b0}
{[31:1],1'b0}
2
2
3
3
5
5
2
2

32
/

32...

12
/

12...

12
/

12...

21
/

21...

13
/

13...

5
/

5...
[31:20]
[31:20]
[31:12], 12'h000
[31:12], 12'h000
[31:25][11:7]
[31:25][11:7]
[31][7][30:25][11:8],1'b0
[31][7][30:25][11:8],1'b0
[31][19:12][20][30:21],1'b0
[31][19:12][20][30:21],1'b0
[19:15]
[19:15]
4
4
0
0

0
1
2
3
4

0...

0
1
2

0...
PC
PC

flag

flag
0
0
2
2
1
1
csr_wd
csr_wd

1

0

1...
wb_data
wb_data
4
4
PC
PC

clk_i

clk_i

rst_i

rst_i

0

1

0...

0

1

0...

flag

flag
32
32
en
en
rst
rst

32
/

32...
stall_i
stall_i

32
/

32...
imm_S
imm_S
imm_U
imm_U
imm_J
imm_J
imm_B
imm_B
SE
SE
SE
SE
SE
SE

32
/

32...

32
/

32...
SE
SE

imm_I

imm_I

32
/

32...
ZE
ZE

32
/

32...

imm_Z

imm_Z
jalr
jalr

32
/

32...
stall_i
stall_i

imm_I

imm_I
LOAD/
STORE
UNIT
LOAD/...
REQ
REQ
WE
WE
SZ
SZ
WD
WD
WA
WA
 ST
 ST
RD
RD
clk_i
clk_i
rst_i
rs...

rst_i

rst_i
stall_i
stall_i

mem_size_o

mem_size_o
32
32
32
32
32
32
3
3
CONTROL
STATUS
REGISTERS
CONTROL...
WE
WE

clk_i

clk_i
addr
addr
pc
pc
mc
mc
rs
rs
rst
rst
imm
imm
trap
trap
op
op
rd
rd
mie
mie
mepc
mepc
mtvec
mtvec
trap
trap
rst_i
rst_i
IRQ
CTRL
IRQ...
exc
exc

clk_i

clk_i
ireq
ireq
mie
mie
rst_i
rst_i
irq_c
irq_c
iret
iret
rst_i
rst_i
mret
mret
irq
irq
32
32

1

0

1...

1

0

1...
trap
trap
mret
mret
trap
trap
3
3
32
32
32
32
trap
trap
irq
irq
ill_instr
ill_in...
trap
trap
mem_we_o
mem_we_o

mem_req_o

mem_req_o
trap
trap
trap
trap
csr_wd
csr_wd
mie
mie
RD1
RD1

imm_Z

imm_Z

instr_i[31:20]

instr_i[31:2...
mret
mret
irq
irq
PC
PC
32
32
32
32
32
32
32
32
12
12
32
32
32
32


0

1

0...
ill_instr
ill_in...
32
32
32
32
ill_instr
ill_in...
mie[16]
mie[16]
32'h02
32'h02
PU 0
PU 0
PU 1
PU 1

clk_i

clk_i

clk_i

clk_i
vga
vga
ps/2
ps/2
Bluster
Bluster
WD
WD
WA
WA
WE
WE

clk_i

clk_i
UART
UART
WE
WE
WA
WA
WD
WD
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Labs/10. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md index bde3bfe..f7016b2 100644 --- a/Labs/10. Interrupt subsystem/README.md +++ b/Labs/10. Interrupt subsystem/README.md @@ -2,6 +2,10 @@ Данная лабораторная работа посвящена изучению систем прерывания в компьютерах и их использованию для обработки программных и аппаратных событий. В процессе работы вы познакомитесь с основными понятиями и принципами работы систем прерывания, а также со средствами программной обработки прерываний. +## Материал для подготовки к лабораторной работе + +- Изучить [теорию по регистрам контроля и статуса](../../Other/CSR.md). + ## Цель 1. Разработать модуль контроллера прерываний. @@ -35,13 +39,15 @@ --- -На протяжении многих лет, концепция понятия "прерывание" постоянно расширялась. Семейство процессоров 80x86 внесло ещё большую путаницу введя инструкцию `int` (программное прерывание). Многие производители используют такие термины как: **исключение** (_exception_), **ошибка** (_fault_), **отказ** (_abort_), **ловушка** (_trap_) и **прерывание** (_interrupt_), чтобы описать явление, которому посвящена данная лабораторная работа. К несчастью, не существует какого-то чёткого соглашения насчёт этих названий. Разные авторы по-разному приспосабливают эти термины для своего повествования[[3, стр. 995](https://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/CH17.PDF)]. Для того, чтобы постараться избежать путаницы, в данной лабораторной работе мы будем использовать три термина, которые введены в спецификации архитектуры RISC-V[[4, стр. 10](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf)], однако имейте в виду, что за пределами этой методички и спецификации RISC-V в эти термины могут вкладывать другие смыслы. +На протяжении многих лет, концепция понятия "прерывание" постоянно расширялась. Семейство процессоров 80x86 внесло ещё большую путаницу введя инструкцию `int` (программное прерывание). Многие производители используют такие термины как: **исключение** (_exception_), **ошибка** (_fault_), **отказ** (_abort_), **ловушка** (_trap_) и **прерывание** (_interrupt_), чтобы описать явление, которому посвящена данная лабораторная работа. К несчастью, не существует какого-то чёткого соглашения насчёт этих названий. Разные авторы по-разному приспосабливают эти термины для своего повествования[[3, стр. 995](https://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/CH17.PDF)]. + +Для того, чтобы постараться избежать путаницы, в данной лабораторной работе мы будем использовать три термина, которые введены в спецификации архитектуры RISC-V[[4, стр. 10](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf)], однако имейте в виду, что за пределами данного практикума и спецификации RISC-V в эти термины могут вкладывать другие смыслы. Сперва озвучим выдержку из спецификации, а потом дадим этим терминам обывательские определения. 1. Под **исключением** будут подразумеваться нетипичные условия, произошедшие во время исполнения программы, связанные с инструкцией в текущем харте (_hart_, сокращение от **har**dware **t**hread — аппаратном потоке). 2. Под **прерыванием** будут подразумеваться внешние асинхронные события, которые могут стать причиной непредвиденной передачи управления внутри текущего харта. -3. Под **перехватом** (вариант глагольного использования слова _trap_, которое обычно переводят как "ловушка") будет подразумеваться передача управления **обработчику перехватов** (_trap handler_), вызванная либо прерыванием, либо исключением. +3. Под **перехватом** (вариант глагольного использования слова _trap_, которое обычно переводят как "ловушка", что по мнению автора совершенно не раскрывает сути этого понятия) будет подразумеваться передача управления **обработчику перехватов** (_trap handler_), вызванная либо прерыванием, либо исключением. Иными словами, **прерываниями** мы будем называть исключительно аппаратные (внешние, асинхронные) события, которые могут привести к **перехвату** (передаче управления обработчику). Под **исключениями** мы будем подразумевать исключительно программные (являющиеся следствием какой-то инструкции, синхронные) события, которые могут привести к **перехвату**. @@ -49,18 +55,20 @@ Прерывания и исключения — это события (причины). Перехват — это действие (следствие). +Та часть разрабатываемой процессорной системы, которая будет отвечать за обработку прерываний и исключений, будет называться традиционным именем "**Система прерываний**". + --- -Современные процессоры, предусматривающие запуск операционной системы, обладают несколькими уровнями привилегий выполнения инструкций. Это значит, что существует специальный регистр, определяющий режим, в котором в данный момент находится вычислительная машина. Наличие определенного значения в этом регистре устанавливает определенные ограничения для выполняемой в данный момент программы. В архитектуре RISC-V выделяется 4 режима работы, в порядке убывания возможностей и увеличения ограничений: +Современные процессоры, предусматривающие запуск операционной системы, обладают несколькими уровнями привилегий выполнения инструкций. Это значит, что существует специальный регистр, определяющий режим, в котором в данный момент находится вычислительная машина. Наличие определенного значения в этом регистре устанавливает соответствующие ограничения для выполняемой в данный момент программы. В архитектуре RISC-V выделяется 4 режима работы, в порядке убывания возможностей и увеличения ограничений: 1. **машинный** (machine mode), в котором можно всё; 2. **гипервизора** (hypervisor mode), который поддерживает виртуализацию машин, то есть эмуляцию нескольких машин (потенциально с несколькими операционными системами), работающих на одной физической машине; 3. **привилегированный** (supervisor mode), для операционных систем, с возможностью управления ресурсами; 4. **пользовательский** (user mode), для прикладных программ, использующих только те ресурсы, которые определила операционная система. -![../../.pic/Labs/lab_10_irq/fig_01.png](../../.pic/Labs/lab_10_irq/fig_01.png) +![../../.pic/Labs/lab_10_irq/fig_01.drawio.svg](../../.pic/Labs/lab_10_irq/fig_01.drawio.svg) -_Рисунок 1. Распределение привилегий по уровням абстракций программного обеспечения._ +_Рисунок 1. Распределение привилегий по уровням абстракций программного обеспечения [[5, стр.448](https://doi.org/10.1007/978-981-16-9113-3_33)]._ Переключение между этими режимами происходит с помощью исключения, называемого **системный вызов**, и который происходит при выполнении специальной инструкции. Для RISC-V такой инструкцией является **ecall**. Это похоже на вызов подпрограммы, но при системном вызове изменяется режим работы и управление передается операционной системе, которая, по коду в инструкции вызова определяет, что от нее хотят. Например, операционная система может предоставить данные с диска, так как запускаемая программа не имеет никакого представления о том, на какой машине ее запустили, или что используется какая-то конкретная файловая система. @@ -72,92 +80,61 @@ _Рисунок 1. Распределение привилегий по уров В самом простом случае система прерывания позволяет обрабатывать только одно прерывание за раз (именно такую систему мы и будет делать в рамках данной лабораторной работы). Существуют реализации позволяющие во время обработки прерывания «отвлекаться» на другие события. В таких системах используется система приоритетов, чтобы прерывание с более низким приоритетом не прерывало более приоритетное. -### Регистры Статуса и Управления (Control and Status Registers) +### Регистры Контроля и Статуса -Для поддержания работы операционной системы, виртуализации, системы прерывания и тому подобное, в архитектуре RISC-V предусмотрено использование группы регистров, под общим названием **Control and Status Registers** (**CSR**), обеспечивающих управление элементами процессора и доступ к статусной информации о системе. С помощью этих регистров реализуются привилегированные режимы работы процессора, хранение указателей на различные программные стеки, статус различных подсистем, регистры для обеспечения работы прерываний и многое другое. +В процессе создания декодера инструкций в [ЛР№5](../05.%20Main%20decoder/) вы уже реализовывали инструкции для работы с [регистрами контроля и статуса](../../Other/CSR.md). Теперь необходимо спроектировать блок управления этими регистрами. -Все регистры имеют уникальные 12-битные адреса, а их роли определены в спецификации на архитектуру RISC-V. В _Таблице 1_ приводится фрагмент спецификации привилегированной архитектуры[[5, стр. 10]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf), иллюстрирующая некоторые из регистров. В левом столбце указан 12-битный адрес. Далее указывается в каком режиме, что можно делать с этим регистром. После идет название, а в правом столбике описание. - -В этой таблице можно увидеть регистры для сохранения адреса возврата из прерывания, адрес вектора прерывания, регистры причины (cause), регистры настройки безопасности и защиты памяти. И это далеко не полный список регистров, предоставляемых стандартом (который помимо прочего, оставляет место в адресном пространстве для ваших собственных регистров). - -![../../.pic/Labs/lab_10_irq/tab_01.png](../../.pic/Labs/lab_10_irq/tab_01.png) - -_Таблица 1. Регистры контроля и состояния машинного (наивысшего) уровня привилегий._ - -Для работы с CS-регистрами используются специальные инструкции **SYSTEM** (1110011) I-типа, хранящие в 12-битном поле **imm** адрес регистра, к которому будет осуществлен доступ и адреса в регистровом файле откуда будет считан или куда будет записан один из CS-регистров. Вы уже добавляли поддержку этих инструкций во время выполнения [лабораторной работы №5](../05.%20Main%20decoder/) "Основной дешифратор". - -| opcode | func3 | Тип | Инструкция | Описание | Операция | -|--------|-------|-----|---------------------|---------------------------|-----------------------------| -|1110011 | 000 | I | mret | Возврат из прерывания | PC = mepc | -|1110011 | 001 | I | csrrw rd, csr, rs1 | Чтение и Запись CSR | rd = csr, csr = rs1 | -|1110011 | 010 | I | csrrs rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| rs1 | -|1110011 | 011 | I | csrrc rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~rs1 | -|1110011 | 101 | I | csrrwi rd, csr, rs1 | Чтение и Запись CSR | rd = csr, csr = imm | -|1110011 | 110 | I | csrrsi rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| imm | -|1110011 | 111 | I | csrrci rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~imm | - -_Таблица 2. Список инструкций для работы с регистрами контроля и статуса._ - -Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CS-регистрами. - -| Псевдоинструкция | Инструкция RISC-V | Описание | Операция | -|------------------|--------------------|-------------|-----------| -| csrr rd, csr | csrrs rd, csr, x0 | Чтение CSR | rd = csr | -| csrw csr, rs1 | csrrw x0, csr, rs1 | Запись CSR | csr = rs1 | - -_Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса._ - -Операция логического ИЛИ нулевого регистра с содержимым CS-регистра не меняет его содержимого, поэтому при использовании инструкции `csrr` происходит только операция чтения. Подобным образом реализована псевдоинструкция `csrw`. - -Для реализации простейшей системы прерывания на процессоре с архитектурой RISC-V достаточно реализовать 5 CS-регистров, работающих в машинном, самом привилегированном режиме. +Для реализации простейшей системы прерывания на процессоре с архитектурой RISC-V достаточно реализовать 5 регистров контроля и статуса, работающих в машинном (самом привилегированном) режиме. | Адрес | Уровень привилегий | Название | Описание | |--------|--------------------|----------|----------------------------------------------------| | **Machine Trap Setup** | -|0x304 | MRW | mie | Регистр маски прерываний. | +|0x304 | MRW | mie | Регистр маски перехватов. | |0x305 | MRW | mtvec | Базовый адрес обработчика перехвата. | |0x340 | MRW | mscratch | Адрес верхушки стека обработчика перехвата. | |0x341 | MRW | mepc | Регистр, хранящий адрес перехваченной инструкции. | |0x342 | MRW | mcause | Причина перехвата | -_Таблица 4. Список регистров, подлежащих реализации в рамках лабораторной работы._ +_Таблица 1. Список регистров, подлежащих реализации в рамках лабораторной работы._ -По адресу `0x304` должен располагаться регистр, позволяющий маскировать прерывания. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1. +По адресу `0x304` должен располагаться регистр, позволяющий маскировать перехваты. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1. Младшие 16 бит этого регистра спецификация RISC-V отводит под маскирование специальных системных прерываний, который не будут поддерживаться нашим процессором (подробней об этом будет в описании регистра mcause). Поэтому в нашей процессорной системе мы будем использовать только старшие 16 бит регистра `mie`, которые отведены для нужд конкретной платформы. -Регистр `mtvec` состоит из двух полей: BASE[31:2] и MODE. Поле BASE хранит старшие 30 бит базового адреса обработчика перехвата (поскольку этот адрес должен быть всегда равен четырем, младшие два бита считаются равными нулю). Поле MODE кодирует тип системы прерывания: +По адресу `0x305` должен располагаться регистр `mtvec`, который состоит из двух полей: BASE[31:2] и MODE. Поле BASE хранит старшие 30 бит базового адреса обработчика перехвата (поскольку этот адрес должен быть всегда равен четырем, младшие два бита считаются равными нулю). Поле MODE кодирует тип системы прерывания: - `MODE == 2'd0` — система прерывания обзорная; - `MODE == 2'd1` — система прерывания векторная. ![../../.pic/Labs/lab_10_irq/fig_02.png](../../.pic/Labs/lab_10_irq/fig_02.png) -Рисунок 2. Разделение регистра `mtvec` на поля `BASE` и `MODE` +_Рисунок 2. Разделение регистра `mtvec` на поля `BASE` и `MODE`_ В случае обзорной системы прерывания, любой перехват приводит к загрузке в PC значения базового адреса обработчика перехвата (`PC=BASE`). В векторной системе прерывания исключения обрабатываются таким же способом, как и в обзорной системе, а вот прерывания обрабатываются путем загрузки в PC суммы базового адреса и учетверенного значения причины прерывания (`PC=BASE+4*CAUSE`). В рамках данной лабораторной работы мы будем реализовывать обзорную систему прерываний. Кроме того, поскольку у обзорной системы прерываний `MODE==0`, что совпадет с тем, что два младших бита базового адреса обработчика перехвата должны быть равны нулю, при перехвате мы можем присваивать программному счетчику значение `mtvec` без каких-либо преобразований. -Так как обработчик перехвата будет использовать те же регистры, что и прерванная программа, то перед использованием регистрового файла, данные из него необходимо сохранить, разместив их на стеке. Стек для перехвата находится не там же, где программный стек, а адрес начала этого стека хранится в регистре `mscratch` и по сути является указателем на верхушку стека. Регистр `mepc` сохраняет адрес инструкции во время которой произошел перехват. Это очень важно понимать, при реализации обработчика исключения — если в нем не перезаписать этот регистр, по возврату из обработчика процессор снова окажется на инструкции, которая вызвала исключение. +Так как обработчик перехвата будет использовать те же регистры, что и прерванная программа, перед использованием регистрового файла, данные из него необходимо сохранить, разместив их на специальном стеке — стеке прерываний. Адрес начала этого стека хранится в регистре `mscratch`, расположенного по адресу `0x340` и по сути является указателем на верхушку стека прерываний. -То как кодируется причина перехвата в регистре `mcause` описано в спецификации привилегированной архитектуры[[5, стр. 38]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf): +Регистр `mepc`, расположенный по адресу `0x341` сохраняет адрес инструкции во время исполнения которой произошел перехват. Это очень важно понимать, при реализации **обработчика исключения** — если в нем не перезаписать этот регистр, по возврату из обработчика **процессор снова окажется на инструкции, которая вызвала исключение**. + +То как кодируется причина перехвата в регистре `mcause`, расположенного по адресу `0x342` описано в спецификации привилегированной архитектуры[[6, стр. 38]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf): ![../../.pic/Labs/lab_10_irq/tab_05.png](../../.pic/Labs/lab_10_irq/tab_05.png) -_Таблица 5. Кодирование причины перехвата в регистре `mcause`._ +_Таблица 2. Кодирование причины перехвата в регистре `mcause`._ -Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. В случае, если вы захотите расширить количество источников прерываний, вы можете выполнить вспомогательную [лабораторную работу №12](../12.%20Daisy%20chain). +Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го, именно поэтому мы будем использовать только старшие 16 бит регистра `mie`). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. В случае, если вы захотите расширить количество источников прерываний, вы можете выполнить вспомогательную [лабораторную работу №12](../12.%20Daisy%20chain). Таким образом: в случае если произошло исключение (в связи с нелегальной инструкцией), значение `mcause` должно быть `0x00000002`. Если произошло прерывание, значение `mcause` должно быть `0x80000010`. При желании, процессор можно будет улучшить, добавив поддержку большего числа периферийных устройств. В этом случае потребуется только расширить контроллер прерываний. -Когда процессор включается, программа первым делом должна инициализировать все требуемые CS-регистры, в частности: +Когда процессор включается, программа первым делом должна инициализировать регистры контроля и статуса, в частности: -- задать маску прерывания `mie`, - задать адрес вектора прерывания `mtvec`, -- задать адрес вершины стека прерываний `mscratch`. +- задать адрес вершины стека прерываний `mscratch`, +- задать маску прерывания `mie`. -После чего уже можно переходить к исполнению основного потока инструкций. +После чего уже можно переходить к исполнению основного потока инструкций. Обратите внимание, что маску прерываний следует задавать в последнюю очередь, т.к. в противном случае система может начать реагировать на прерывания, не имея в регистре `mtvec` корректного адреса вектора прерываний. ### Реализация прерываний в архитектуре RISC-V @@ -169,13 +146,13 @@ _Таблица 5. Кодирование причины перехвата в - сохраняет адрес перехваченной инструкции, в `mepc`, - переходит к обработчику перехвата, загружая в `PC` адрес, предварительно настроенный в `mtvec`. -После перехода по адресу в `mtvec` обработчик считывает регистр `mcause`, чтобы проверить, что вызвало прерывание или исключение, и реагирует соответствующим образом (например, считывая клавиатуру при аппаратном прерывании). +После перехода по адресу в `mtvec` обработчик считывает регистр `mcause`, чтобы проверить, что вызвало прерывание или исключение, и реагирует соответствующим образом (например, считывая пришедший с клавиатуры символ при аппаратном прерывании). -После выполнения программы-обработчика перехвата, возвращение в программу выполняется командой возврата `mret`, которая помещает в `PC` значение регистра `mepc`. Сохранение `PC` инструкции при прерывании в `mepc` аналогично использованию регистра `ra` для хранения обратного адреса во время инструкции `jal`. Обработчики прерываний должны использовать программные регистры (`x1−x31`) для своей работы, поэтому они используют память, на которую указывает `mscratch`, для хранения и восстановления этих регистров. +После выполнения программы-обработчика перехвата, возвращение в программу выполняется командой возврата `mret`, которая помещает в `PC` значение регистра `mepc`. Сохранение `PC` инструкции при прерывании в `mepc` аналогично использованию регистра `ra` для хранения обратного адреса во время инструкции `jal`. Поскольку обработчики перехватов могут использовать для своей работы регистровый файл, для хранения и восстановления значений его регистров им нужен отдельный стек, на который указывает `mscratch`. -Контроллер прерываний – это блок процессора, обеспечивающий взаимодействие с устройствами, запрашивающими прерывания, формирование кода причины прерывания для процессора, маскирование прерываний, а также, в других реализациях, может реагировать на прерывания в соответствии с приоритетом и тому подобное. +Контроллер прерываний – это блок процессора, обеспечивающий взаимодействие с устройствами, запрашивающими прерывания, формирование кода причины прерывания для процессора, маскирование прерываний. В некоторых реализация, контроллер прерываний может реагировать на прерывания в соответствии с приоритетом. -Периферийное устройство, которое может генерировать прерывание, подключается к контроллеру прерывания паре проводов: запрос на прерывание (`irq_req_i`) и прерывание обслужено (`irq_ret_o`). Предположим, к контроллеру прерываний подключили клавиатуру. Когда на ней нажимают клавишу, код этой клавиши попадает в буферный регистр с дополнительным управляющим битом, выставленным в единицу, который подключен к входу запроса на прерывание. Если прерывание не замаскировано (в нашем процессоре это означает, что нулевой бит регистра `mie` выставлен в 1), то контроллер прерывания сгенерирует код причины прерывания (в нашем случае — это константа `0x80000010`). Кроме этого, контроллер прерывания подаст сигнал `irq_o`, чтобы устройство управления процессора узнало, что произошло прерывание и разрешило обновить содержимое регистра причины `mcause`, сохранило адрес прерванной инструкции в `mepc` и загрузило в `PC` вектор прерывания `mtvec`. +Периферийное устройство, которое может генерировать прерывание, подключается к контроллеру прерывания парой проводов: "запрос на прерывание" (`irq_req_i`) и "прерывание обслужено" (`irq_ret_o`). Предположим, к контроллеру прерываний подключили клавиатуру. Когда на ней нажимают клавишу, код этой клавиши попадает в буферный регистр с дополнительным управляющим битом, выставленным в единицу, который подключен к входу запроса на прерывание. Если прерывание не замаскировано (в нашем процессоре это означает, что нулевой бит регистра `mie` выставлен в 1), то контроллер прерывания сгенерирует код причины прерывания (в нашем случае — это константа `0x80000010`). Кроме этого, контроллер прерывания подаст сигнал `irq_o`, чтобы устройство управления процессора узнало, что произошло прерывание и разрешило обновить содержимое регистра причины `mcause`, сохранило адрес прерванной инструкции в `mepc` и загрузило в `PC` вектор прерывания `mtvec`. Когда будет выполняться инструкция `mret`, устройство управления подаст сигнал контроллеру прерывания, чтобы тот, в свою очередь, направил его в виде сигнала «прерывание обслужено» для соответствующего устройства. После этого периферийное устройство обязано снять сигнал запроса прерывания хотя бы на один такт. В нашем примере сигнал «прерывание обслужено» может быть подключен непосредственно к сбросу буферного регистра клавиатуры. @@ -224,11 +201,11 @@ _Рисунок 5. Структурная схема контроллера пр Регистры отслеживания обработки прерывания и исключения нужны для того, чтобы мы могли понимать, что в данный момент процессор уже выполняет обработку прерывания / исключения. В такие моменты (если любой из регистров `exc_h`/`irq_h` содержит значение `1`) все последующие запросы на прерывание игнорируются. За это отвечают вентили И и ИЛИ-НЕ в правом верхнем углу схемы. ->Однако возможна ситуация возникновения исключения во время обработки прерывания — в этом случае, оба регистра будут хранить значение `1`. В момент возврата из обработчика, придет сигнал `mret_i`, который в первую очередь сбросит регистр `exc_h` и только если тот равен нулю, сбросит регистр `irq_h`. -> ->Исключение во время обработки исключения не поддерживается данной микроархитектурой и приведет к неопределенному поведению. Поэтому код обработчика исключений должен быть написан с особым вниманием. +Однако возможна ситуация возникновения исключения во время обработки прерывания — в этом случае, оба регистра будут хранить значение `1`. В момент возврата из обработчика, придет сигнал `mret_i`, который в первую очередь сбросит регистр `exc_h` и только если тот равен нулю, сбросит регистр `irq_h`. -Логика установки и сброса работает следующим образом: +Исключение во время обработки исключения не поддерживается данной микроархитектурой и скорее всего приведет к циклическому вызову обработчика исключения. Поэтому код обработчика исключений должен быть написан с особым вниманием. + +Логика установки и сброса регистров `irq_h` и `exc_h` работает следующим образом: - если сигнал, обозначенный в прямоугольнике как `reset` равен единице, в регистр будет записано значение `0`; - если сигнал, обозначенный в прямоугольнике как `set` равен единице, в регистр будет записано значение `1`; @@ -263,23 +240,24 @@ _start: 08: li x3, 0x00000000 # устанавливаем указатель на глобальные данные -0C: li x5, 0x00000001 # подготавливаем маску прерывания единственного - # (нулевого) входа -10: csrw mie, x5 # загружаем маску в регистр маски - -14: la x5, trap_handler # псевдоинструкция la аналогично li загружает число, -18: # только в случае la — это число является адресом +0С: la x5, trap_handler # псевдоинструкция la аналогично li загружает число, +10: # только в случае la — это число является адресом # указанного места (адреса обработчика перехвата) # данная псевдоинструкция будет разбита на две # инструкции: lui и addi -1С: csrw mtvec, x5 # устанавливаем вектор прерывания +14: csrw mtvec, x5 # устанавливаем вектор прерывания -20: li x5, 0x00001FFC # готовим адрес верхушки стека прерывания -24: # данная псевдоинструкция будет разбита на две +18: li x5, 0x00001FFC # готовим адрес верхушки стека прерывания +1С: # данная псевдоинструкция будет разбита на две # инструкции: lui и addi -28: csrw mscratch, x5 # загружаем указатель на верхушку стека прерывания +20: csrw mscratch, x5 # загружаем указатель на верхушку стека прерывания + +24: li x5, 0x00010000 # подготавливаем маску прерывания единственного + # входа прерываний + +28: csrw mie, x5 # загружаем маску в регистр маски 2С: li x5, 1 # начальное значение глобальной переменной 30: sw x5, 0(x3) # загружаем переменную в память @@ -417,7 +395,7 @@ endmodule 1. Тестовое окружение находится [здесь](tb_csr.sv). 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). 3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_csr`). - 4. Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста! + 4. **По завершению симуляции убедитесь, что в логе есть сообщение о завершении теста!** 4. Внимательно ознакомьтесь с описанием функционального поведения сигналов `interrupt_controller`, а также его структурной схемой. В случае возникновения вопросов, проконсультируйтесь с преподавателем. 5. Реализуйте модуль `interrupt_controller`. Для этого: 1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `interrupt_controller.sv`. @@ -426,7 +404,7 @@ endmodule 1. Тестовое окружение находится [здесь](tb_irq.sv). 2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md). 3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_irq`). - 4. Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста! + 4. **По завершению симуляции убедитесь, что в логе есть сообщение о завершении теста!** ## Список использованной литературы @@ -434,4 +412,5 @@ endmodule 2. [PIC24FJ512GU410 Family Data Sheet](https://ww1.microchip.com/downloads/aemDocuments/documents/MCU16/ProductDocuments/DataSheets/PIC24FJ512GU410-Family-Data-Sheet-DS30010203D.pdf) 3. [The Art of Assembly Language](https://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/) 4. [The RISC-V Instruction Set Manual Volume I: Unprivileged ISA](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf) -5. [The RISC-V Instruction Set Manual Volume II: Privileged Architecture](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf) +5. [Pillai, V.P., Megalingam, R.K. (2022). System Partitioning with Virtualization for Federated and Distributed Machine Learning on Critical IoT Edge Systems. In: Saraswat, M., Sharma, H., Balachandran, K., Kim, J.H., Bansal, J.C. (eds) Congress on Intelligent Systems. Lecture Notes on Data Engineering and Communications Technologies, vol 111. Springer, Singapore.](https://doi.org/10.1007/978-981-16-9113-3_33) +6. [The RISC-V Instruction Set Manual Volume II: Privileged Architecture](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf) diff --git a/Labs/11. Interrupt integration/irq_program.mem b/Labs/11. Interrupt integration/irq_program.mem index 844bad4..709b005 100644 --- a/Labs/11. Interrupt integration/irq_program.mem +++ b/Labs/11. Interrupt integration/irq_program.mem @@ -1,8 +1,6 @@ 00004137 FFC10113 00000193 -00100293 -30429073 04400293 00028293 30529073 @@ -10,6 +8,8 @@ FFC10113 FFC28293 34029073 00100293 +000102B7 +00100293 0051A023 00000313 00000393 diff --git a/Other/CSR.md b/Other/CSR.md index 5c1b589..4bf9935 100644 --- a/Other/CSR.md +++ b/Other/CSR.md @@ -1,20 +1,20 @@ # О регистрах контроля и статуса -Для поддержания работы операционной системы, виртуализации, системы прерывания и тому подобное, в архитектуре RISC-V предусмотрено использование группы регистров, под общим названием **Control and Status Registers** (**CSR**), обеспечивающих управление элементами процессора и доступ к статусной информации о системе. С помощью этих регистров реализуются привилегированные режимы работы процессора, хранение указателей на различные программные стеки, статус различных подсистем, регистры для обеспечения работы прерываний и многое другое. +Для поддержания работы операционной системы, виртуализации, системы прерывания (но не ограничиваясь ими), в архитектуре RISC-V предусмотрено использование группы регистров, под общим названием **регистры контроля и статуса** (**Control and Status Registers**, **CSR**), обеспечивающих управление элементами процессора и доступ к статусной информации о системе. С помощью этих регистров реализуются привилегированные режимы работы процессора, хранение указателей на различные программные стеки, статус различных подсистем, регистры для обеспечения перехватов и многое другое. -Все регистры имеют уникальные 12-битные адреса, а их роли определены в спецификации на архитектуру RISC-V. В _Таблице 1_ приводится фрагмент спецификации привилегированной архитектуры[[5, стр. 10]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf), иллюстрирующая некоторые из регистров. В левом столбце указан 12-битный адрес. Далее указывается, что можно делать с этим регистром и в каком режиме. После идет название, а в правом столбце описание. +Все регистры имеют уникальные 12-битные адреса, а их роли определены в спецификации на архитектуру RISC-V. В _Таблице 1_ приводится фрагмент спецификации привилегированной архитектуры[[1, стр. 10]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf), иллюстрирующая некоторые из регистров. В левом столбце указан 12-битный адрес. Далее указывается в каком режиме, что можно делать с этим регистром. После идет название, а в правом столбике описание. -В этой таблице можно увидеть регистры для сохранения адреса возврата из прерывания, адрес вектора прерывания, регистры причины (cause), регистры настройки безопасности и защиты памяти. И это далеко не полный список регистров, предоставляемых стандартом (который помимо прочего, оставляет место в адресном пространстве для ваших собственных регистров). +В этой таблице можно увидеть регистры для сохранения адреса возврата из перехвата, адрес вектора прерывания, регистры причины (cause), регистры настройки безопасности и защиты памяти. И это далеко не полный список регистров, предоставляемых стандартом (который помимо прочего, оставляет место в адресном пространстве для ваших собственных регистров). ![../../.pic/Labs/lab_10_irq/tab_01.png](../../.pic/Labs/lab_10_irq/tab_01.png) -_Таблица 1. Регистры контроля и состояния машинного (наивысшего) уровня привилегий._ +_Таблица 1. Регистры контроля и статуса машинного (наивысшего) уровня привилегий._ -Для работы с CS-регистрами используются специальные **SYSTEM**-инструкции I-типа (код операции `1110011`), хранящие в 12-битном поле **imm** адрес регистра, к которому будет осуществлен доступ и адреса в регистровом файле откуда будет считан или куда будет записан один из CS-регистров. Вы уже добавляли поддержку этих инструкций во время выполнения [лабораторной работы №5](../05.%20Main%20decoder/) "Основной дешифратор". +Для работы с CS-регистрами используются специальные **SYSTEM**-инструкции I-типа (с опкодом `1110011`), хранящие в 12-битном поле **imm** адрес регистра, к которому будет осуществлен доступ и адреса в регистровом файле откуда будет считан или куда будет записан один из CS-регистров. Вы уже добавляли поддержку этих инструкций во время выполнения [лабораторной работы №5](../05.%20Main%20decoder/) "Декодер инструкций". | opcode | func3 | Тип | Инструкция | Описание | Операция | |--------|-------|-----|---------------------|---------------------------|-----------------------------| -|1110011 | 000 | I | mret | Возврат из прерывания | PC = mepc | +|1110011 | 000 | I | mret | Возврат из перехвата | PC = mepc | |1110011 | 001 | I | csrrw rd, csr, rs1 | Чтение и Запись CSR | rd = csr, csr = rs1 | |1110011 | 010 | I | csrrs rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| rs1 | |1110011 | 011 | I | csrrc rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~rs1 | @@ -24,7 +24,7 @@ _Таблица 1. Регистры контроля и состояния ма _Таблица 2. Список инструкций для работы с регистрами контроля и статуса._ -Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CS-регистрами. +Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CSR. | Псевдоинструкция | Инструкция RISC-V | Описание | Операция | |------------------|--------------------|-------------|-----------| @@ -33,4 +33,9 @@ _Таблица 2. Список инструкций для работы с ре _Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса._ -Операция логического ИЛИ нулевого регистра с содержимым CS-регистра не меняет его содержимого, поэтому при использовании инструкции `csrr` происходит только операция чтения. Подобным образом реализована псевдоинструкция `csrw`. +Операция логического ИЛИ нулевого регистра регистрового файла с содержимым регистра из блока CSR не меняет его содержимого, поэтому при использовании инструкции `csrr` происходит только операция чтения. Подобным образом реализована псевдоинструкция `csrw`. + + +## Список использованной литературы + +1. [The RISC-V Instruction Set Manual Volume II: Privileged Architecture](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf) \ No newline at end of file