blob: d75f7acc4cafdc857d4c35b4c7cb79cf529fceea (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
`include "core/uarch.sv"
`include "core/cp15/map.sv"
module core_cp15_syscfg
(
input logic clk,
rst_n,
input logic load,
transfer,
input cp_opcode op2,
input word write,
output word read,
output logic high_vectors,
mmu_enable
);
logic dcache_enable, icache_enable;
cp15_syscfg_ctrl ctrl, write_ctrl;
assign write_ctrl = write;
always_comb begin
ctrl = {$bits(ctrl){1'b0}};
ctrl.m = mmu_enable;
ctrl.c = dcache_enable;
ctrl.l = 1;
ctrl.d = 1;
ctrl.p = 1;
ctrl.z = 1;
ctrl.i = icache_enable;
ctrl.v = high_vectors;
ctrl.dt = 1;
ctrl.it = 1;
unique case(op2)
`CP15_SYSCFG_CTRL:
read = ctrl;
`CP15_SYSCFG_ACCESS:
read = 0;
default:
read = 0;
endcase
end
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
mmu_enable <= 0;
high_vectors <= 0;
dcache_enable <= 0;
icache_enable <= 0;
end else if(transfer && !load)
unique case(op2)
`CP15_SYSCFG_CTRL: begin
mmu_enable <= write_ctrl.m;
high_vectors <= write_ctrl.v;
dcache_enable <= write_ctrl.c;
icache_enable <= write_ctrl.i;
end
default: ;
endcase
endmodule
|