MyFPGA Forum

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 236|回复: 11

《RISC-V on T-Core 》课程FAQ

[复制链接]
发表于 2020-8-21 09:47:07 | 显示全部楼层 |阅读模式
本帖最后由 Doreen 于 2020-9-17 14:09 编辑

第一讲

1. E203使用的是ITCM,在FPGA上部署的话,那么程序是怎么进到ITCM里的呢?难道说是用Quartus初始化内存重新综合然后烧录进去吗?固化在FLASH中的程序,运行都是读到内存中运行,还是直接在FLASH中进行?

答:可以通过JTAG接口,使用openocd 进行转换到jtag, 然后可以选择在线运行(直接把控制程序下载到ITCM),或者选择烧录QSPI(可以类比其他软核的开发)E203复位后 可以从 bootrom 重启 或者 QSPI Flash的地址重启。bootrom是 verilog代码实现的,如果要改 需要每次编译。从QSPI Flash重启的话,可以通过openocd 工具来烧录,所以quartus工程就不用动了。 

另外这里说的QSPI FLash 是说的接在 RISC-V SoC系统 QSPI 控制器上的,T-Core上是独立的一片。MAX10 FPGA虽然是MAX系列,但实际是FPGA架构,用内嵌的flash的方式实现能固化。
其他FPGA系列,如需共用flash,那涉及到两个controller的共用(FPGA的AS模式是内部的),所以在开发阶段独立flash的还是更方便些。

QSPI Flash 支持 XIP模式,可直接在Flash内运行。至于是直接运行还是搬移到ITCM中运行取决于 引导代码是否有搬移判断和实现(汇编代码从QSPI Flash 往ITCM搬,然后跳转到ITCM,或直接地址在QSPI Flash的地址中)

2. E203可以移植到其他开发板吗?怎么在T-Core以外的FPGA开发板上开发RISC-V?

答:E203可以移植到任意一款FPGA,只要FPGA容量大小足够您的设计。把相应的功能用管脚分配放到自己设计的板子上。
硬件的主要考量:
1. 资源足够(20K LE 以上)
2. 额外的RISC-V调试器(如USB Blaster I/II)
3. QSPI Flash(用于固化RISC-V程序,Flash不是必须的,可以下载的时候,只link到 ITCM中,但是每次需要下载)

具体实现: RISC-V的 JTAG 是 软核的外接pin,可以是分配到FPGA普通IO管脚。然后直接使用杜邦线从GPIO引出去外接 RISC-V JTAG下载器 (如 UBT)。

PS:如果开发板上预留有外接USB Blaster 10-pin的接口,不建议用户用此接口来做RISC-V JTAG接口, 因为它是直接链接到 FPGA 专用的 JTAG上,和 on-board FPGA jtag是 二选一的关系。如果改动此接口, 在 RISC-V 烧录软核pof 之前,会存在JTAG chain broken的情况。


3. 请问蜂鸟E203是不是有外扩的设备总线,以便于将用户的IP集成到处理器上?

答:
(1) E203使用自定义ICB协议总线,用户IP可以在私有设备总线上进行集成;
图片1.png

(2)另外就是扩展自定义指令集的方式,如我们会有一讲协处理器,自定义指令矩阵乘法。

4. 有没有e203移植后的源码?

答:提供 T-Core上移植好的源码,请联系友晶技术支持获取资料。
 楼主| 发表于 2020-8-21 10:39:37 | 显示全部楼层
本帖最后由 Doreen 于 2020-8-21 11:04 编辑

第二讲

1. 第二讲里面这些ALU实现的代码与C语言有什么区别?

答:第二讲的ALU实现是用的Verilog语言,Verilog语言是硬件描述语言,用于RISC-V内核的设计。C语言写应用程序语言用于RISC-V嵌入式开发。
可以参考这个图:
clipboard.png

2. 不理解高级语言与底层之间的过程关系,比如fprinft函数,编译器是怎么编译成和宿主机交互的机器码的呢?
答:C语言写好后,是由编译器翻译成RISC-V对应的机器码,这样就可以跟RISC-V处理器进行交互了。具体的过程是编译器去翻译,大致流程可以参考这个图:
clipboard1.png
我们会有一讲讲述环境搭建, 会提到 Eclipse,gcc, openocd等,这些就可以讲C代码编译到对应的机器码。


