Verilog编程-17. 流水线设计
背景
流水线是一个纯粹的数字电路概念,同时流水线会被阻塞。若流水线的某一级被阻塞,那么整个流水线都会被阻塞,也就是前级、后级的数据都要保存在本级中,直至流水线阻塞消失。
对于如何控制流水线阻塞以及运行,可以有两种策略:
策略1
设置一个总控制模块,可以同时看到各级流水线状态,并对所有流水线下达命令。一旦在某一时刻发现某个流水级出现问题,则向这级流水之前的所有流水级发出命令,阻塞数据传递;
策略2
对每一级,同时和前后级进行沟通,决定下一时钟周期是否向后传递数据。就某一级而言,会向后一级发出一个“下一时刻我有东西传给你”的请求,同时向上一级发出“下一时刻我可以接受数据”的反馈。若无法接受,则向前级发出阻塞信号,前级必须保持数据直到本级可以接受信号。而所有的控制信号都是一级一级向下传播,没有一个总控制模块。
在使用了总线的设计中,策略2更友好。
在分析流水线数据传递的时候,只需要知道,在时钟周期上升沿,本级采到的信号只和前级有关,所以只要看前级的数据即可,这样可以简化数据寻找的思路。
流水线互锁控制
在背景中的策略2可以称为流水线互锁控制机制,在这种机制下,流水线中任一级无法前进时,它前面的流水线都无法前进,且数据得以保存。以第2级为例,需要有的信号为:
下面是本级信号:
pipe2_valid: 寄存器类型,流水级有效标识位,为1代表本级数据有效,为0代表无效;
pipe1_to_pipe2_bus: 寄存器类型,存储从前级传来的数据;
以上两个寄存器类型变量就是常说的插入流水线的寄存器,保证流水线中数据可以正常流水
pipe2_ready_go: 线网类型,本级信号,描述当前拍状态,为1代表本级的处理任务已经完成,可以传递到后级流水;为0代表不可传递;
下面是输入输出信号:
pipe2_allowin: 线网类型,本级到前级的输出信号,为1表示前级可以向本级传递数据,为0代表不可传递;
pipe3_allowin: 线网类型,后级到本级的输入信号,为1表示本级可以向后级传递数据,为0代表不可传递;
pipe1_to_pipe2_valid: 线网类型,前级到本级的输入信号,为1表示前级有数据传递到本级,为0代表无数据传递;
pipe2_to_pipe3_valid: 线网类型,本级到后级的输出信号,为1表示本级有数据传递到后级,为0代表无数据传递;
pipe1_to_pipe2_data: 线网类型,前级到本级的输入信号,传递从前级到本级的数据,存到pipe1_to_pipe2_bus这个寄存器中;
pipe2_to_pipe3_data: 线网类型,本级到后级的输出信号,传递从本级到后级的数据;
从上文的描述可以看到,对任一级来说,需要有6个输入输出的信号,同时本级内还需要有3个信号(包括2个reg来实现流水线中数据的存储)。
ready_go信号表示可以向后级传递,valid信号表示本级数据有效,两个信号都有效则pipe1_to_pipe2_valid信号才有效
文档信息
- 本文作者:Polaris
- 本文链接:https://polaris-chn.github.io/2023/12/09/Verilog-practice-17/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)