1、什么是VOQ(Virtual Output Queues)?
VOQ(虚拟输出序列)是一种存储结构,由FIFO与RAM以及逻辑结构组合构成。在一些数据应用场景中能够有效存储数据并且能够及时输出,避免阻塞。一句话来说VOQ的优点在于:共享存储,较少存储资源,避免数据阻塞,提高数据输出效率。
2、为什么FIFO会有数据阻塞,而VOQ不会有数据阻塞?
生活举例如下:在一条可以右转和直行的道路上,如果前面的直行车在等红路灯,虽然右转线已空闲,但是由于直行车的阻塞后面的右转车辆就只能等待。FIFO也会出现这种情况。
应用场景如下:4路数据共用一个数据输入端口,由于FIFO是先入先出,而第0路数据由于下游模块没有处理数据暂时停止读取,此时会导致后面的第1路、2路、3路数据无法读取,造成排头阻塞。
克服这种局限性的一种方法是使用虚拟输出队列(Virtual Output Queues)。
虚拟输出队列(Virtual Output Queues)总体的想法十分朴素:在输入端口将发送到不同端口的数据包虚拟成不同的队列,并且彼此互不影响,这样一来即使队头数据包被阻塞也将不会影响发送到其他端口的数据包的发送
3、VOQ的是如何实现的?
下文以MAC中的VOQ实现为例,讲解VOQ的实现方案
3.1 VOQ的结构
模块中只有一个数据输入,输出端口,但是有4路数据,由mac_tx_client_in[1:0]区分。
如果采用传统FIFO(先入先出)结构,假设0用户先输入,那么在一段时间内0用户数据没有读出(原因可能为:0用户下游处理模块处理不过来,起反压,一段时间内不能再发数据),就会阻塞后输入的1用户、2用户、3用户数据,导致其他用户数据无法读出。而采用VOQ结构,0用户数据暂停读取并不会影响其他用户数据读取。
MAC VOQ包含三部分,数据存储模块DATA_RAM、指针存储模块PTR_fifo、每个client专用的指针存储desc_fifo。为方便说明,假设MAC的client数据为4个,分别为0、1、2、3(即mac中的数据有4路),VOQ输入数据:mac_tx_data_in[1023:0],mac_tx_vld_in,mac_tx_client_in[1:0],来自下游的输入请求voq_read_req,voq_read_client。
3.2 VOQ的内部结构图
VOQ结构如图所示:
假设存储深度为256:4个client号,需要4个desc_fifo(256x8)
一个数据存储RAM(256x1024),一个指针ptr_fifo(256x8)。数据data_RAM存储的是数据流mac_tx_data_in的数据,指针ptr_fifo存储的是DATA_RAM中未写入数据的地址,desc_fifo存储的是每个client数据在DATA_RAM中的地址。
NOTE:在模块使用之前,即复位释放后,指针ptr_fifo会自动进行初始化操作,将fifo写满,数据为0~255,表示data_ram中的0~255地址都是未写入的。
mac_tx_data_in[1023:0] |
input |
输入数据 |
mac_tx_vld_in |
input |
输入数据有效信号,作为ptr_fifo读使能、data_ram写使能、desc_fifo写使能 |
mac_tx_client_in[1:0] |
input |
用户标志号0~3,表示数据是哪路数据,作为选择器控制信号用于区分desc_fifo, |
Voq_read_req |
input |
来自下游的读请求信号,作为desc_fifo的读使能,ptr_ram的写使能,以及data_ram的读使能 |
Voq_read_client |
input |
来自下游的读请求信号client |
mac_tx_data_out[1023:0] |
output |
VOQ模块输出数据 |
mac_tx_client_out[1:0] |
output |
输出数据client |
mac_tx_vld_out |
output |
输出数据有效信号 |
3.3 VOQ数据写入流程:
1、输入数据有效信号mac_tx_vld_in作为ptr_fifo读使能信号ren驱动源,读出ptr_fifo数据ptr_rdata
2、将ptr_rdata作为data_ram的写地址waddr,将mac_tx_data_in[1023:0]写入data_ram。
3、根据mactx_client将DATA_RAM写地址waddr(即ptr_rdata)写入相应的desc_fifo。
3.4 VOQ数据输出流程:
1、Voq_read_req为1有效,读取相应的desc_fifo数据desc_rdata。(根据voq_read_client选择desc_fifo。若为0则选择读desc_fifo_0)
2、将desc_rdata作为DATA_RAM的读地址,读取DATA_RAM中的数据作为mactx_tx_data_out。(voq_read_client打拍后赋值给mac_tx_client_out,打拍延时由desc_fifo读延时和RAM_DATA读延时确定)
3、将desc_rdata作为写数据写入ptr_fifo中,表示DATA_RAM中的此地址为空。
NOTE:
Voq_read_req作为desc_fifo的读使能,ptr_ram的写使能,以及data_ram的读使能
mac_tx_vld_in作为ptr_fifo读使能、data_ram写使能、desc_fifo写使能
标签:tx,什么,mac,fifo,001,VOQ,数据,desc From: https://www.cnblogs.com/xuzhi-fpga/p/18431977