summaryrefslogtreecommitdiff
path: root/rtl/core/core_mmu.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-01-21 06:23:46 -0600
committerAlejandro Soto <alejandro@34project.org>2024-02-20 11:11:17 -0600
commitf3b18ead59ae02f95dabbf0a1dea40873a816975 (patch)
tree8979e50f2a37f66a4cd27e937b480efe60d72cf7 /rtl/core/core_mmu.sv
parenta8bc5a353ea997f73209b39377ee15a73e471237 (diff)
rtl: refactor filenames and directory hierarchy
Diffstat (limited to 'rtl/core/core_mmu.sv')
-rw-r--r--rtl/core/core_mmu.sv140
1 files changed, 140 insertions, 0 deletions
diff --git a/rtl/core/core_mmu.sv b/rtl/core/core_mmu.sv
new file mode 100644
index 0000000..3060d69
--- /dev/null
+++ b/rtl/core/core_mmu.sv
@@ -0,0 +1,140 @@
+`include "core/mmu_format.sv"
+`include "core/uarch.sv"
+
+module core_mmu
+(
+ input logic clk,
+ rst_n,
+
+ input logic privileged,
+ mmu_enable /*verilator public*/,
+ input mmu_base mmu_ttbr /*verilator public*/,
+ input word mmu_dac,
+
+ input logic bus_ready,
+ bus_ex_fail,
+ input word bus_data_rd,
+ data_data_wr,
+ input ptr insn_addr,
+ data_addr,
+ input logic insn_start,
+ data_start,
+ data_write,
+ data_ex_lock,
+ data_user,
+ input logic[3:0] data_data_be,
+
+ output word bus_data_wr,
+ output logic[3:0] bus_data_be,
+ output ptr bus_addr,
+ output logic bus_start,
+ bus_write,
+ bus_ex_lock,
+ insn_ready,
+ insn_fault,
+ data_ready,
+ data_fault,
+ data_ex_fail,
+ output word insn_data_rd,
+ data_data_rd,
+
+ output logic fault_register,
+ fault_page,
+ output ptr fault_addr,
+ output mmu_fault_type fault_type,
+ output mmu_domain fault_domain
+);
+
+ ptr iphys_addr, dphys_addr;
+ word iphys_data_rd, dphys_data_rd, dphys_data_wr;
+ logic[3:0] dphys_data_be;
+
+ logic iphys_start, dphys_start, iphys_ready, dphys_ready, dphys_write,
+ dphys_ex_fail, dphys_ex_lock;
+
+ assign fault_register = data_fault;
+
+ core_mmu_pagewalk iwalk
+ (
+ .core_addr(insn_addr),
+ .core_start(insn_start),
+ .core_write(0),
+ .core_ready(insn_ready),
+ .core_data_wr(0),
+ .core_data_be(0),
+ .core_data_rd(insn_data_rd),
+ .core_ex_fail(),
+ .core_ex_lock(0),
+
+ .core_fault(insn_fault),
+ .core_fault_addr(),
+ .core_fault_page(),
+ .core_fault_type(),
+ .core_fault_domain(),
+
+ .bus_addr(iphys_addr),
+ .bus_start(iphys_start),
+ .bus_write(),
+ .bus_ready(iphys_ready),
+ .bus_data_wr(),
+ .bus_data_be(),
+ .bus_data_rd(iphys_data_rd),
+ .bus_ex_fail(0),
+ .bus_ex_lock(),
+
+ .*
+ );
+
+ core_mmu_pagewalk dwalk
+ (
+ .core_addr(data_addr),
+ .core_start(data_start),
+ .core_write(data_write),
+ .core_ready(data_ready),
+ .core_data_wr(data_data_wr),
+ .core_data_be(data_data_be),
+ .core_data_rd(data_data_rd),
+ .core_ex_fail(data_ex_fail),
+ .core_ex_lock(data_ex_lock),
+
+ .core_fault(data_fault),
+ .core_fault_addr(fault_addr),
+ .core_fault_page(fault_page),
+ .core_fault_type(fault_type),
+ .core_fault_domain(fault_domain),
+
+ .bus_addr(dphys_addr),
+ .bus_start(dphys_start),
+ .bus_write(dphys_write),
+ .bus_ready(dphys_ready),
+ .bus_data_wr(dphys_data_wr),
+ .bus_data_be(dphys_data_be),
+ .bus_data_rd(dphys_data_rd),
+ .bus_ex_fail(dphys_ex_fail),
+ .bus_ex_lock(dphys_ex_lock),
+
+ .privileged(privileged && !data_user),
+ .*
+ );
+
+ core_mmu_arbiter arbiter
+ (
+ .insn_addr(iphys_addr),
+ .insn_start(iphys_start),
+ .insn_ready(iphys_ready),
+ .insn_data_rd(iphys_data_rd),
+
+ .data_addr(dphys_addr),
+ .data_start(dphys_start),
+ .data_write(dphys_write),
+ .data_ready(dphys_ready),
+ .data_data_wr(dphys_data_wr),
+ .data_data_be(dphys_data_be),
+ .data_data_rd(dphys_data_rd),
+ .data_ex_fail(dphys_ex_fail),
+ .data_ex_lock(dphys_ex_lock),
+
+ .*
+ );
+
+endmodule