forked from Github_Repos/cvw
		
	progress on bus and lrsc
This commit is contained in:
		
							parent
							
								
									27ef10df07
								
							
						
					
					
						commit
						1cc0dcc83f
					
				@ -21,18 +21,6 @@ add wave -hex /testbench/dut/hart/ifu/PCD
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/InstrD
 | 
			
		||||
 | 
			
		||||
add wave /testbench/InstrDName
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/InstrRawD
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/AlignedInstrRawD
 | 
			
		||||
add wave -divider
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/FetchState
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/FetchWordNum
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/ICacheMemWriteEnable
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/InstrPAdrF
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/InstrAckF
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/ICacheMemWriteData
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/ICacheMemWritePAdr
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/MisalignedState
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/ic/controller/MisalignedHalfInstrF
 | 
			
		||||
add wave -divider
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -63,12 +51,15 @@ add wave -hex /testbench/dut/hart/ebu/HTRANS
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/HRDATA
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/HWRITE
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/HWDATA
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/CaptureDataM
 | 
			
		||||
add wave -divider
 | 
			
		||||
 | 
			
		||||
add wave -hex /testbench/dut/uncore/dtim/*
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/ReadDataM
 | 
			
		||||
add wave -divider
 | 
			
		||||
 | 
			
		||||
add wave /testbench/dut/hart/ebu/CaptureDataM
 | 
			
		||||
add wave /testbench/dut/hart/ebu/CapturedDataAvailable
 | 
			
		||||
add wave /testbench/dut/hart/StallW
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/CapturedData
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/ReadDataWnext
 | 
			
		||||
add wave -hex /testbench/dut/hart/ebu/ReadDataW
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/PCW
 | 
			
		||||
add wave -hex /testbench/dut/hart/ifu/InstrW
 | 
			
		||||
add wave /testbench/InstrWName
 | 
			
		||||
@ -78,7 +69,8 @@ add wave -hex /testbench/dut/hart/ieu/dp/ResultW
 | 
			
		||||
add wave -hex /testbench/dut/hart/ieu/dp/RdW
 | 
			
		||||
add wave -divider
 | 
			
		||||
 | 
			
		||||
add wave -hex /testbench/dut/uncore/dtim/*
 | 
			
		||||
add wave -hex /testbench/dut/hart/dmem/*
 | 
			
		||||
add wave -hex /testbench/dut/hart/dmem/genblk1/*
 | 
			
		||||
add wave -divider
 | 
			
		||||
 | 
			
		||||
add wave -hex -r /testbench/*
 | 
			
		||||
 | 
			
		||||
@ -122,8 +122,8 @@ module dmem (
 | 
			
		||||
        else if (scM || WriteAdrMatchM) ReservationValidM = 0; // clear valid on store to same address or any sc
 | 
			
		||||
        else ReservationValidM = ReservationValidW; // otherwise don't change valid
 | 
			
		||||
      end
 | 
			
		||||
      flopenrc #(`XLEN-2) resadrreg(clk, reset, FlushW, ~StallW && lrM, MemPAdrM[`XLEN-1:2], ReservationPAdrW); // could drop clear on this one but not valid
 | 
			
		||||
      flopenrc #(1) resvldreg(clk, reset, FlushW, ~StallW, ReservationValidM, ReservationValidW);
 | 
			
		||||
      flopenrc #(`XLEN-2) resadrreg(clk, reset, FlushW, lrM, MemPAdrM[`XLEN-1:2], ReservationPAdrW); // could drop clear on this one but not valid
 | 
			
		||||
      flopenrc #(1) resvldreg(clk, reset, FlushW, lrM, ReservationValidM, ReservationValidW);
 | 
			
		||||
      flopenrc #(1) squashreg(clk, reset, FlushW, ~StallW, SquashSCM, SquashSCW);
 | 
			
		||||
    end else begin // Atomic operations not supported
 | 
			
		||||
      assign SquashSCM = 0;
 | 
			
		||||
 | 
			
		||||
@ -86,9 +86,9 @@ module ahblite (
 | 
			
		||||
  logic GrantData;
 | 
			
		||||
  logic [31:0] AccessAddress;
 | 
			
		||||
  logic [2:0] AccessSize, PTESize, ISize;
 | 
			
		||||
  logic [`AHBW-1:0] HRDATAMasked, ReadDataM, ReadDataNewW, ReadDataOldW, WriteData;
 | 
			
		||||
  logic [`AHBW-1:0] HRDATAMasked, ReadDataM, CapturedData, ReadDataWnext, WriteData;
 | 
			
		||||
  logic IReady, DReady;
 | 
			
		||||
  logic CaptureDataM;
 | 
			
		||||
  logic CaptureDataM,CapturedDataAvailable;
 | 
			
		||||
 | 
			
		||||
  // Describes type of access
 | 
			
		||||
  logic Atomic, Execute, Write, Read;
 | 
			
		||||
@ -192,15 +192,26 @@ module ahblite (
 | 
			
		||||
		   ((BusState == ATOMICREAD) && (NextBusState != ATOMICREAD)) || ((BusState == ATOMICWRITE) && (NextBusState != ATOMICWRITE));
 | 
			
		||||
  assign MMUReadPTE = HRDATA;
 | 
			
		||||
  assign ReadDataM = HRDATAMasked; // changed from W to M dh 2/7/2021
 | 
			
		||||
  // Carefully decide when to update ReadDataW
 | 
			
		||||
  //   ReadDataMstored holds the most recent memory read.
 | 
			
		||||
  //   We need to wait until the pipeline actually advances before we can update the contents of ReadDataW
 | 
			
		||||
  //   (or else the W stage will accidentally get the M stage's data when the pipeline does advance).
 | 
			
		||||
  assign CaptureDataM = ((BusState == MEMREAD) && (NextBusState != MEMREAD)) ||
 | 
			
		||||
                        ((BusState == ATOMICREAD) && (NextBusState == ATOMICWRITE));
 | 
			
		||||
  // We think this introduces an unnecessary cycle of latency in memory accesses
 | 
			
		||||
  // *** can the following be simplified down to one register?
 | 
			
		||||
  // *** examine more closely over summer?
 | 
			
		||||
  flopenr #(`XLEN) ReadDataNewWReg(clk, reset, CaptureDataM,    ReadDataM, ReadDataNewW);
 | 
			
		||||
  flopenr #(`XLEN) ReadDataOldWReg(clk, reset, CaptureDataM, ReadDataNewW, ReadDataOldW); 
 | 
			
		||||
  assign ReadDataW = (BusState == INSTRREADC) ? ReadDataOldW : ReadDataNewW;
 | 
			
		||||
  //assign ReadDataW = (BusState == INSTRREADC) ? ReadDataOldW : ReadDataNewW;
 | 
			
		||||
                        ((BusState == ATOMICREAD) && (NextBusState != ATOMICREAD));
 | 
			
		||||
  flopenr #(`XLEN) ReadDataNewWReg(clk, reset, CaptureDataM, ReadDataM, CapturedData);
 | 
			
		||||
 | 
			
		||||
  always @(posedge HCLK, negedge HRESETn)
 | 
			
		||||
    if (~HRESETn)
 | 
			
		||||
      CapturedDataAvailable <= #1 1'b0;
 | 
			
		||||
    else
 | 
			
		||||
      CapturedDataAvailable <= #1 (StallW) ? (CaptureDataM | CapturedDataAvailable) : 1'b0;
 | 
			
		||||
  always_comb
 | 
			
		||||
    casez({StallW && (BusState != ATOMICREAD),CapturedDataAvailable})
 | 
			
		||||
      2'b00: ReadDataWnext = ReadDataM;
 | 
			
		||||
      2'b01: ReadDataWnext = CapturedData;
 | 
			
		||||
      2'b1?: ReadDataWnext = ReadDataW;
 | 
			
		||||
    endcase
 | 
			
		||||
  flopr #(`XLEN) ReadDataOldWReg(clk, reset, ReadDataWnext, ReadDataW); 
 | 
			
		||||
 | 
			
		||||
  // Extract and sign-extend subwords if necessary
 | 
			
		||||
  subwordread swr(.*);
 | 
			
		||||
 | 
			
		||||
@ -29,9 +29,8 @@
 | 
			
		||||
 | 
			
		||||
module pmachecker (
 | 
			
		||||
  input  logic [31:0] HADDR,
 | 
			
		||||
  input  logic        HSIZE,
 | 
			
		||||
  input  logic [2:0]  HSIZE, HBURST,
 | 
			
		||||
  input  logic        HWRITE,
 | 
			
		||||
  input  logic        HBURST,
 | 
			
		||||
 | 
			
		||||
  input  logic        Atomic, Execute, Write, Read,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,7 @@ module icache(
 | 
			
		||||
    logic [`XLEN-1:0]           ICacheMemWritePAdr;
 | 
			
		||||
    logic                       EndFetchState;
 | 
			
		||||
    // Output signals from cache memory
 | 
			
		||||
    logic [`XLEN-1:0]   ICacheMemReadData;
 | 
			
		||||
    logic [31:0]   ICacheMemReadData;
 | 
			
		||||
    logic               ICacheMemReadValid;
 | 
			
		||||
  logic 		ICacheReadEn;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
@ -77,7 +77,8 @@ module ifu (
 | 
			
		||||
  logic             CompressedF;
 | 
			
		||||
  logic [31:0]      InstrRawD, InstrE, InstrW;
 | 
			
		||||
  localparam [31:0]      nop = 32'h00000013; // instruction for NOP
 | 
			
		||||
  logic 	    reset_q; // *** look at this later.  
 | 
			
		||||
  logic 	    reset_q; // *** look at this later.
 | 
			
		||||
  logic [`XLEN-1:0] PCPF;
 | 
			
		||||
 | 
			
		||||
  tlb #(.ENTRY_BITS(3), .ITLB(1)) itlb(.TLBAccessType(2'b10), .VirtualAddress(PCF),
 | 
			
		||||
                .PageTableEntryWrite(PageTableEntryF), .PageTypeWrite(PageTypeF),
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,8 @@ module privileged (
 | 
			
		||||
 | 
			
		||||
  // PMA checker signals
 | 
			
		||||
  input  logic [31:0]      HADDR,
 | 
			
		||||
  input  logic             HSIZE, HWRITE, HBURST,
 | 
			
		||||
  input  logic             HWRITE,
 | 
			
		||||
  input  logic [2:0]       HSIZE, HBURST,
 | 
			
		||||
  input  logic             Atomic, Execute, Write, Read,
 | 
			
		||||
  output logic             Cacheable, Idempotent, AtomicAllowed,
 | 
			
		||||
  output logic             SquashAHBAccess,
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,9 @@
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
package ahbliteState;
 | 
			
		||||
  typedef enum {IDLE, MEMREAD, MEMWRITE, INSTRREAD, INSTRREADC, ATOMICREAD, ATOMICWRITE, MMUTRANSLATE} statetype;
 | 
			
		||||
endpackage
 | 
			
		||||
 | 
			
		||||
module testbench_busybear();
 | 
			
		||||
 | 
			
		||||
  logic            clk, reset;
 | 
			
		||||
@ -504,11 +508,11 @@ module testbench_busybear();
 | 
			
		||||
  // Track names of instructions
 | 
			
		||||
  string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName;
 | 
			
		||||
  logic [31:0] InstrW;
 | 
			
		||||
  instrNameDecTB dec(dut.hart.ifu.ic.InstrF, InstrFName);
 | 
			
		||||
  instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
 | 
			
		||||
  instrTrackerTB it(clk, reset,
 | 
			
		||||
                dut.hart.ifu.icache.controller.FinalInstrRawF,
 | 
			
		||||
                dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
 | 
			
		||||
                dut.hart.ifu.InstrM,  InstrW,
 | 
			
		||||
                InstrDName, InstrEName, InstrMName, InstrWName);
 | 
			
		||||
                dut.hart.ifu.InstrM,  dut.hart.ifu.InstrW,
 | 
			
		||||
                InstrFName, InstrDName, InstrEName, InstrMName, InstrWName);
 | 
			
		||||
 | 
			
		||||
  // generate clock to sequence tests
 | 
			
		||||
  always
 | 
			
		||||
@ -518,15 +522,14 @@ module testbench_busybear();
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
module instrTrackerTB(
 | 
			
		||||
  input  logic            clk, reset, FlushE,
 | 
			
		||||
  input  logic [31:0]     InstrD,
 | 
			
		||||
  input  logic [31:0]     InstrE, InstrM,
 | 
			
		||||
  output logic [31:0]     InstrW,
 | 
			
		||||
  output string           InstrDName, InstrEName, InstrMName, InstrWName);
 | 
			
		||||
  input  logic            clk, reset,
 | 
			
		||||
  input  logic [31:0]     InstrF,InstrD,InstrE,InstrM,InstrW,
 | 
			
		||||
  output string           InstrFName, InstrDName, InstrEName, InstrMName, InstrWName);
 | 
			
		||||
        
 | 
			
		||||
  // stage Instr to Writeback for visualization
 | 
			
		||||
  //flopr  #(32) InstrWReg(clk, reset, InstrM, InstrW);
 | 
			
		||||
 | 
			
		||||
  instrNameDecTB fdec(InstrF, InstrFName);
 | 
			
		||||
  instrNameDecTB ddec(InstrD, InstrDName);
 | 
			
		||||
  instrNameDecTB edec(InstrE, InstrEName);
 | 
			
		||||
  instrNameDecTB mdec(InstrM, InstrMName);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user