Menu Close

RISC-V 硬件设计常见问题及解答(1)

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连接。

 

cpu bus

图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所示的位置:

`ifdef SIM宏

图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)分开

Posted in RISC-V, RISC-V IPcore设计, RISC-V 教案, 教材与教案, 文章

发表评论

相关链接