如果你參加過(guò)IC校招面試,自然會(huì)被問(wèn)到“setup/hold的概念,以及setup/hold違例怎么辦?”
這時(shí)候,你肯定會(huì)立馬在腦海中從打拍或者插buffer兩個(gè)答案中選一個(gè)。但是在實(shí)際項(xiàng)目中,往往沒(méi)有這么簡(jiǎn)單。舉一個(gè)實(shí)際的場(chǎng)景:
AXI master和AXI slave這一簇信號(hào)出現(xiàn)setup時(shí)序違例怎么辦?
1、從AXI master 到AXI slave 出現(xiàn)setup違例;
2、從AXI slave 到AXI master出現(xiàn)setup違例;
3、兩者都出現(xiàn)setup時(shí)序違例。
所以AXI master和AXI slave之間的打拍會(huì)存在4中模式:
Forward Registered :對(duì)valid和payload路打拍
Backward Registered :對(duì)ready路打拍
Fully Registered :同時(shí)對(duì)valid/payload路和ready路打拍
Pass Through Mode:Bypass,均不打拍
這個(gè)問(wèn)題沒(méi)那么容易或者說(shuō)不能夠直接打拍,是因?yàn)檫@一簇信號(hào)遵循valid-ready協(xié)議,需要打拍的信號(hào)間存在時(shí)序的耦合。
所以問(wèn)題就簡(jiǎn)化成如何在遵循valid -ready協(xié)議的master和slave 之間完成“打拍”,或者說(shuō)在打拍的同時(shí)處理valid-ready協(xié)議。
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
現(xiàn)在來(lái)分析下上述Forward Registered 打拍代碼的幾個(gè)輸出端口:
valid_dst:在master發(fā)請(qǐng)求(拉高valid_src)時(shí)拉高valid_dst,直到當(dāng)前master沒(méi)有valid請(qǐng)求并且slave可以接收請(qǐng)求(拉高ready_dst)時(shí)拉低valid_dst,表示一次傳輸完成。
payload_dst:在master發(fā)請(qǐng)求(拉高valid_src),并且前面沒(méi)有請(qǐng)求、請(qǐng)求已經(jīng)被接收或者正在被接收時(shí)將payload_src打拍賦給payload_dst。
其實(shí)master本身也會(huì)遵循valid-ready協(xié)議,payload_src和valid_src做同樣處理就行,即也可以在(valid_src == 1'd1 && ready_src == 1'd0)時(shí)進(jìn)行賦值,因?yàn)榇藭r(shí)payload_src輸入應(yīng)該約束保持原始數(shù)據(jù)。
ready_src:register slice或者slave可以接收數(shù)據(jù)時(shí)拉高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 會(huì)復(fù)雜點(diǎn),因?yàn)榇嬖趕lave沒(méi)有ready時(shí)master發(fā)來(lái)請(qǐng)求,需要暫存payload的場(chǎng)景。
現(xiàn)在來(lái)分析下上述Backward Registered打拍代碼的幾個(gè)輸出端口:
ready_src:對(duì)ready通路直接進(jìn)行打拍。
valid_dst:當(dāng)slave沒(méi)有ready,master發(fā)來(lái)請(qǐng)求時(shí)拉高標(biāo)志位valid_tmp0,表示下一次slave準(zhǔn)備好之后應(yīng)該從register slice內(nèi)暫存的payload拿數(shù)據(jù)
payload_dst:當(dāng)slave沒(méi)有ready,master發(fā)來(lái)請(qǐng)求時(shí)暫存payload到payload_tmp。最終的payload_dst根據(jù)標(biāo)志位valid_tmp0從payload_tmp和payload_src之間選擇
Fully Registered
類(lèi)似于,簡(jiǎn)單理解就是個(gè)乒乓BUFFER,使用非空信號(hào)做valid_dst;payload的非滿(mǎn)信號(hào)做ready_src
Pass Through Mode
直接相連
通過(guò)上述分析,可以使用register slice mode參數(shù)化的庫(kù),在后端要求AXI BUS打拍時(shí)直接調(diào)用,而無(wú)需重復(fù)造輪子。
原文標(biāo)題:打拍優(yōu)化時(shí)序不像聽(tīng)起來(lái)那么簡(jiǎn)單
文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7237瀏覽量
90916 -
時(shí)序
+關(guān)注
關(guān)注
5文章
397瀏覽量
37748 -
代碼
+關(guān)注
關(guān)注
30文章
4886瀏覽量
70186 -
Setup
+關(guān)注
關(guān)注
0文章
30瀏覽量
12169
原文標(biāo)題:打拍優(yōu)化時(shí)序不像聽(tīng)起來(lái)那么簡(jiǎn)單
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Setup/Hold Time Problem
【FPGA經(jīng)典試題】電路模塊的setup-time和hold-time是正值還是負(fù)值
解釋下setup和hold time
請(qǐng)問(wèn)AD80370中hold up time為負(fù)值是為什么?
什么是Setup和Hold時(shí)間
怎么解釋setup time和hold time的定義和在時(shí)鐘信號(hào)延遲時(shí)的變化呢?
Sample Hold Has Zero Droop and
建立時(shí)間和保持時(shí)間(setup time 和 hold time)
對(duì)于時(shí)序分析基本概念setup和hold的介紹

關(guān)于打拍優(yōu)化時(shí)序你真的全面了解嗎?

什么是Setup和Holdup時(shí)間?如何解決亞穩(wěn)態(tài)?

為什么setup檢查下一個(gè)沿而hold檢查當(dāng)前沿
怎么解決解決Hold Time違例的問(wèn)題呢
通過(guò)解剖一個(gè)邊沿觸發(fā)器簡(jiǎn)要說(shuō)明setup和hold產(chǎn)生原因

評(píng)論