何年ぶりかの更新なのですがそんなことは特に気にせずメモがわりに書きます。
AMBA AXI Protocol v1.0 SpecificationにはWrap Boundaryの定義として
Wrap_Boundary =
( INT ( Start_Address / ( Number_Bytes x Burst_Length ) ) ) x ( Number_Bytes x Burst_Length )
とあります。
一瞬軽いイジメかと思うが、丁寧に見ると要は(転送サイズ×バースト長)にアラインメントさせたアドレスという感じの意味。
ここで、
INT(x) はxを小数点以下切り捨てで整数にした値
Start_Addressは転送のスタートアドレス
Number_Bytesは転送サイズ(単位バイト)= 2^AWSIZE または 2^ARSIZE
Burst_Lengthはバースト長 = AWLEN+1 または ARLEN+1
アドレスの幅をAddr_WidthとするとVerilogでは次のように書けます。たぶん。
(Writeの場合)
Wrap_Boundary = Start_Address & ( { {(Addr_Width-4){1'b1}}, ~AWLEN } << AWSIZE )
ハードは便利だ。
Readの場合はAWLEN,AWSIZEをそれぞれARLEN, ARSIZEに変えます。
ちなみにAXIではWRAPバーストの場合バースト長は2,4,8,16のいずれかでなければなりません。
なのでWRAPバースト時にAWLEN/ARLENが取り得る値は4'b0001, 4'b0011, 4'b0111, 4'b1111のいずれかです。
2 件のコメント:
Thank you! Very helpful!
コメントを投稿