module top_to_bottom(
input wire clk,
input wire rst_n,
input wire [15:0] req, //request信号入口 0~15号分别对应
output reg [15:0] grt //grant 信号出口
);
reg [4:0] i;
reg [15:0] grt_tmp; //定义一个中间变量 方便进行非阻塞赋值 注意这里并没有产生
//register
always @ (*) begin
grt_tmp = 16’b0; //进行初始赋值 注意不要在posedge clk下赋值 要不然会产生寄存器
for (i=0;i<5’d16;i=i+1) begin
if (req[i] == 1’b1)
begin
grt_tmp[i] = 1’b1; //如果对应的node号申请就按照top bottom的优先级放权
i = 5’d15; //一旦放权后就退出循环,方法是把i打到最大
end
end
end
always @ (posedge clk) begin //进行寄存器赋值操作
if (!rst_n)
grt <= 16’b0;
else
grt <= grt_tmp; //
end
endmodule
module round_robin(
input wire clk,
input wire rst_n,
input wire [15:0] req,
output reg [15:0] grt
);
reg [3:0] cnt;//一个计数器,相当于一个指针,每当上一次node申请成功后,就指向与此//node相邻的下一个node,这个信息需要跨时钟沿,so we need some registers!
reg [3:0] i;
reg [15:0] grt_tmp;//注意i和grt_tmp在综合时其实都不是寄存器,虽然他们是reg类型J
always @ (*) begin
i = cnt;
grt_tmp = 16’b0;
while (rst_