NOC调试流程
-
VCS仿真
-
Prj文件夹下写filelist.f 和 makefile
-
Prj下
$make vcs_com 编译
$make vcs_sim 仿真
$make verdi 查看仿真结果
$make simv 查看仿真
-
testbench
tb_round_robin_arbiter
-
实现了一个轮询仲裁器
-
parameter AGENTS_NUM = 4 //代理数量
-
localparam [31:0] AGENTS_PTR_SIZE = $clog2(AGENTS_NUM);
信号 | 位宽 | 功能 |
---|---|---|
requests_cmd | AGENTS_NUM | 每个代理的请求命令 |
curr_highest_priority | AGENTS_PTR_SIZE | 当前最高优先级的值 |
next_highest_priority | AGENTS_PTR_SIZE | 下一个最高优先级的值 |
first_test | 1 | 表示是否是第一次进行测试,是为1 |
starvation | AGENTS_NUM | 用于表示每个代理是否处于饿死状态,为1则表示饿死 |
grants | AGENTS_NUM | 用于表示每个代理是否被授予访问权限 |
clk | 1 | 时钟 |
rst | 1 | 复位 |
-
初始化和复位:在 initialize 和 clear_reset 任务中,进行了一些初始化和复位操作,如设置时钟、复位信号、优先级等。
-
测试:在 test 任务中,进行了一些测试操作,如生成随机请求命令,并检查授权。
-
检查授权:在 check_grant 任务中,检查了授权的正确性。例如,确保只有发出请求的代理才能获得授权,确保在冲突情况下只有一个代理获得授权,以及确保获得授权的代理是优先级最高的。
-
饿死检查:如果一个代理连续10次没有获得授权,就认为该代理饿死了,将其对应的 starvation 标志设置为1。
-
失败检查:如果在一次授权中,有多于一个的代理获得授权,或者没有发出请求的代理获得了授权,或者应该获得授权的代理没有获得授权,那么就认为仲裁器失败,显示失败信息并结束测试。总的来说,这段代码是一个轮询仲裁器的测试模块,通过生成随机请求,检查授权的正确性,以及检查是否存在饿死的代理,来测试轮询仲裁器的功能和性能。
可以画出轮询仲裁表,假设优先级从高到低为:DCBA
优先级 | 当前的代理请求 | 授权的请求 |
---|---|---|
DCBA | 0100 | 0100 |
DABC | 0001 | 0001 |
BCDA | 1001 | 1000 |
ABCD | 0011 | 0001 |
BCDA | 1101 | 0100 |
DABC | 1101 | 1000 |
ABCD | 0101 | 0001 |
BCDA | 0010 | 0010 |
CDAB | 0001 | 0001 |
BCDA | 1101 | 0100 |
可见仿真波形与仲裁表的结果一致,仿真通过
tb_separable_input_first_allocator
- 实现了一个可分离输入的优先级分配器
- parameter VC_NUM = 2 //虚拟通道数
- localparam PORT_NUM = 5 //端口数
信号 | 位宽 | 功能 |
---|---|---|
requests_cmd | PORT_NUM * VC_NUM | 一个二维逻辑数组,表示每个输入端口对应的虚拟通道请求。 |
out_port_cmd | PORT_NUM * VC_NUM | 一个二维端口数组,表示每个输入端口对应的输出端口。 |
curr_highest_priority_vc | PORT_NUM * AGENTS_PTR_SIZE_IN | 下一个最高优先级的值 |
grants | PORT_NUM * VC_NUM | 一个二维线网数组,表示每个输出端口对应的虚拟通道授权。 |
clk | 1 | 时钟 |
rst | 1 | 复位 |
- 初始化和测试:
- initialize任务用于初始化模块的内部变量和参数。
- clear_reset任务在时钟的上升沿将复位信号清零。
- test任务用于进行模块的功能测试。
- 生成授权和请求:
- gen_vc_grant任务根据输入端口的请求生成对应的虚拟通道授权。
- gen_ip_grant任务根据输出端口的请求生成对应的输入端口授权。
- gen_out_request任务根据虚拟通道授权生成输出请求。
- gen_grant_o任务根据输入端口和输出端口的授权生成虚拟通道授权。
- 检查矩阵:
- check_matrices任务用于检查生成的授权矩阵是否与预期的授权矩阵一致。
总体而言,这段代码实现了一个可分离输入的优先级分配器,通过输入端口的请求和输出端口的请求生成对应的虚拟通道授权,并检查生成的授权矩阵是否正确。
进行推理计算(以第一个周期为例):
-
request_i 请求矩阵
[ 0 0 1 0 1 0 1 1 1 0 ] (1) \left[ \begin{matrix} 0 & 0 \\ 1 & 0 \\ 1 & 0 \\ 1 & 1 \\ 1 & 0 \end{matrix} \right] \tag{1} 0111100010 (1) -
request_i 仲裁结果
[ 0 0 1 0 1 0 1 0 1 0 ] (2) \left[ \begin{matrix} 0 & 0 \\ 1 & 0 \\ 1 & 0 \\ 1 & 0 \\ 1 & 0 \end{matrix} \right] \tag{2} 0111100000 (2) -
outport_i 方向矩阵
[ 1 1 4 4 1 1 4 4 2 2 ] (3) \left[ \begin{matrix} 1 & 1 \\ 4 & 4 \\ 1 & 1 \\ 4 & 4 \\ 2 & 2 \end{matrix} \right] \tag{3} 1414214142 (3) -
out_request 矩阵
[ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 ] (4) \left[ \begin{matrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 & 0 \\ \end{matrix} \right] \tag{4} 0000000001010000000100100 (4) -
out_request 矩阵仲裁结果
[ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 ] (5) \left[ \begin{matrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ \end{matrix} \right] \tag{5} 0000000001010000000000100 (5) -
grant_o 授权矩阵
[ 0 0 1 0 1 0 0 0 1 0 ] (6) \left[ \begin{matrix} 0 & 0 \\ 1 & 0 \\ 1 & 0 \\ 0 & 0 \\ 1 & 0 \end{matrix} \right] \tag{6} 0110100000 (6)
第一个周期计算结果与仿真结果一致