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