1

So I've created a direct-mapped write-back cache simulator.

In testing my stuff, I wrote to address 0x14c the value "99", it was originally a value "4C" Then I read in value 0x348, which makes the write back function occur because both of those addresses below to the same slot number, just different tag.

Basically, I then need to write all the data in the slot from the "cache" object to the main_mem object. I use System.array copy.

I can SEE that the value 99 IS successfully written back to the main memory array.

But when I want to read address 14C again (which should pull it's whole block including that 99), it prints what was there initially, not reflecting that change I wrote.

Does System.arraycopy not pull the data from the array starting at specific index? Does it just count up from the value of the first index?

Here is my read() and write() methods and the output

      public static void readAddress() {
          System.out.println("What address? ");

          address = keyboard.nextInt(16);
          startAddress = address & 0x758;
          tag = (address >> 6) & 0x1F;
          slot = (address >> 3) & 0x7;

          //Valid bit is 0, empty slot
          if (cache[slot].getValidBit() == 0) {              

              cache[slot].setValidBit(1);
              cache[slot].setTag(tag);
              cache[slot].setStartAddress(startAddress);

              System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize);

              System.out.println("Cache Miss");
              System.out.print("The value at that address is: ");
              System.out.printf("%X", 0xFF & address);
              System.out.println();
              System.out.println();
          }
          //Valid bit 1 but tags don't match
          else if (cache[slot].getValidBit() == 1 && cache[slot].getTag() != tag) {
              System.out.println("Cache Miss ");

              if (cache[slot].getDirty() == 1) {
                  System.out.println("This is a dirty slot!");
                  //copy contents of slot back into main memory before loading new block
                  System.out.println("Slot is dirty and will be written back, val for 14c is " +cache[slot].dataBlock[4]);
                  System.arraycopy(main_Mem, cache[slot].getStartAddress(), cache[slot].dataBlock, 0, cacheSize);
                  System.out.println("Everything should have been copied to main by now. The value for 332 is " + main_Mem[332]);
              }

              startAddress = address & 0x7F8;
              cache[slot].setTag(tag);
              cache[slot].setStartAddress(startAddress);
              //set dirty back to 0, incase it was 1
              cache[slot].setDirty(0);

              for (int i = 0; i < cacheSize; i++) {
                  for (int j = cache[slot].getStartAddress(); j<cacheSize; j ++) {
                      cache[slot].dataBlock[i] = main_Mem[j];
                  }
              }
              //System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize);
              System.out.print("The value at that address is: ");
              System.out.printf("%X", 0xFF & address);
              System.out.println();
              System.out.println();
          }
          //Valid bit 1 and tags match, hit
          else if (cache[slot].getValidBit() == 1 && tag == cache[slot].getTag()) {
              System.out.println("Cache Hit");
              System.out.print("The value at that address is: ");
              System.out.printf("%X", 0xFF & address);
              System.out.println();
              System.out.println();
          }

          menu();
  }

  public static void writeAddress() {

        System.out.println("What address do you want to write to? ");
        address = keyboard.nextInt(16);
        System.out.println("And what value do you want to write to it? ");
        int input = keyboard.nextInt(16);

        startAddress = address & 0x758;
        tag = (address >> 6) & 0x1F;
        slot = (address >> 3) & 0x7;
        //Valid bit 1, tag matches, hit, just modify value
        if (cache[slot].getValidBit() != 0 && cache[slot].getTag() == tag) {
            System.out.println("Cache Hit");
            System.out.printf("%X", 0xFF & address);

            for (int i = 0; i <8; i++) {
                if (cache[slot].dataBlock[i] == (0xFF & address)) {
                    cache[slot].dataBlock[i] = input;
                    cache[slot].setDirty(1);
                }
            }   
        }
        //Valid bit 1, tags don't match-Check dirty bit and write back first if valid
        else if (cache[slot].getValidBit() == 1 && cache[slot].getTag() != tag) { 

            if (cache[slot].getDirty() ==1) {
                //copy contents of slot back into main memory before loading new block
                for (int i = 0; i < cacheSize; i++) {
                  for (int j = startAddress; j<cacheSize; j++) {
                      cache[slot].dataBlock[i] = main_Mem[j];
                  }
                }
                //System.arraycopy(cache[slot].dataBlock, 0, main_Mem, cache[slot].getStartAddress(), cacheSize);
            }

            System.out.println("Cache Miss");
            cache[slot].setValidBit(1);
            cache[slot].setTag(tag);
            cache[slot].setDirty(1);
            cache[slot].setStartAddress(startAddress);
            //copy new block into cache now
            System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize);

            for (int i = 0; i <8; i++) {
                if (cache[slot].dataBlock[i] == (0xFF & address)) {
                    System.out.println("Writing over the value of that address now...");
                    cache[slot].dataBlock[i] = input;
                }
            }

        }
        //Empty slot, no need to write back
        else if (cache[slot].getValidBit() == 0) {
            System.out.println("Cache Miss");
            System.out.println("Setting the dirty bit to 1");
            System.out.println("Dirty bit was " + cache[slot].getDirty());

            cache[slot].setValidBit(1);
            cache[slot].setTag(tag);
            cache[slot].setDirty(1);
            System.out.println("And is now " +cache[slot].getDirty());
            cache[slot].setStartAddress(startAddress);
            //copy from main mem to cache
            System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize);

            //writes to selected value in the cache
            for (int i = 0; i <8; i++) {
                if (cache[slot].dataBlock[i] == (0xFF & address)) {
                    System.out.println("Writing over the value of that address now...");
                    cache[slot].dataBlock[i] = input;
                }
            }
        }
        menu();
  }

Output:

This is a cache simulator, type in what you want to do and press enter 

[r] to read   [w] to write   [d] to display
w
What address do you want to write to? 
14c
And what value do you want to write to it? 
99
Cache Miss
Setting the dirty bit to 1
Dirty bit was 0
And is now 1
Writing over the value of that address now...
This is a cache simulator, type in what you want to do and press enter 

[r] to read   [w] to write   [d] to display
r
What address? 
348
Cache Miss 
This is a dirty slot!
Slot is dirty and will be written back, val for 14c is 153
Everything should have been copied to main by now. The value for 332 is 76
The value at that address is: 48

This is a cache simulator, type in what you want to do and press enter 

[r] to read   [w] to write   [d] to display
3
  • 1
    Your question isn't terribly clear, but a short but complete program demonstrating the problem would make it very easy to answer, I'm sure... Commented Mar 23, 2012 at 19:23
  • 2
    "This is a dirty slot!"...one vowel away from being hilarious! Commented Mar 23, 2012 at 19:52
  • Sorry. I'm copying data from one array to another, and when i try to reload that data back into the original array, it's incorrect. Commented Mar 23, 2012 at 20:03

1 Answer 1

2

If startAddress is the address within main_Mem, I think you want:

System.arraycopy(main_Mem, startAddress, ...) 

Not

System.arraycopy(main_Mem, main_Mem[startAddress], ...)

Though, complete output from one of the runs would likely make it more clear what's going wrong and why.

Sign up to request clarification or add additional context in comments.

3 Comments

I updated my question to include my read and write methods completely. The problem is where it says "The value for 332 is 76." It should be 153 (0x99). It's not saving into main memory with my copy as it should.
The problem is reading the 14c address (index) in a second time. It no longer carries the 99. output is 4c (like when the program is initialized.)
:) I did. Hadn't replied or accepted it until a little while ago. Happy now?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.