3.  在讲到普通ALU子模块的时候,为啥这里与上一个~nop?
clipboard2.png
答:
nop 是空指令,不需要运算,只会占用一个时钟周期。
在RISC-V中没有nop这条指令,是通过 addi x0,x0,0 实现的。所以在alu资源请求的时候,会请求加法,而nop不需要实际运算,所以在请求加法资源的时候 用 &(~nop)去除一下nop指令的情况。

4.  可否分享下E203代码链接?

答:
1.  开源的E203代码链接:https://github.com/SI-RISCV/e200_opensource
2.  基于T-Core的版本可在这里下载:

5. Nios II 好像才2千个逻辑资源左右,那这个RISC-V要这多少资源?

答:RISC-V也分规模的 少的也有两千多的,E203的SoC需要大概18K LE ,其包含 CPU 和外设等等所有的实现, 如果是只算CPU的话大概 占7,8K逻辑资源的样子。



6. 移植e203到pynq那个开发板上,显示io不够怎么办?

答: Intel FPGA的话,可以例化SoC顶层的时候,只把需要往IO上拉的才放到顶层的 port list(这些去设置电压和locaction).
如果确实全部需要,quartus的qsf中也可以设置 virtual pin(只是解决报错)
Xilinx的开发流程我们不怎么了解。


 楼主| 发表于 2020-8-21 10:40:03 | 显示全部楼层
第三讲
1. RISC-V架构跟MIPS架构是否很相似?

答:是的,RISC-V 跟MIPS 虽然是不同的指令架构,但是都是精简指令集,是有一定相似性的。RISC-V是基于前面众多指令集架构而设计优化出来的,具体差异可以阅读 大卫.帕特森等人撰写的《计算机组成与设计》的两个版本(分别为 mips版和RISC-V版)的书。

2. 为什么数据通路的下一PC值是+4 而不是+1呢?

答:存储器以字节为单位编址,32位指令的一条指令是四字节。需要说明的是RISC-V 也可以支持压缩指令集, 压缩指令集的指令编码是16位,这时下一PC值是+2。

3. 对于单指令周期的数据通路,指令需要几个周期完成?

答:单指令周期中,每个指令是在一个周期内完成。因为时钟周期对所有指令等长,因此时钟周期要由执行时间最长的那条指令决定,以此确保每条指令在一个周期内都能完成。相较于流水线,单指令周期的时钟频率会比较低。

4.第三讲讲解的代码是将E203改成了单周期吗?

答:本讲讲的是单指令周期数据通路,不过代码解析用的是E203的二级流水线的代码,这是因为单指令周期数据通路和流水线数据通路基本类似,为了保证课程的连贯性,所以直接拿E203的二级流水线代码进行讲解的。

5.本讲中提到部分指令不需要完整指令流程,所以这时不参与的模块控制信号为高阻态吗?

答:有些指令不需要所有的模块参与,这时候不参与的模块的控制信号是 dont care 的,控制信号 可以是0或1 。但是在FPGA内部信号一般要避免高阻态,严谨的说法确实是 dont care。

6. 为什么J-type指令会有写回PC+4的操作呢?

答:这个是RISC-V 架构指令集定义的,可以直接参阅RISC-V基金会网站的riscv-spec文档里面的定义。文档我们也有上传到 http://www.myfpga.org/discuz/for ... &extra=page%3D1
 楼主| 发表于 2020-8-21 10:40:29 | 显示全部楼层
本帖最后由 Doreen 于 2020-8-21 11:07 编辑

第四讲

1. 请问这里RAW 和WAR是不是 写反了?

1111.png
答:这里没有写反呢,WAR就是第一条指令还没来得及读,该寄存器就被第二条指令写入了新值所导致的冒险。RAW是第一条指令还没来得及写,该寄存器就被第二条指令给读了,此时读的是寄存器旧值,而它本应该读取第一条指令写入的新值的。

2. 为啥经典流水线第五级没有流水线寄存器呢?

答:是的,经典五级流水线第五级没有流水线寄存器,而是直接在时序模块中。大家可以参阅David Patterson等人撰写的书籍《Computer Organization and Design RISC-V Edition》,里面正好有这样解释 “Notice that there is no pipeline register at the end of the writeback stage. All instructions must update some state in the processor—the register file, memory, or the PC—so a separate pipeline register is redundant to the state that is updated。”

3.  请问这里dret是什么?

11111.jpeg
答:dret 是调试造成的冲刷,dret 指令会触发处理器退出调试模式。

 楼主| 发表于 2020-8-21 10:40:58 | 显示全部楼层
本帖最后由 Doreen 于 2020-8-21 11:16 编辑

第五讲

1. 跟 Cache 相比,TCM 容量可以做很大吗?

