forked from Github_Repos/cvw
		
	began updating cam line to reduce muxes, confusion
This commit is contained in:
		
							parent
							
								
									6a63ad04d2
								
							
						
					
					
						commit
						b27abc53e8
					
				@ -29,7 +29,7 @@
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
module cam_line #(parameter KEY_BITS = 20,
 | 
			
		||||
                  parameter HIGH_SEGMENT_BITS = 10) (
 | 
			
		||||
                  parameter SEGMENT_BITS = 10) (
 | 
			
		||||
  input                 clk, reset,
 | 
			
		||||
 | 
			
		||||
  // input to check which SvMode is running
 | 
			
		||||
@ -58,6 +58,36 @@ module cam_line #(parameter KEY_BITS = 20,
 | 
			
		||||
  logic                Valid;
 | 
			
		||||
  logic [KEY_BITS-1:0] Key;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // Split up key and VPN into sections for each page table level.
 | 
			
		||||
  logic [SEGMENT_BITS-1:0] Key0, Key1, VPN0, VPN1;
 | 
			
		||||
  logic MatchVPN0, MatchVPN1;
 | 
			
		||||
 | 
			
		||||
  generate
 | 
			
		||||
    if (`XLEN == 32) begin
 | 
			
		||||
      assign {Key1, Key0} = Key;
 | 
			
		||||
      assign {VPN1, VPN0} = VirtualPageNumber;
 | 
			
		||||
 | 
			
		||||
      assign MatchVPN0 = (VPN0 == Key0) || (PageType[0]); // least signifcant section
 | 
			
		||||
      assign MatchVPN1 = (VPN1 == Key1);
 | 
			
		||||
 | 
			
		||||
      assign Match = MatchVPN0 & MatchVPN1 & Valid;
 | 
			
		||||
    end else begin
 | 
			
		||||
      logic [SEGMENT_BITS-1:0] Key2, Key3, VPN2, VPN3;
 | 
			
		||||
      logic MatchVPN2, MatchVPN3;
 | 
			
		||||
 | 
			
		||||
      assign {VPN3, VPN2, VPN1, VPN0} = VirtualPageNumber;
 | 
			
		||||
      assign {Key3, Key2, Key1, Key0} = Key;
 | 
			
		||||
 | 
			
		||||
      assign MatchVPN0 = (VPN0 == Key0) || (PageType > 2'd0); // least signifcant section
 | 
			
		||||
      assign MatchVPN1 = (VPN1 == Key1) || (PageType > 2'd1);
 | 
			
		||||
      assign MatchVPN2 = (VPN2 == Key2) || (PageType > 2'd2);
 | 
			
		||||
      assign MatchVPN3 = (VPN3 == Key3); // *** this should always match in sv39 since both vPN3 and key3 are zeroed by the pagetable walker before getting to the cam
 | 
			
		||||
      
 | 
			
		||||
      assign Match = MatchVPN0 & MatchVPN1 & MatchVPN2 & MatchVPN3 & Valid;
 | 
			
		||||
    end
 | 
			
		||||
  endgenerate
 | 
			
		||||
 | 
			
		||||
  // When determining a match for a superpage, we might use only a portion of
 | 
			
		||||
  // the input VirtualPageNumber. Unused parts of the VirtualPageNumber are
 | 
			
		||||
  // zeroed in VirtualPageNumberQuery to better match with Key.
 | 
			
		||||
@ -77,8 +107,17 @@ module cam_line #(parameter KEY_BITS = 20,
 | 
			
		||||
  // Calculate the actual query key based on the input key and the page type.
 | 
			
		||||
  // For example, a megapage in SV39 only cares about VPN2 and VPN1, so VPN0
 | 
			
		||||
  // should automatically match.
 | 
			
		||||
  page_number_mixer #(KEY_BITS, HIGH_SEGMENT_BITS) mixer(VirtualPageNumber, Key, PageType, SvMode, VirtualPageNumberQuery);
 | 
			
		||||
//  logic [KEY_BITS-1:0] PageNumberMask, MaskedKey, MaskedQuery;
 | 
			
		||||
  // this is the max possible length of the vpn, as listed in wally-constants.
 | 
			
		||||
  // for modes with a mode with fewer bits in the vpn, the extra levels in MaskedQuery 
 | 
			
		||||
  // and MaskedKey should have been zeroed out by the tlb before coming through the cam as VirtualPageNumber.
 | 
			
		||||
  generate
 | 
			
		||||
      if (`XLEN == 32) begin
 | 
			
		||||
 | 
			
		||||
      end else begin
 | 
			
		||||
 | 
			
		||||
      end
 | 
			
		||||
  endgenerate
 | 
			
		||||
 | 
			
		||||
  assign Match = ({1'b1, VirtualPageNumberQuery} == {Valid, Key});
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
@ -51,7 +51,6 @@ module page_number_mixer #(parameter BITS = 20,
 | 
			
		||||
 | 
			
		||||
  generate
 | 
			
		||||
    if (`XLEN == 32) begin
 | 
			
		||||
      always_comb 
 | 
			
		||||
 | 
			
		||||
      logic [HIGH_SEGMENT_BITS-1:0] Segment1, MixSegment1, Segment1Combined;
 | 
			
		||||
      logic [LOW_SEGMENT_BITS-1:0]  Segment0, MixSegment0, Segment0Combined;
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@
 | 
			
		||||
 | 
			
		||||
module tlb_cam #(parameter ENTRY_BITS = 3,
 | 
			
		||||
                 parameter KEY_BITS   = 20,
 | 
			
		||||
                 parameter HIGH_SEGMENT_BITS = 10) (
 | 
			
		||||
                 parameter SEGMENT_BITS = 10) (
 | 
			
		||||
  input                     clk, reset,
 | 
			
		||||
  input  [KEY_BITS-1:0]     VirtualPageNumber,
 | 
			
		||||
  input  [1:0]              PageTypeWrite,
 | 
			
		||||
@ -60,7 +60,7 @@ module tlb_cam #(parameter ENTRY_BITS = 3,
 | 
			
		||||
  generate
 | 
			
		||||
    genvar i;
 | 
			
		||||
    for (i = 0; i < NENTRIES; i++) begin
 | 
			
		||||
      cam_line #(KEY_BITS, HIGH_SEGMENT_BITS) cam_line(
 | 
			
		||||
      cam_line #(KEY_BITS, SEGMENT_BITS) cam_line(
 | 
			
		||||
        .CAMLineWrite(CAMLineWrite[i] && TLBWrite),
 | 
			
		||||
        .PageType(PageTypeList[i]),
 | 
			
		||||
        .Match(Matches[i]),
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user