如果你參加過IC校招面試,自然會被問到“setup/hold的概念,以及setup/hold違例怎么辦?”
這時候,你肯定會立馬在腦海中從打拍或者插buffer兩個答案中選一個。但是在實際項目中,往往沒有這么簡單。舉一個實際的場景:
AXI master和AXI slave這一簇信號出現setup時序違例怎么辦?
1、從AXI master 到AXI slave 出現setup違例;
2、從AXI slave 到AXI master出現setup違例;
3、兩者都出現setup時序違例。
所以AXI master和AXI slave之間的打拍會存在4中模式:
Forward Registered :對valid和payload路打拍
Backward Registered :對ready路打拍
Fully Registered :同時對valid/payload路和ready路打拍
Pass Through Mode:Bypass,均不打拍
這個問題沒那么容易或者說不能夠直接打拍,是因為這一簇信號遵循valid-ready協議,需要打拍的信號間存在時序的耦合。
所以問題就簡化成如何在遵循valid -ready協議的master和slave 之間完成“打拍”,或者說在打拍的同時處理valid-ready協議。
Forward Registered
always @(posedge clk or negedge rst_n)begin if (rst_n == 1‘d0) valid_dst 《= 1’d0; else if (valid_src == 1‘d1) valid_dst 《= #`DLY 1’d1; else if (ready_dst == 1‘d1) valid_dst 《= #`DLY 1’d0;end always @(posedge clk or negedge rst_n)begin if (rst_n == 1‘d0) payload_dst 《= ’d0; else if (valid_src == 1‘d1 && ready_src == 1’d1) payload_dst 《= #`DLY payload_src;end ready_src = (~valid_dst) | ready_dst
現在來分析下上述Forward Registered 打拍代碼的幾個輸出端口:
valid_dst:在master發請求(拉高valid_src)時拉高valid_dst,直到當前master沒有valid請求并且slave可以接收請求(拉高ready_dst)時拉低valid_dst,表示一次傳輸完成。
payload_dst:在master發請求(拉高valid_src),并且前面沒有請求、請求已經被接收或者正在被接收時將payload_src打拍賦給payload_dst。
其實master本身也會遵循valid-ready協議,payload_src和valid_src做同樣處理就行,即也可以在(valid_src == 1‘d1 && ready_src == 1’d0)時進行賦值,因為此時payload_src輸入應該約束保持原始數據。
ready_src:register slice或者slave可以接收數據時拉高ready_src.
Backward Registered
always @(posedge clk or negedge rst_n)begin if (rst_n == 1‘d0) valid_tmp0 《= 1’d0; else if (valid_src == 1‘d1 && ready_dst == 1’d0 &&valid_tmp0 == 1‘d0) valid_tmp0 《= #`DLY 1’d1; else if (ready_dst == 1‘d1) valid_tmp0 《= #`DLY 1’d0;end always @(posedge clk or negedge rst_n)begin if (rst_n == 1‘d0) payload_tmp0 《= ’d0; else if (valid_src == 1‘d1 && ready_dst == 1’d0 &&valid_tmp0 == 1‘d0) payload_tmp0 《= #`DLY payload_src;end assign payload_dst = (valid_tmp0 == 1’d1) ?payload_tmp0 : payload_src; always @(posedge clk or negedge rst_n)begin if (rst_n == 1‘d0) ready_src 《= 1’d0; else ready_src 《= #`DLY ready_dst;end
Backward Registered 打拍相比較Forward Registered 會復雜點,因為存在slave沒有ready時master發來請求,需要暫存payload的場景。
現在來分析下上述Backward Registered打拍代碼的幾個輸出端口:
ready_src:對ready通路直接進行打拍。
valid_dst:當slave沒有ready,master發來請求時拉高標志位valid_tmp0,表示下一次slave準備好之后應該從register slice內暫存的payload拿數據
payload_dst:當slave沒有ready,master發來請求時暫存payload到payload_tmp。最終的payload_dst根據標志位valid_tmp0從payload_tmp和payload_src之間選擇
Fully Registered
類似于,簡單理解就是個乒乓BUFFER,使用非空信號做valid_dst;payload的非滿信號做ready_src
Pass Through Mode
直接相連
通過上述分析,可以使用register slice mode參數化的庫,在后端要求AXI BUS打拍時直接調用,而無需重復造輪子。
編輯:lyn
-
IC
+關注
關注
36文章
5907瀏覽量
175276 -
時序
+關注
關注
5文章
386瀏覽量
37290 -
Setup
+關注
關注
0文章
30瀏覽量
11974 -
MASTER
+關注
關注
0文章
103瀏覽量
11267
原文標題:打拍優化時序不像聽起來那么簡單
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論