2016-08-26 4 views
0

私は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つのアドレスを区別するべきですか?

私が考えていた他の方法はヒットしたため、マッチを見つけたのでキャッシュを追い出すべきではありません。しかし、その一致は、私が要求している実際の言葉を持っていません。私は交換をしないと、この論理は間違っていますが、私のキャッシュはヒットです。そして、私はちょうどエビクトとキャッシュヒットの間でループロジックに入りました。

答えて

1

更新後、問題は明確になります。Bはバイト単位のサイズでなければなりませんが、ビット単位で使用しています。アドレスの正しいオフセットビット数はlog2(16)= 4です。図の|区切り文字を正しい位置に移動すると、すべてがうまくいきます。各16Bブロックのインデックスが1より高いことがわかります前のよりも。

H 0000_0000 0000 0000 0000 0000 0000 0000|0000|0000  
E 0000_0004 
L 0000_0008 
L 0000_000C 
O 0000_0010 0000 0000 0000 0000 0000 0000|0001|0000 
    0000_0014 
... 

私はまた、あなたのアドレスが0000の余分なブロックで、前回の36ビットだったことに気づきました。私はインデックスビットの数も二重チェックしました。インデックスビットは4つで、それぞれ16組の4つの方法を意味します。 16 * 4 * 16B = 1024Bなので、これはあなたの1kiBキャッシュに適しています。


あなたは、メモリの複数のチャンクが同じキャッシュラインに行くと、in your previous questionと同じ問題を抱えて、しかし別の理由のためです。 1つのキャッシュラインは常に、同じタグ+インデックスビットを持つアドレスのすべてのデータを保持するのに十分な大きさでなければならないため、重大な誤りがあるという印です。

+0

私の誤解を訂正してください。 '128バイトのキャッシュライン全体を満たすために十分なデータをメモリからロードする必要があると言うとき、それは私が最初の配列(' HELL'をロードすると、各文字は32ビットです)でやっていることでしょうか?私は 'キャッシュラインの2番目の4Bチャンク 'について混乱しています。なぜなら、インデックス0では、配列の4つすべてを埋めるでしょうか? array1には 'HELL'、array2には' O WO'、array3には 'ORD! '、array4にはロードミスの後でキャッシュに書き込むときのガーベージ値が入っていますか?私が間違っていると、いつ、どこで、キャッシュラインの2番目のチャンクが書き込まれたのですか? – Sugihara

+0

@Sugihara:オフセット= 7ビット、右?したがって、メモリはバイトアドレス可能(ビットアドレス可能ではない)なので、各キャッシュラインは128 ** ** **です。だから、各キャッシュラインは32ワードを保持し、あなたのダイアグラムは偽です。 –

+0

変数名を更新しました。私はPattersonとHennessyのComputer Organization and Designを使用しています。ブロック/キャッシュラインを4 DWORDS(それぞれ32ビット)と定義しました。どうやって32語を手に入れていますか? – Sugihara

関連する問題