add is_512G to the data structure
[soc.git] / src / TLB / ariane / tlb_content.py
index 024c5697e1f96c77cea6058a9c2785a501c058cd..4ffd919eb3800750ffc2c23006342f16fae80071 100644 (file)
@@ -1,16 +1,19 @@
-from nmigen import Signal, Module, Cat, Const
+from nmigen import Signal, Module, Cat, Const, Elaboratable
+
+from TLB.ariane.ptw import TLBUpdate, PTE
 
-from ptw import TLBUpdate, PTE
 
 class TLBEntry:
     def __init__(self, asid_width):
         self.asid = Signal(asid_width)
-        # SV39 defines three levels of page tables
+        # SV48 defines four levels of page tables
         self.vpn0 = Signal(9)
         self.vpn1 = Signal(9)
         self.vpn2 = Signal(9)
+        self.vpn3 = Signal(9)
         self.is_2M = Signal()
         self.is_1G = Signal()
+        self.is_512G = Signal()
         self.valid = Signal()
 
     def flatten(self):
@@ -23,7 +26,7 @@ class TLBEntry:
         return [self.asid, self.vpn0, self.vpn1, self.vpn2,
                 self.is_2M, self.is_1G, self.valid]
 
-class TLBContent:
+class TLBContent(Elaboratable):
     def __init__(self, pte_width, asid_width):
         self.asid_width = asid_width
         self.pte_width = pte_width
@@ -38,6 +41,7 @@ class TLBContent:
         # Lookup signals
         self.lu_asid_i = Signal(asid_width)
         self.lu_content_o = Signal(pte_width)
+        self.lu_is_512G_o = Signal()
         self.lu_is_2M_o = Signal()
         self.lu_is_1G_o = Signal()
         self.lu_hit_o = Signal()
@@ -70,6 +74,8 @@ class TLBContent:
                      tags_2M.eq(tags.is_2M),
                      vpn0_ok.eq(self.vpn0 == tags.vpn0),
                      vpn0_or_2M.eq(tags_2M | vpn0_ok)]
+        # TODO temporaries for 3rd level match
+        
         # first level match, this may be a giga page,
         # check the ASID flags as well
         with m.If(vpn2_hit):
@@ -110,6 +116,7 @@ class TLBContent:
                           tags.vpn2.eq(self.update_i.vpn[18:27]),
                           tags.vpn1.eq(self.update_i.vpn[9:18]),
                           tags.vpn0.eq(self.update_i.vpn[0:9]),
+                          tags.is_512G.eq(self.update_i.is_512G),
                           tags.is_1G.eq(self.update_i.is_1G),
                           tags.is_2M.eq(self.update_i.is_2M),
                           tags.valid.eq(1),
@@ -121,5 +128,5 @@ class TLBContent:
     def ports(self):
         return [self.flush_i,
                  self.lu_asid_i,
-                 self.lu_is_2M_o, self.lu_is_1G_o, self.lu_hit_o,
+                 self.lu_is_2M_o, self.lu_is_1G_o,self.lu_is_512G_o, self.lu_hit_o,
                 ] + self.update_i.content.ports() + self.update_i.ports()