私はVerilogで4ウェイキャッシュを実装しようとしていますが、キャッシュルックアップのシナリオでいくつかの混乱があります。コンピュータアーキテクチャ、4ウェイキャッシュのヒット/置換の悩み
C = ABS
C = 1KB
A = 4
B = 128 bits (4 DWORD)
S = C/AB = (8192)/(4*128) = 16
offset = lg(B) = 7 bits
index = lg(S) = 4 bits
tag = 32 - offset - index = 21 bits
C: Capacity in data arrays
A: Way-Associativity
B: Block Size (Cacheline)
How many bytes in a block
S: Number of Sets:
A set contains blocks sharing the same index
そして、私の記憶に私が持っている:私は、以下の仕様を持っていると言う
H 0000_0000 0000 0000 0000 0000 0000 0000 0|000 0|000 0000
E 0000_0004
L 0000_0008
L 0000_000C
O 0000_0010 0000 0000 0000 0000 0000 0000 0|000 0|001 0000
0000_0014
W 0000_0018
O 0000_001C
R 0000_0020 0000 0000 0000 0000 0000 0000 0|000 0|010 0000
L 0000_0024
D 0000_0028
! 0000_002C
は、私は新たなスタートの午前と私のキャッシュが空であるので、私は、アドレス0x0000_0000でロードワードを要求すると言います、私はHELL
を4つの配列のインデックス0のキャッシュラインに書きます。
次に、アドレス0x0000_0010に別のロード・ワードを要求します。この時点で私は混乱しています。
私のタグとインデックスは同じなのでヒットですが、キャッシュラインにはO
という単語がありません。この状況で私のキャッシュは何をすべきですか?私はHELL
をキックオフし、同じアレイにO WO
と書いていますか?もしそうなら、私たちはタグとインデックスビットだけを見ているので、どのように私はこれら2つのアドレスを区別するべきですか?
私が考えていた他の方法はヒットしたため、マッチを見つけたのでキャッシュを追い出すべきではありません。しかし、その一致は、私が要求している実際の言葉を持っていません。私は交換をしないと、この論理は間違っていますが、私のキャッシュはヒットです。そして、私はちょうどエビクトとキャッシュヒットの間でループロジックに入りました。
私の誤解を訂正してください。 '128バイトのキャッシュライン全体を満たすために十分なデータをメモリからロードする必要があると言うとき、それは私が最初の配列(' HELL'をロードすると、各文字は32ビットです)でやっていることでしょうか?私は 'キャッシュラインの2番目の4Bチャンク 'について混乱しています。なぜなら、インデックス0では、配列の4つすべてを埋めるでしょうか? array1には 'HELL'、array2には' O WO'、array3には 'ORD! '、array4にはロードミスの後でキャッシュに書き込むときのガーベージ値が入っていますか?私が間違っていると、いつ、どこで、キャッシュラインの2番目のチャンクが書き込まれたのですか? – Sugihara
@Sugihara:オフセット= 7ビット、右?したがって、メモリはバイトアドレス可能(ビットアドレス可能ではない)なので、各キャッシュラインは128 ** ** **です。だから、各キャッシュラインは32ワードを保持し、あなたのダイアグラムは偽です。 –
変数名を更新しました。私はPattersonとHennessyのComputer Organization and Designを使用しています。ブロック/キャッシュラインを4 DWORDS(それぞれ32ビット)と定義しました。どうやって32語を手に入れていますか? – Sugihara