RiskV相关设计
我是按照老师的知道一步一步做的,仅供参考。
TASK1:
1)修改 timer.v、timer_int的main.c timer.h; 实现simple例程中的sum累加功能(第一个for循环,sum终值5050)。
2) timer.v中添加i、sum两个寄存器,能将cpu中每一步计算的i、sum值下传至timer.v模块。
3)GTKwave软件中可直接观察到i、sum这两个寄存器的值,从而看到sum循环累加的完整计算过程。
4)timer的main.c中添加对sum最终累加值的判断功能,在cmd的仿真命令执行后,能看到pass/fail提示。
TASK2:
1) 将simple例程中的sum累加功能,移植到verilog编写的硬件模块中(例如timer.v),从而将软件计算变为硬件计算,cpu配置并启动硬件模块进行sum累加。
2) main.c中要添加对硬件模块内寄存器值的读取功能,实现硬件模块完成sum累加后,通过中断触发cpu读取计算结果并进行校验(步骤4)。
3) GTKwave软件中可直接观察到i、sum这两个寄存器的值,从而看到sum循环累加的完整计算过程。
4) timer的main.c中添加对sum最终累加值的判断功能,在cmd的仿真命令执行后,能看到pass/fail提示。
注:task2中所用算法可自行更换,报告首段需写明算法作用,以及选用的原因。不可直接照抄第一批次的task2。
Task1:
代码在原有基础上添加,故粘贴修改部分
main.c文件添加代码(累加求和部分)
//添加变量
int i;
int sum = 0;
// sum = 5050
for (i = 0; i <= 100; i++) {
sum += i;
TIMER0_REG(TIMER0_I) = i;
TIMER0_REG(TIMER0_SUM) = sum;
}
//结果判断函数
if (sum == 5050)
set_test_pass();
else
set_test_fail();
return 0;
timer.h添加地址定义
#define TIMER0_I (TIMER0_BASE + (0x0C))
#define TIMER0_SUM (TIMER0_BASE + (0x10))
timer.v添加寄存器以及数据写入
//设定总线地址,以方便映射
localparam REG_I = 5'hc;
localparam REG_SUM = 5'h10;
//添加sum和i两个寄存器
reg[31:0] timer_i;
reg[31:0] timer_sum;
// write regs
always @ (posedge clk) begin
if (rst == `RstEnable) begin
timer_ctrl <= `ZeroWord;
timer_value <= `ZeroWord;
end else begin
if (we_i == `WriteEnable) begin
case (addr_i[4:0])