本系列主要就蜂鸟FPGA开发板及蜂鸟JTAG下载器进行讲解说明,其中包括:
蜂鸟FPGA开发板全知道篇2:快速上手介绍
蜂鸟FPGA开发板全知道篇3: 开源SoC简介
蜂鸟FPGA开发板全知道篇4: 移植RTOS
本篇《蜂鸟FPGA开发板全知道篇2:快速上手介绍》将会分为:
《蜂鸟FPGA开发板全知道篇2:快速上手介绍(上)》
《蜂鸟FPGA开发板全知道篇2:快速上手介绍(中)》
《蜂鸟FPGA开发板全知道篇2:快速上手介绍(下)》
此篇为《蜂鸟FPGA开发板全知道篇2:快速上手介绍(上)》,请持续关注,后续将会持续更新。
1 运行Verilog仿真测试
1.1 E203开源项目的代码层次结构
1.2 E203开源项目的测试用例(Self-Check TestCase)
1.2.1 riscv-tests自测试用例
1.2.2 编译ISA自测试用例
1.3 E203开源项目的测试平台(TestBench)
1.4 在Verilog TestBench中运行测试用例
2 蜂鸟E203开源SoC
3 搭建FPGA原型平台
3.1 FPGA开发板和项目介绍
3.2 生成mcs文件烧写FPGA
3.3 JTAG调试器
3.4 FPGA原型平台DIY总结
4 运行和调试软件示例
4.1 HBird-E-SDK简介
4.1.1 HBird-E-SDK代码结构
4.2 使用HBird-E-SDK开发和运行示例程序
4.3 使用GDB和OpenOCD调试示例程序
5 运行更多示例程序和Benchmarks
6 移植和运行FreeRTOS
7 Windows IDE开发工具
由于篇幅过长,详情请参见《手把手教你设计CPU:RISC-V处理器篇》第十九章。
图1-1 蜂鸟E203开源项目 Github网址
蜂鸟E203开源项目的平台托管于著名网站Github。E203开源的项目网址为https://github.com/SI-RISCV/e200_opensource如图1-1所示。
在该网址的e200_opensource目录下,文件的层次结构如下所示。rtl目录下包含了大量的源代码,主要为E203 Core的Verilog RTL源代码,和配套的SoC组件文件。E203内核的RTL详细请参见《手把手教你设计CPU——RISC-V处理器篇》,配套的SoC的信息和代码分析请参见《蜂鸟FPGA开发板全知道篇3: 开源SoC简介》(请持续关注,后续即将发布)。
上节中所述的riscv-tools与RISC-V架构正式维护的riscv-tools项目同名(Github网址https://github.com/riscv/riscv-tools)。正式维护的riscv/riscv-tools目录下包括了所有的RISC-V所需的软件工具,其中主要是GNU ToolChain(源文件超过1G,因此下载需要相当长的时间)。
而e200_opensource目录(https://github.com/SI-RISCV/e200_opensource)下的riscv-tools目录仅仅包含编译Spike所需的源代码和riscv-tests,我们放置该目录于此是因为正式维护的riscv/riscv-tools在不断的更新,而e200_opensource下的riscv-tools仅需用于支持运行自测试用例(Self-Check TestCase),因此无需使用最新版本,并且进行了适当的修改(譬如,在riscv-tests里面添加了更多的测试用例和生成更多的log文件),同时还去除了GNU ToolChain,使得文件夹的大小很小,方便用户快速的下载使用。
1.2.1 riscv-tests自测试用例
所谓自测试用例(Self-CheckTestcase)是一种具备自我检测运行成功还是失败的测试程序。riscv-test是由RISC-V架构开发者维护的项目,这里面有一些测试处理器是否符合指令集架构定义的测试程序(https://github.com/riscv/riscv-tests/tree/master/isa),这些测试程序均由汇编语言编写。
这些汇编测试程序里面用某些宏定义组织成程序点,测试指令集架构中定义的指令,如图1-2所示,测试add指令(源代码文件为isa/rv64ui/add.S),通过让add指令执行两个数据的相加(譬如0x0000003和0x00000007),设定它期望的结果(譬如0x0000000a)。然后使用比较指令加以判断,假设add指令的执行结果的确与期望的结果相等则程序继续执行,假设与期望的结果不想等则程序直接使用jump指令跳到TEST_FAIL地址。假设所有的测试点都通过了,则程序一直执行到TEST_PASS地址。
图1-2 riscv-tests测试用例add.S片段
在TEST_PASS的地址,程序将设置x3寄存器的值为1,而在TEST_FAIL的地址,程序将x3寄存器的值设置为非1值。因此最终可以通过判断x3的值来界定程序的运行结果到底是成功了还是失败了。
1.2.2 编译ISA自测试用例
riscv-tests中的这些指令集架构(ISA)测试用例都是使用汇编语言编写,为了在仿真阶段能够被处理器执行,需要将这些汇编程序编译成二进制代码。在e200_opensource的以下目录(generated文件夹)下,已经预先上传了一组编译成的可执行文件和反汇编文件,以及能够被Verilog的readmemh函数读入的文件。
反汇编文件(譬如rv32ui-p-addi.dump)的内容如图1-3所示。
图1-3 反汇编文件内容片段
Verilog 的readmemh函数能够读入的文件(譬如rv32ui-p-addi.verilog)内容如图1-4所示。
图1-4 Verilog 的readmemh函数可读入文件内容片段
如果用户想修改汇编程序的源代码并需要重新编译,请参见《手把手教你设计CPU——RISC-V处理器篇》第17章了解详细步骤。
在e200_opensource的如下目录已经创建了一个简单的由Verilog编写的TestBench测试平台。
在测试平台中主要的功能如下:
例化DUT文件,生成clock和reset信号。
根据运行命令解析出测试用例的名称,并使用Verilog的readmemh函数读入相应的文件(譬如rv32ui-p-addi.verilog)内容,然后使用文件中的内容初始化ITCM(由Verilog编写的二维数组充当行为模型),如图1-5所示。
在运行结束后分析该测试用例是否执行成功,在Testbench的源文件中对x3寄存器的值进行判断,如果x3的值为1,则意味着通过,向终端上将打印PASS字样,否则将打印FAIL字样。如图1-6所示。
图1-5 使用Verilog的readmemh函数读入文件初始化ITCM
图1-6 Testbench中打印测试用例的结果
假设用户想使用E203源代码运行基于Verilog的仿真测试程序,可以使用如下步骤进行。
// 步骤一:准备好自己的电脑环境,可以在公司的服务器环境中运行,如果是个人用户,推荐如下配置:
(1)使用VMware虚拟机在个人电脑上安装虚拟的Linux操作系统。
(2)由于Linux操作系统的版本众多,推荐使用Ubuntu16.04版本的Linux操作系统。
有关如何安装VMware以及Ubuntu操作系统本文不做介绍,有关Linux的基本使用本文。
也不做介绍,请用户自行查阅资料学习。
// 步骤二:将e200_opensource项目下载到本机Linux环境中,使用如下命令:
git clone https://github.com/SI-RISCV/e200_opensource.git
// 经过此步骤将项目克隆下来,本机上即可具有如前文所述完整的e200_opensource目录文件夹,假设该目录为
,后文将使用该缩写指代。
// 步骤三:编译RTL代码,使用如下命令:
cd
/vsim // 进入到e200_opensource目录文件夹下面的vsim目录。
make install CORE=e203
// 运行该命令指明需要为e203进行编译,该命令会在vsim目录下生 成一个install子文件夹,在其中放置所需的脚本,且将脚本中的关键字设置为e203。
make compile
// 编译Core和SoC的RTL代码。
//注意:在此步骤之中,编译Verilog代码需要使用到仿真器工具,在github上的Makefile中使用的是免费的iverilog工具,如果需要使用商业EDA的用户需要自行修改Makefile中的内容,如图1-2所示。
//对于免费的iverilog工具如何安装请用户在互联网上自行搜索。
// 步骤四:运行默认的一个testcase(测试用例),使用如下命令:
make run_test
// 注意:在此步骤中,运行仿真需要使用仿真器工具,在github上的Makefile中此部分空缺,实际运行的是”echoPASS”命令打印一个虚假的PASS到log文件中。用户需要使用真正的仿真器运行仿真得到真实的运行结果, 如图1-7所示。
// 注意:makerun_test将执行e200_opensource/ riscv-tools/riscv-tests/isa/generated目录中的一个默认testcase,如果希望运行所有的回归测试,请参见步骤五。
// 步骤五:运行回归(regression)测试集,使用如下命令:
make regress_run
// 注意:这使用e200_opensource/riscv-tools/riscv-tests/isa/generated目录中testcases,逐个的运行testcase。
// 步骤六:查看回归测试结果:
make regress_collect
// 该命令将收集步骤五中运行的测试集的结果,将打印若干行的结果,每一行对应一个测试用例,如果那个测试用例运行通过,那一行则打印的PASS,如果运行失败,那一行则打印的FAIL。如图1-8所示。
图1-7 编译工具的设置
图1-8 运行回归测试的结果示例
注意,以上的回归测试只是运行riscv-tests中提供的非常基本的自测试汇编程序,并不能达到充分验证处理器核的效果,因此如果用户修改了处理器的Verilog源代码而仅仅运行以上的回归测试将无法保证处理器的功能完备正确性。
此篇为《蜂鸟FPGA开发板全知道篇2:快速上手介绍(上)》,请持续关注,后续即将发布:
《蜂鸟FPGA开发板全知道篇2:快速上手介绍(中)》
《蜂鸟FPGA开发板全知道篇2:快速上手介绍(下)》
本文编辑by 新晋硅农胖夏
感兴趣的读者可以通过下面二维码关注公众号“硅农亚历山大”,了解Verilog、IC设计、CPU、RISC-V和人工智能AI相关的更多设计技巧和经验分享,注意:由于干货太多,请自备茶水。