在芯片设计中,经常会遇到时序违例的问题,通常的解决方式就是插入寄存器,也就是打拍。但对于握手信号来说(例如AXI总线中的ready和valid信号),直接打拍会导致valid和ready不满足正确的握手关系,从而导致数据漏采样或者重复采样。
因此,需要使用特殊的方法来对握手信号进行打拍。对AXI总线中握手信号的打拍通常称为AXI register slice,可以降低关键路径的组合逻辑延迟,提高系统工作频率。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指的是从数据发送方 (source) 到数据接收方 (destination) 之间的数据传递方向。Forward register是同时对valid信号和payload信号进行打拍。Forward打拍的电路框图如下:
forward registered
verilog代码示例如下,其中valid_src、data_src、ready_src这三个信号是发送端(source)使用的,而valid_dst、data_dst、ready_dst这三个信号是接收端(destination)使用的。
valid_dst用于对发送端的valid_src进行打拍(锁存),它在ready_src为1时锁存valid_src,ready_src为1有以下两种情况:
valid_dst为0:此时valid_dst和data_dst寄存器没有有效数据,可以接收发送端的valid_src。
ready_dst为1:此时接收端准备好了接收数据。若valid_dst为0:表示接收方先准备好接收数据,而valid_dst和data_dst寄存器没有有效数据,可以接收valid_src。若valid_dst为1:发送方和接收方都完成了一次握手,valid_dst和data_dst可以更新。
data_dst是对数据进行打拍(锁存),条件是发送端完成握手(valid_src和ready_src均有效)。这里的数据通路没有用于控制逻辑,因此可以不带复位端,以节省面积。
3. Backward registered
Backward指的是接收端向发送端发送ready信号的方向。需要注意,不能只对ready信号打拍,而不对valid和data信号进行处理,这样会导致数据漏采或重复采样。
正确的方法是为发送端的valid和data信号也打拍(进行锁存),当发送端握手成功但接收端没有ready时,可以锁存发送端发过来的数据。等接收端ready后,可以接收到暂存的数据。backward registered的电路框图如下所示:
backward registered
verilog代码示例如下:
valid_r: 对发送端的valid_src进行锁存,会在以下情况下置1或置0:
当接收端ready_dst为1时,置0,此时接收端可以接收数据,不需要暂存。
当发送端valid_src和ready_src有效,且接收端ready_dst无效,此时需要锁存数据,将valid_r置1。
data_r:和valid_dst的逻辑类似,当满足valid_src & ready_src & ~ready_dst时,锁存发送端的data_src。
ready_src:通过以下逻辑控制:
复位值为1,一旦发送端准备好数据,即可暂存data_src。
接收端ready_dst有效时,置1。
发送端valid_src有效时,置0。
valid_dst和data_dst这两个信号根据ready_src的值来进行赋值:
当ready_src为1时,接收端或者可以接收数据,赋值为valid_src和data_src。
当ready_src为0时,此时暂存寄存器中的数据有效,因此赋值为valid_r和data_r。
4. Full registered
Full Registered是对valid/data和ready都进行时序优化的寄存器,将Forward Registered和Backward Registered组合在一起即可得到Full Registered,电路框图如下图所示:
full registered
参考内容:
Synopsys DesignWare DW_axi_rs databook
ic基础|时序篇:握手协议valid和ready的时序优化
4956