概要
tinyriscv SOC 加法器原理和流程
整体架构流程
C 语言实现加法程序, 并真正由 SOC 硬件加速器完成加法操作。
技术名词解释
- ROM: SOC内存储并执行代码空间
- RAM: SOC存储数据空间
技术细节
- C 语言程序实现加法
int b = 11;
int a = 10;
sum = b + a;
- C 语言make 编译生成指令 bin
D:\soft\tinyriscv\tests\example\simple>make
生成 simple.bin 文件, 这是C code bin 文件
- 指令bin放ROM 执行
D:\soft\tinyriscv\sim>python .\sim_new_nowave.py ..\tests\example\simple\simple.bin inst.data
test running...
WARNING: ../tb/tinyriscv_soc_tb.v:499: $readmemh(inst.data): Not enough words in the file for the requested range [0:4095].
FST info: dumpfile tinyriscv_soc_tb.fst opened for output.
这里 inst.data 对应就是 ROM, 放代码的. 把我们的 C Code bin 拷贝到ROM.
- 加数写入RAM
(1)在 tinyriscv top中, 通过 master 0 将加数 a(10) 和 b(11) 的值写到 RAM.
(2) 拿到RAM 访问权限后,就可以写 RAM。要注意的是 tinyriscv 里可能同时有 3 个 master 抢夺RAM 权限, 这就需要仲裁。好在此时只有 master 0 发了请求,所以他马上就把数据写到 RAM 了。
看起来是同一个时钟周期同时完成的。
- RAM上读取加数数据
s1_data_i 从设备1(RAM) 读取到的数据 , 通过 soc 内部总线 rib 传给 m0 m0_data_o (主设备0读取到的数据) .
m0_data_o 记录的加数再传到 tinyriscv module 的 rib_ex_data_i
再传给ex 的 mem_rdata_i
input wire[`MemBus] mem_rdata_i, // 内存输入数据
- SOC 加法器运算
ex 里完成这个加法运算。
执行(ex)模块是一个纯组合逻辑电路,主要作用有以下几点:
1.根据当前是什么指令执行对应的操作,比如add指令,则将寄存器1的值和寄存器2的值相加。
2.如果是内存加载指令,则读取对应地址的内存数据。
以add指令为例说明,add指令的作用就是将寄存器1的值和寄存器2的值相加,最后将结果写入目的寄存器。
`INST_TYPE_R_M: begin
if ((funct7 == 7'b0000000) || (funct7 == 7'b0100000)) begin
case (funct3)
`INST_ADD_SUB: begin
jump_flag = `JumpDisable;
hold_flag = `HoldDisable;
jump_addr = `ZeroWord;
mem_wdata_o = `ZeroWord;
mem_raddr_o = `ZeroWord;
mem_waddr_o = `ZeroWord;
mem_we = `WriteDisable;
if (inst_i[30] == 1'b0) begin
reg_wdata = reg1_rdata_i + reg2_rdata_i;
end else begin
reg_wdata = reg1_rdata_i - reg2_rdata_i;
end
end
下图是add指令的编码格式:
这中间细分的话, 还涉及取指、译码、访存、执行、回写过程。不展开了,后续单独章节分析。
- 加法结果写回RAM
参考文献:
[1] 从零开始写RISC-V处理器
[2] https://gitee.com/llorr/tinyriscv