在芯片設(shè)計中,經(jīng)常會遇到時序違例的問題,通常的解決方式就是插入寄存器,也就是打拍。但對于握手信號來說(例如AXI總線中的ready和valid信號),直接打拍會導(dǎo)致valid和ready不滿足正確的握手關(guān)系,從而導(dǎo)致數(shù)據(jù)漏采樣或者重復(fù)采樣。
因此,需要使用特殊的方法來對握手信號進行打拍。對AXI總線中握手信號的打拍通常稱為AXI register slice,可以降低關(guān)鍵路徑的組合邏輯延遲,提高系統(tǒng)工作頻率。register slice通常有四種模式:
Pass Through:直連,也就是不使用register slice。
Forward Registered(前向打拍) :對valid和data信號打拍。
Backward Registered(后向打拍) :對ready信號打拍。
Full Registered(雙向打拍):同時對valid,data信號和ready信號進行打拍。
1. Pass Through
不進行打拍,即不插入寄存器。
2. Forward registered
Forward指的是從數(shù)據(jù)發(fā)送方 (source) 到數(shù)據(jù)接收方 (destination) 之間的數(shù)據(jù)傳遞方向。Forward register是同時對valid信號和payload信號進行打拍。Forward打拍的電路框圖如下:
forward registered
verilog代碼示例如下,其中valid_src、data_src、ready_src這三個信號是發(fā)送端(source)使用的,而valid_dst、data_dst、ready_dst這三個信號是接收端(destination)使用的。
valid_dst用于對發(fā)送端的valid_src進行打拍(鎖存),它在ready_src為1時鎖存valid_src,ready_src為1有以下兩種情況:
valid_dst為0:此時valid_dst和data_dst寄存器沒有有效數(shù)據(jù),可以接收發(fā)送端的valid_src。
ready_dst為1:此時接收端準備好了接收數(shù)據(jù)。若valid_dst為0:表示接收方先準備好接收數(shù)據(jù),而valid_dst和data_dst寄存器沒有有效數(shù)據(jù),可以接收valid_src。若valid_dst為1:發(fā)送方和接收方都完成了一次握手,valid_dst和data_dst可以更新。
data_dst是對數(shù)據(jù)進行打拍(鎖存),條件是發(fā)送端完成握手(valid_src和ready_src均有效)。這里的數(shù)據(jù)通路沒有用于控制邏輯,因此可以不帶復(fù)位端,以節(jié)省面積。
3. Backward registered
Backward指的是接收端向發(fā)送端發(fā)送ready信號的方向。需要注意,不能只對ready信號打拍,而不對valid和data信號進行處理,這樣會導(dǎo)致數(shù)據(jù)漏采或重復(fù)采樣。
正確的方法是為發(fā)送端的valid和data信號也打拍(進行鎖存),當發(fā)送端握手成功但接收端沒有ready時,可以鎖存發(fā)送端發(fā)過來的數(shù)據(jù)。等接收端ready后,可以接收到暫存的數(shù)據(jù)。backward registered的電路框圖如下所示:
backward registered
verilog代碼示例如下:
valid_r: ?對發(fā)送端的valid_src進行鎖存,會在以下情況下置1或置0:
當接收端ready_dst為1時,置0,此時接收端可以接收數(shù)據(jù),不需要暫存。
當發(fā)送端valid_src和ready_src有效,且接收端ready_dst無效,此時需要鎖存數(shù)據(jù),將valid_r置1。
data_r:和valid_dst的邏輯類似,當滿足valid_src & ready_src & ~ready_dst時,鎖存發(fā)送端的data_src。
ready_src:通過以下邏輯控制:
復(fù)位值為1,一旦發(fā)送端準備好數(shù)據(jù),即可暫存data_src。
接收端ready_dst有效時,置1。
發(fā)送端valid_src有效時,置0。
valid_dst和data_dst這兩個信號根據(jù)ready_src的值來進行賦值:
當ready_src為1時,接收端或者可以接收數(shù)據(jù),賦值為valid_src和data_src。
當ready_src為0時,此時暫存寄存器中的數(shù)據(jù)有效,因此賦值為valid_r和data_r。
4. Full registered
Full Registered是對valid/data和ready都進行時序優(yōu)化的寄存器,將Forward Registered和Backward Registered組合在一起即可得到Full Registered,電路框圖如下圖所示:
full registered
參考內(nèi)容:
Synopsys DesignWare DW_axi_rs databook
ic基礎(chǔ)|時序篇:握手協(xié)議valid和ready的時序優(yōu)化