1.RISC-V CPU的硬件设计常见问题
相关参考文章:
RISC-V教学教案
本文列出了一些RISC-V CPU的硬件设计常见问题及解答。
1.1.GPIO如何与外设信息交流?UART如何与存储器交流?
GPIO是众多外设的一个,UART也是外设。I2C, SPI ,PWM ,千兆网等模块也是经常用到的外设,由于当前CPU V2.01中没有讲到总线结构,因此这些外设模块包括GPIO,计时器中断都在LSU中实现的,之后都会被挂到总线上,由其仲裁,模块之间会分开来。总线结构的设计如图1所示,可以看到所有的外设模块都是通过总线与LSU连接。
图1 RISC-V CPU总线设计
使用UART与程序空间交互,使调试更加方便(V2.01版本的CPU没有JTAG调试模块)。这里的UART算是特殊用法。一般写程序,程序编译成机器码的过程都是在计算机完成的,UART将编译好的机器码搬到开发板上去,作为桥梁,把程序下载到CPU存储器中,让CPU跑起来。
1.2.程序空间除了放置程序,还可以放置哪些信息?
程序空间除了放置程序,还可以放置数据,详情可以见RISC-V C语言编程1(3)链接器linker script中如何将数据和代码段放到相应的位置上。在RUN_UART 的测试程序中有关于字符串在汇编语言编程中的使用:
LUI a5, %hi(msg)//将字符串所在的地址的高位放进a5 ADDI a0, a5, %lo(msg)//将完整的字符串地址放进a0寄存器(低位加高位) . . . .section .rodata//section为关键字,ro表示read only,定义成只可读的数据端,在链接器脚本文件中被放到ITCM msg: .string "This is a call function program. \n"//定义字符串,ASCII表的一个字母/数字/符号都是一个字节(8 bit)
反汇编中该字符串的位置:
Contents of section .rodata: 80000078 54686973 20697320 61206361 6c6c2066 This is a call f 80000088 756e6374 696f6e20 70726f67 72616d2e unction program. 80000098 200a00 ..
1.3.存储在CPU里的程序是不是反汇编后的指令代码?
CPU中存储的不是反汇编后的代码,而是机器码。也就是汇编语言程序经过编译后形成的机器编码,其格式是2进制的32-bit 代码。正常编写代码的过程是写汇编指令/C语言,编译器和/或汇编器将其编译成机器码。而反汇编是将生成的机器码反向翻译成汇编指令。
1.4.`ifdef SIM等宏的定义在哪里?
`ifdef SIM宏的定义放在在如图2所示的位置:
图2 `ifdef SIM宏
它的定义主要用于仿真,因为在实际硬件中,可能会有一些延迟,在这个宏中可以定义仿真的延迟,比如在每个触发器D端到Q端加上1 ns的延时,使其更符合真实情况。
1.5.LSU中分配的空间是系统内存吗?还是程序运行空间?
LSU理论上可以访问32-bit的任何空间,这里可以理解为存储器和外设。关于系统内存的概念,在计算机系统中是和硬盘相对的。一般来说,硬盘在断电后仍然能存储数据,但是速度很慢,而内存的速度非常快。CPU中有很多程序是不能在硬盘上运行的,所以在系统上电后,一般将硬盘里的内容加载到内存上运行。
这里再复习一下冯诺依曼和哈弗结构的概念(详情点击这里)。对冯诺依曼架构而言,数据空间和指令空间都是放到一起,只有一个PC,访问所有的地址。也就是说在访问数据时,无法同时再用PC去推进指令;哈佛结构是指数据空间和指令空间分开,分别用D_PC和I_PC来访问独立的空间。这里实现的RISC-V CPU,在地址上将指令空间和数据空间排在一起,但是访问的指针是不同的,如图3(详情见地址图),基本上为哈佛结构,也就是说,一般情况下,I_PC只访问指令,而D_PC访问数据和外设。
图3 指令空间(ITCM)和数据空间(DTCM)分开