Round-Robin 调度逻辑算法

Round-Robin 调度逻辑算法


之前上学还是工作,都接触过调度算法:Round-Robin和weight-Round Robin算法,但只知道它的功能和目的是什么,没有具体了解如何实现的;
现在是工作上需要来基于Verilog的具体实现;



1 Intro

Round-Robin即常说的RR轮询公平调度;原理:当多个request发送到仲裁器时,仲裁器通过轮询方式给request的grant,当一个requestor拿到grant后,它的优先级会降得最低;这样公平保证每个requestor都能拿到grant;

1.1 固定优先级

先介绍一下固定优先级的仲裁算法:即req[3:0],优先级从低bit到高bit降低;在真值表实现上就是:对req[3:0]进行搜索,低位出现1,则相对应的grant位为1;
在这里插入图片描述

上述真值表表达:grant[3:0] = req & (~req+1);

1.2 Round-Robin算法

回归主题Round_Rogin算法,是按照一定规则(上次获得grant的request,其优先级降为最低,优先级保持 向左递减规律)进行按照clk改变优先级大小;
Key:如何去动态调整优先级
不深究知道:添加hot信号,并进行与req相关运算,可以得到grant的优先级,得到该读热码对应位具有最高优先级,然后优先级循环向左降低;
在这里插入图片描述

Verilog代码实现:

module arbiter_hot#(
	paramter NUM_REQ = 4
)(
	input[NUM_REQ -1:0] req,
	input[NUM_REQ -1:0] hot,
	input[NUM_REQ -1:0] gnt
);
	wire[2*NUM_REQ -1:0] double_req = {req,req};
	wire[2*NUM_REQ -1:0] double_gnt = double_req & ~(double_req -base);

	assign gnt = double_gnt[NUM_REQ-1:0] | double_gnt[2*NUM_REQ-1:NUM_REQ];

endmodule

从上图可以看出,hot可以很方便的显示优先级和相对应的影响grant的的裁决;即grant = f(req,hot);
现在增加逻辑改变hot的变化体现:优先级改变降低即可;
进一步做出改变即可:

module rr_arbiter#(
	parameter NUM_REQ = 4
)(
	input clk,
	input rst_n,
	input [NUM_REQ -1:0] req,
	output[NUM_REQ -1:0] gnt
);
// req-->hot
reg[NUM_REQ -1:0] hist_q;

always_ff@(posedge clk) begin
	if(!rst_n) begin
		hist_q <= {NUM_REQ-1{1'b0},1'b1};// 初始req[0]为最高优先级
	end else begin
		if(|req) begin
			hist_q <= {gnt[NUM_REQ-2:0],gnt[NUM_REQ-1]};	//改变优先级,向左循环移位
		end
	end
end

//call the module--combinationl logic
arbiter_hot #(
	.NUM_REQ(NUM_REQ)
)(
	.req(req),
	.hot(hist_q),
	.gnt(gnt)
)
endmodule

这个算法基本上全涉及运算,从固定优先级到–>循环左移优先级,能够看懂清晰
以上代码未经过搭建TB环境进行验证,仅供逻辑参考。

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
round-robin算法是一种常见的调度算法,用于在多个任务之间进行时间片轮转调度。它的基本原则是按照固定的时间片大小,依次分配给每个任务执行的时间。 在C语言中,可以通过以下方式实现round-robin算法: ```c #include <stdio.h> #define MAX_PROCESS 5 // 定义进程结构体 typedef struct { int pid; // 进程ID int burst_time; // 执行时间 int remaining_time; // 剩余执行时间 } Process; // round-robin调度函数 void roundRobinScheduling(Process processes[], int n, int time_quantum) { int i, total_time = 0; // 初始化剩余执行时间 for (i = 0; i < n; i++) { processes[i].remaining_time = processes[i].burst_time; } // 执行调度 while (1) { int done = 1; for (i = 0; i < n; i++) { if (processes[i].remaining_time > 0) { done = 0; if (processes[i].remaining_time > time_quantum) { total_time += time_quantum; processes[i].remaining_time -= time_quantum; printf("Process %d executes for time quantum %d\n", processes[i].pid, time_quantum); } else { total_time += processes[i].remaining_time; processes[i].remaining_time = 0; printf("Process %d executes for remaining time %d\n", processes[i].pid, total_time); } } } if (done == 1) break; } printf("Total execution time: %d\n", total_time); } int main() { Process processes[MAX_PROCESS] = { {1, 10}, {2, 5}, {3, 8}, {4, 3}, {5, 12} }; int time_quantum = 2; roundRobinScheduling(processes, MAX_PROCESS, time_quantum); return 0; } ``` 以上是一个简单的round-robin调度算法的示例,通过定义进程结构体和调度函数来实现。在`main`函数中,创建了五个进程,并指定了时间片大小为2。调用`roundRobinScheduling`函数进行调度并输出执行结果。 这个示例中的时间片大小是固定的,当一个进程的剩余执行时间小于时间片时,会执行完剩余时间。每次执行一个时间片后,会输出相应的执行信息。最后输出总执行时间。 当然,实际应用中,round-robin算法可能会结合其他调度算法和更多的优化策略来进行实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值