答:Cache 是一种高速缓存,而 TCM 是为了弥补 Cache 访问的不确定性,而增加的片上高速存储器;TCM 的性能和 Cache 的性能相当,二者的速度都比较快,一般是用 SRAM 来实现,而 SRAM 的集成度较低,与 DRAM 相比,相同容量的 SRAM 他的体积要大很多,而且价格比较高,所以 TCM 和 Cache 都不会做很大。

2.段表和页表都是必须的吗,还是选择其一就可以?

答:段表和页表都是虚拟地址到物理地址转换的映射表,段表是分段管理中虚拟地址到物理地址转换关系的表,而页表是分页管理中地址转换关系的表;分段管理和分页管理是两种不同的管理方式,可以按照情况选用其一即可。

3. 为什么 ITCM 和 DTCM 的位宽设置的不一样,一个是 64 位的,一个是 32 位的?

答:E203 将 ITCM 设置为 64 位的原因是,假如连续取两次 32 位的指令时,只需要发起一次 ITCM 读取,更省功耗。

4. 在 ITCM_CTRL 和 DTCM_CTRL 中都用了仲裁器,这个仲裁器的作用是什么?

答:仲裁器是为了仲裁不同 master 发起的访问,这些访问会有 IFU 发起的、预留的 external 发起的、LSU 发起的;比如假设 IFU/LSU 同时都访问 ITCM,由于 LSU是在 IFU 阶段之后的,那 LSU 执行的指令肯定是在 IFU 执行的指令之前的,所以 LSU 总线的优先级就会高于 IFU 总线。

5. QSPI0 Flash 是怎样连接到系统总线的,从 QSPI0 Flash 中读出一个指令的延迟会不会很长?

答:IFU/LSU 都可以访问 BIU,而 BIU 通过如下通道来访问 QSPI0 Flash:BIU总线 -> BIU 的存储器总线 ->  icb 1to8 分发器 -> QSPI0 Flash;
QSPI0 Flash 有 XIP(eXecute In Place,芯片内执行) 模式,可以直接在 Flash 中运行代码;也可以先把代码搬到 ITCM 中,这样就效率高些了;一般情况下,QSPI0 Flash 只用作固化代码。
 楼主| 发表于 2020-8-21 10:41:25 | 显示全部楼层
本帖最后由 Doreen 于 2020-8-21 11:08 编辑

第六讲

1. 请问 RISC-V 的中断可以嵌套吗?
答:可以,RISC-V 定义硬件响应中断后会关闭全局中断,这时可以用软件来实现。CSR 寄存器可读可写,通过软件改写寄存器值达到再次打开全局中断。

2. 中断的地址怎么传递到PC寄存器的?

答:E203 只支持查询中断,也就是所有的异常和中断都跳转到 mtvec 入口基地址处。
然后由程序中去查询 mcause 寄存器记录的具体原因,根据 mcasue 编号跳转到不同子函数处理不同原因的异常。

3. 软件如何知道是GPIO还是串口的中断?

答:这个需要去了解RISC-V架构定义的PLIC模块。
PLIC 模块为每个中断源分配了一个独一无二的编号(ID),PLIC 理论上可以支持 1024 个中断源,软件可以根据 PLIC 模块传递过来的中断 ID 来区分是哪种外部中断。目前 E203 只使用到了这些中断源:
5555.png
中断源优先级也是在 PLIC 模块中进行设置。更多详细内容可以去参阅特权架构文档的第七章节 PLIC 模块的介绍。

如果CSR寄存器是有一个独立地址的话,那么指令怎么对CSR寄存器进行访问呢?
E203的 ALU 中有一个 CSR_CTRL 的子模块,会 发起对 CSR 的写和读,软件可以通过 CSR指令读写(就是 csr_ctrl 实现的通道)。硬件(交付模块)也会自动更新它们。



 楼主| 发表于 2020-8-21 10:41:54 | 显示全部楼层
第七讲

1. 如果是自定义指令,GCC工具是否不支持?

答:不支持,需要对 GCC 进行修改才能支持;第七讲主要介绍 RISC-V 自定义指令的硬件修改,之后会有专门一讲介绍软件的修改和 dot 指令的 demo。

2. 是不是尽量不要选用 resreved 的编码空间?
答:是的,在自定义指令的时候尽量不要选用 reserved 的编码空间,因为它的指令标准会被更新,更新后可能会使用到这个编码空间,如果你刚好也选用了这个编码空间,那就会发生冲突。

