diff options
Diffstat (limited to 'rtl/core/core_cp15_syscfg.sv')
| -rw-r--r-- | rtl/core/core_cp15_syscfg.sv | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/rtl/core/core_cp15_syscfg.sv b/rtl/core/core_cp15_syscfg.sv new file mode 100644 index 0000000..cdd6014 --- /dev/null +++ b/rtl/core/core_cp15_syscfg.sv @@ -0,0 +1,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 /*verilator public*/, 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 |
