summaryrefslogtreecommitdiff
path: root/rtl/core/cp15/cp15.sv
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/core/cp15/cp15.sv')
-rw-r--r--rtl/core/cp15/cp15.sv94
1 files changed, 88 insertions, 6 deletions
diff --git a/rtl/core/cp15/cp15.sv b/rtl/core/cp15/cp15.sv
index 907576a..f924c21 100644
--- a/rtl/core/cp15/cp15.sv
+++ b/rtl/core/cp15/cp15.sv
@@ -13,15 +13,15 @@ module core_cp15
);
logic load;
- reg_num crm;
+ reg_num crn, crm;
cp_opcode op1, op2;
+ assign {crn, crm} = {dec.crn, dec.crm};
+ assign {op1, op2} = {dec.op1, dec.op2};
assign load = dec.load;
- assign crm = dec.crm;
- assign op1 = dec.op1;
- assign op2 = dec.op2;
- word read_cpuid;
+ word read_cpuid, read_syscfg, read_ttbr, read_domain,
+ read_far, read_fsr, read_cache_lockdown, read_tlb_lockdown;
core_cp15_cpuid cpuid
(
@@ -29,11 +29,93 @@ module core_cp15
.*
);
+ core_cp15_syscfg syscfg
+ (
+ .read(read_syscfg),
+ .transfer(transfer && crn == `CP15_CRN_SYSCFG),
+ .*
+ );
+
+ core_cp15_ttbr ttbr
+ (
+ .read(read_ttbr),
+ .transfer(transfer && crn == `CP15_CRN_TTBR),
+ .*
+ );
+
+ core_cp15_domain domain
+ (
+ .read(read_domain),
+ .transfer(transfer && crn == `CP15_CRN_DOMAIN),
+ .*
+ );
+
+ core_cp15_far far
+ (
+ .read(read_far),
+ .transfer(transfer && crn == `CP15_CRN_FAR),
+ .*
+ );
+
+ core_cp15_far fsr
+ (
+ .read(read_fsr),
+ .transfer(transfer && crn == `CP15_CRN_FSR),
+ .*
+ );
+
+ core_cp15_cache cache
+ (
+ .transfer(transfer && crn == `CP15_CRN_CACHE),
+ .*
+ );
+
+ core_cp15_tlb tlb
+ (
+ .transfer(transfer && crn == `CP15_CRN_TLB),
+ .*
+ );
+
+ core_cp15_cache_lockdown cache_lockdown
+ (
+ .read(read_cache_lockdown),
+ .transfer(transfer && crn == `CP15_CRN_CACHE_LCK),
+ .*
+ );
+
+ core_cp15_tlb_lockdown tlb_lockdown
+ (
+ .read(read_tlb_lockdown),
+ .transfer(transfer && crn == `CP15_CRN_TLB_LCK),
+ .*
+ );
+
always_comb
- unique case(dec.crn)
+ unique case(crn)
`CP15_CRN_CPUID:
read = read_cpuid;
+ `CP15_CRN_SYSCFG:
+ read = read_syscfg;
+
+ `CP15_CRN_TTBR:
+ read = read_ttbr;
+
+ `CP15_CRN_DOMAIN:
+ read = read_domain;
+
+ `CP15_CRN_FAR:
+ read = read_far;
+
+ `CP15_CRN_FSR:
+ read = read_fsr;
+
+ `CP15_CRN_CACHE_LCK:
+ read = read_cache_lockdown;
+
+ `CP15_CRN_TLB_LCK:
+ read = read_tlb_lockdown;
+
default:
read = {$bits(read){1'bx}};
endcase