3. 假如在 E203 中新增一条 ans = a % b 的组合逻辑型自定义指令,需要对数据通路中的哪些阶段进行修改呢?
答:因为 ans = a % b 是两个源操作数寄存器和一个目的寄存器的类型的指令,所以可以直接借用 R-type 指令的数据通路,因此只需要对译码过程和 ALU 进行修改,也就是添加 ans = a % b 指令的译码、并在 ALU 中添加该指令的请求和实际运算的实现。
 楼主| 发表于 2020-8-21 10:42:20 | 显示全部楼层
第八讲
1.从本讲中的流水灯实验现象可知:从QSPI Flash 启动的应用程序,T-Core掉电重启后还可以看到流水灯。那如果下载时只想看一下现象,而不想烧录到QSPI Flash,应该如何做呢?

答:
通过切换 GNU RISC-V Cross Linker 的 link文件,将 link_flash.lds文件切换至 link_itcm.lds 文件即可。
link 脚本中的内容是包括 init,text,data等等程序片段及设定对应的存储器。所以 link_flash/link_itcm两个link脚本可以切换固化 Flash 和只在 ITCM 中运行两种方式。link_itcm 的原理是通过 OpenOCD 将程序加载进 ITCM 中,并跳转到 ITCM 执行,由于 ITCM 是 sram 架构,所以掉电后程序就丢失了。从而实现了只看一下现象而不固化程序的目的。
 楼主| 发表于 2020-8-21 10:42:46 | 显示全部楼层
第九讲

1. 第九讲所说的中断处理,是指当中断产生的时候直接跳到handle_m_ext_interrupt这个函数,然后由在这个函数中软件判断中断源,再跳转至对应的终端服务函数的吗?

答:软件在中断响应的时候会进入到 handle_trap 函数,传入的参数有 mcause mepc;
根据 mcasue 如果是外部中断就跳转到  handle_m_ext_interrupt 函数,如果是 定时器中断,跳转到 handle_m_time_interrupt。init.c 里面是定义了两个 weak 的 ext 和 time 函数。
所以我们可以在用户代码中,编写同名的函数,就会进入到这边,是一层层的从 mtvec 跳转到用户代码中来的。

也就是说,这里中断的位置只有一个,不是一个固定的中断向量表,而是完全由软件实现的?
正是如此。目前的 CPU 设计中只实现了支持查询中断。不管中断还是异常都往 mtvec 的地址跳。根据 mcasue 再来细分。
 楼主| 发表于 2020-8-21 10:43:03 | 显示全部楼层
第十讲

1. 在pwm实验中,pwmcmp0设置为9,那pwm波的周期是多少?

答:当设置pwmcfg寄存器的pwmzerocmp域为1时,计数值比较器寄存器pwms的值等于pwmcmp0设置的值时,计数值自动清零,重新计数;因此,pwm波的周期为10个计数时间(计数值范围为0~9)。
 楼主| 发表于 2020-8-21 10:43:23 | 显示全部楼层
本帖最后由 Doreen 于 2020-8-21 11:12 编辑

第十一讲

1. 在进行自定义指令时,操作码的设定有什么讲究吗?

答:自定义指令的操作码是有讲究的,需要使用自定义型(custom)或保留型(reserved),并且尽量不要选用保留型,因为它的指令标准会被更新,具体的可以参考第七讲的内容
33333.png

2. GCC 内联汇编中 Clobber List 中的寄存器怎么选用呢?

答:有一些指令会影响硬件寄存器,那我们就需要把这些寄存器放到 Clobber List 中,并且不应该在 Clobber List 中列出输入输出寄存器。
所以,在使用内联汇编的方式调用 dot 指令时,我们需要在 Clobber List 中列出 x10 ~ x17 这 8 个寄存器(如绿框所示);另外,由于 a0 ~ a7 是输入操作数,output 是输出操作数,所以这两项(如红框所示)不需要放在 Clobber List 中。
3333333.png
 楼主| 发表于 2020-8-21 10:43:43 | 显示全部楼层
本帖最后由 Doreen 于 2020-8-21 11:26 编辑

第十二讲
1. FreeRTOS提供了5种 内存管理方式,请问本次课程我们用的哪种任务管理方式?

答: 5种方式根据其特性各有其应用场景,我们用的是heap_4.c。

2. 创建的2个任务里面用到LED0  LED1,那LED的掩码位是怎么确定的呢?

答:FPGA的LED是 连接到RISC-V GPIO 对应位,具体的我们在第九讲有讲到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2020-10-1 09:35 , Processed in 0.063100 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表