difftest use

基于Chiplab的龙芯杯团体赛开发环境

1. 前言

Chiplab支持龙芯杯团体赛的功能测试与性能测试,有关Chiplab的完整介绍请参考CHIPLAB使用介绍

2. 目录结构

. ├── chip              SoC顶层。 │  └── soc_demo       SoC顶层代码实例。 │     ├── nscscc-team    龙芯杯SoC顶层代码。 │        ├── AMBA      包含axi3转axi4协议桥和axi跨时钟域模块 │        ├── CONFREG     confreg 模块,连接 CPU 与开发板上数码管、拨码开关等 GPIO 类设备。 │        ├── ram_wrap     包含ddr3控制器和片上SRAM的封装层,增加固定延迟设置。 │        ├── JTAG_wrap     jtag to axi master IP的封装层,用于程序下载和调试。 │        ├── uart_debug     串口下载程序模块,目前已不使用。 │        ├── xilinx_ip      Xilinx IP,包含 clk_pll、axi_crossbar_2x3。 │        ├── soc_top.v  SoC 的顶层。 │        └── soc_config.vh    配置SoC为功能测试或性能测试的头文件。 │     ├── loongson    龙芯实验箱SoC顶层代码。 │     ├── Baixin      百芯开发板SoC顶层代码。 │     └── sim       仿真SoC顶层代码 ├── fpga              综合工程。 │  ├── nscscc-team        龙芯杯fpga工程及所需嵌入式软件。 │     ├── run_vivado      Vivado工程目录 │        ├── create_project.tcl   Vivado工程创建脚本 │        ├── run_func_test.tcl   运行功能测试脚本 │        ├── run_allbench.tcl   运行性能测试脚本 │        └── jtag_axi_master.tcl   JTAG程序下载脚本 │     ├── constraints      约束文件 │     └── testbench      仿真测试文件 │  ├── loongson        龙芯实验箱综合工程。 │     ├── 2019.2    对应Vivado 2019.2版本。 │     └── 2023.2    对应Vivado 2023.2版本。 │  └── Baixin          百芯开发板综合工程。 ├── IP                SoC IP。 │  ├── AMBA         总线 IP。 │  ├── APB_DEV       APB协议通信设备。 │     ├── URT       UART设备控制器。 │     └── NAND     NAND设备控制器。 │  ├── AXI_DELAY_RAND  随机延迟注入。 │  ├── AXI_SRAM_BRIDGE  AXI协议 -> SRAM接口转换。 │  ├── BRIDGE        1x2桥接模块。 │  ├── DMA          DMA逻辑,用于设备作为master访问内存。 │  ├── SPI           SPI Flash设备控制器。 │  ├── MAC          MAC设备控制器。 │  ├── CONFREG       用于访问开发板上数码管、拨码开关等外设以及特殊寄存器。 │  ├── myCPU        处理器核逻辑。 │  └── xilinx_ip        Vivado平台所创建的IP。 │     ├── 2019.2    对应Vivado 2019.2版本。 │     └── 2023.2    对应Vivado 2023.2版本。 ├── sims              运行仿真以及存放testbench源码。 │  └── verilator        以verilator仿真工具为基础。 │     ├── run_prog    测试程序运行目录,包括func、性能测试程序、内核等。 │     ├── run_random   随机指令序列运行目录。 │     └── testbench    testbech源码,提供仿真运行、在线比对、设备模拟等功能。 ├── software            测试用例。 │  ├── bsp          板级支持包。 │  ├── examples          示例程序。 │     ├── func    功能测试,验证处理器核设计是否与指令手册一致。 │     ├── nscscc_func          龙芯杯功能测试,仅含Makefile,使用func/func_src的源文件。 │     ├── nscscc_perf          龙芯杯性能测试,包含20个性能测试程序。 │     ├── hello_world        基础测试程序。 │     ├── coremark        coremark性能测试程序。 │     ├── dhrystone        dhrystone性能测试程序。 │     ├── fireye        fireye测试程序。 │     ├── c_prg        C程序测试。 │     ├── rtthread          rtthread嵌入式实时操作系统。 │     ├── linux          提供内核启动的支持。 │     ├── random_boot     为随机指令序列的运行提供支持。 │     └── random_res      存放随机指令序列。 └── toolchains          chiplab运行所需工具。    ├── loongarch32r-linux-gnusf-*   gcc工具链。    ├── nemu         nemu模拟器,用于在线实时比对。    ├── picolibc    picolibc库,用于编译C程序。    └── newlib    newlib C库,用于编译C程序。

3. 环境下载与安装

3.1 下载本仓库

因包含submodule,需要将submodule的特定commit也一并clone下来,注意不要在中文目录下clone

git clone --recurse-submodules -j4 https://gitee.com/loongson-edu/chiplab

3.2 toolchains工具下载

toolchains这个目录是存在的,只不过里面是空的,需要用户自行下载,详情请参考toolchains/README.md

3.3 项目所需第三方工具安装

以Ubuntu (Windows 10+ WSL2)为例:

<span style="background-color:#dadada"><span style="color:#1f0909"> # 终端运行
 sudo apt install verilator gtkwave #verilator version 4.224 (loongarch64 4.222+)    </span></span>

vivado 2023.2 可以直接安装在windows上

4. 实验步骤

4.1 基于verilator进行功能测试的前仿真

4.1.1 参数设置

设置CHIPLAB_HOME系统变量

<span style="background-color:#dadada"><span style="color:#1f0909"> # 终端运行
 export CHIPLAB_HOME="your own chiplab pwd address"</span></span>
4.1.2 替换myCPU

IP/myCPU中存放的是处理器核代码,对外的接口和核顶层模块名称固定。该环境默认处理器核已实现AXI总线。

<span style="background-color:#dadada"><span style="color:#1f0909"> <span style="color:#770088">module</span> <span style="color:#000000">core_top</span><span style="color:#999977">(</span>
     <span style="color:#770088">input</span>           <span style="color:#000000">aclk</span>,
     <span style="color:#770088">input</span>           <span style="color:#000000">aresetn</span>,
     <span style="color:#770088">input</span>    <span style="color:#999977">[</span> <span style="color:#116644">7</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">intrpt</span>, 
     <span style="color:#aa5500">//AXI interface </span>
     <span style="color:#aa5500">//read reqest</span>
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">arid</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span><span style="color:#116644">31</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">araddr</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">7</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">arlen</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">2</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">arsize</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">1</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">arburst</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">1</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">arlock</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">arcache</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">2</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">arprot</span>,
     <span style="color:#770088">output</span>          <span style="color:#000000">arvalid</span>,
     <span style="color:#770088">input</span>           <span style="color:#000000">arready</span>,
     <span style="color:#aa5500">//read back</span>
     <span style="color:#770088">input</span>    <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">rid</span>,
     <span style="color:#770088">input</span>    <span style="color:#999977">[</span><span style="color:#116644">31</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">rdata</span>,
     <span style="color:#770088">input</span>    <span style="color:#999977">[</span> <span style="color:#116644">1</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">rresp</span>,
     <span style="color:#770088">input</span>           <span style="color:#000000">rlast</span>,
     <span style="color:#770088">input</span>           <span style="color:#000000">rvalid</span>,
     <span style="color:#770088">output</span>          <span style="color:#000000">rready</span>,
     <span style="color:#aa5500">//write request</span>
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awid</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span><span style="color:#116644">31</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awaddr</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">7</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awlen</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">2</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awsize</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">1</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awburst</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">1</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awlock</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awcache</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">2</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">awprot</span>,
     <span style="color:#770088">output</span>          <span style="color:#000000">awvalid</span>,
     <span style="color:#770088">input</span>           <span style="color:#000000">awready</span>,
     <span style="color:#aa5500">//write data</span>
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">wid</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span><span style="color:#116644">31</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">wdata</span>,
     <span style="color:#770088">output</span>   <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">wstrb</span>,
     <span style="color:#770088">output</span>          <span style="color:#000000">wlast</span>,
     <span style="color:#770088">output</span>          <span style="color:#000000">wvalid</span>,
     <span style="color:#770088">input</span>           <span style="color:#000000">wready</span>,
     <span style="color:#aa5500">//write back</span>
     <span style="color:#770088">input</span>    <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">bid</span>,
     <span style="color:#770088">input</span>    <span style="color:#999977">[</span> <span style="color:#116644">1</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">bresp</span>,
     <span style="color:#770088">input</span>           <span style="color:#000000">bvalid</span>,
     <span style="color:#770088">output</span>          <span style="color:#000000">bready</span>,
 ​
     <span style="color:#aa5500">//debug</span>
     <span style="color:#770088">input</span>           <span style="color:#000000">break_point</span>,<span style="color:#aa5500">//无需实现功能,仅提供接口即可,输入1’b0</span>
     <span style="color:#770088">input</span>           <span style="color:#000000">infor_flag</span>,<span style="color:#aa5500">//无需实现功能,仅提供接口即可,输入1’b0</span>
     <span style="color:#770088">input</span>  <span style="color:#999977">[</span> <span style="color:#116644">4</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span>   <span style="color:#000000">reg_num</span>,<span style="color:#aa5500">//无需实现功能,仅提供接口即可,输入5’b0</span>
     <span style="color:#770088">output</span>          <span style="color:#000000">ws_valid</span>,<span style="color:#aa5500">//无需实现功能,仅提供接口即可</span>
     <span style="color:#770088">output</span> <span style="color:#999977">[</span><span style="color:#116644">31</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span>   <span style="color:#000000">rf_rdata</span>,<span style="color:#aa5500">//无需实现功能,仅提供接口即可</span>
 ​
     <span style="color:#aa5500">//debug info</span>
     <span style="color:#770088">output</span> <span style="color:#999977">[</span><span style="color:#116644">31</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">debug0_wb_pc</span>,
     <span style="color:#770088">output</span> <span style="color:#999977">[</span> <span style="color:#116644">3</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">debug0_wb_rf_wen</span>,
     <span style="color:#770088">output</span> <span style="color:#999977">[</span> <span style="color:#116644">4</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">debug0_wb_rf_wnum</span>,
     <span style="color:#770088">output</span> <span style="color:#999977">[</span><span style="color:#116644">31</span>:<span style="color:#116644">0</span><span style="color:#999977">]</span> <span style="color:#000000">debug0_wb_rf_wdata</span>
 <span style="color:#999977">)</span>;</span></span>
4.1.3 仿真

仿真的工作目录位于sims/verilator/run_*,当前仅支持verilator

  • run_prog : 该工作目录下可运行func测试用例、dhrystonecoremark性能测试程序、linux以及自定义C程序。

  • run_random : 该工作目录下可进行随机指令序列测试。

具体使用方法请参考verilator仿真环境说明

4.2 基于Vivado进行功能测试和性能测试的前仿真

1)【myCPU加入】首先确保已经替换IP/myCPU中的处理器核代码

2)【编译software】发布包默认提供编译好的obj。

若希望重新编译性能测试:

<span style="background-color:#dadada"><span style="color:#1f0909"> cd $CHIPLAB_HOME/software/examples/nscscc_perf  #进入性能测试目录
 make clean                                      #清除已有编译结果
 make                                            #执行性能测试编译</span></span>

重新编译功能测试:

<span style="background-color:#dadada"><span style="color:#1f0909"> cd $CHIPLAB_HOME/software/examples/nscscc_func   #进入功能测试目录
 make clean                                       #清除已有编译结果
 make                                             #执行功能测试编译</span></span>

完成编译后,在software/examples/nscscc_func/obj目录下可以看到功能测试的编译结果

文件名解释
main.elf生成的可执行文件,属于中间文件
rom.vlogverilator仿真所需的内存初始化文件
main.bin由main.elf生成的二进制文件,包含代码、数据段,用于 vivado 前仿和上板下载
test.s对 main.elf 反汇编得到的文件,可根据其中的PC和指令码用于调试
inst_ram.mifMemory Initialization File 文件
inst_ram.coe重新定制vivado ip核 axi ram 所需的 coe 文件

在software/examples/nscscc_perf/obj的各子目录存放性能测试的编译结果

子目录解释
allbench联合编译结果。包含 20 个测试程序的源码,用于综合实
现并上板。
bitcount独立编译结果。仅包含 bitcount 测试程序。
bubble_sort独立编译结果。仅包含 bubble_sort 测试程序。
coremark独立编译结果。仅包含 coremark 测试程序。
crc32独立编译结果。仅包含 crc32 测试程序。
dhrystone独立编译结果。仅包含 dhrystone 测试程序。
quick_sort独立编译结果。仅包含 quick_sort 测试程序。
select_sort独立编译结果。仅包含 select_sort 测试程序。
sha独立编译结果。仅包含 sha 测试程序。
stream_copy独立编译结果。仅包含 stream_copy 测试程序。
stringsearch独立编译结果。仅包含 stringsearch 测试程序。
fireye_A0独立编译结果。仅包含 fireye_A0 测试程序。
fireye_B2独立编译结果。仅包含 fireye_B2 测试程序。
fireye_C0独立编译结果。仅包含 fireye_C0 测试程序。
fireye_D1独立编译结果。仅包含 fireye_D1 测试程序。
fireye_I2独立编译结果。仅包含 fireye_I2 测试程序。
inner_product独立编译结果。仅包含 inner_product 测试程序。
lookup_table独立编译结果。仅包含 lookup_table 测试程序。
loop_induction独立编译结果。仅包含 loop_induction 测试程序。
my_memcmp独立编译结果。仅包含 my_memcmp 测试程序。
minmax_sequence独立编译结果。仅包含 minmax_sequence 测试程序。

各子目录中具体编译得到的文件如下:

文件名解释
main.elf生成的可执行文件,属于中间文件
inst_data.bin由main.elf生成的二进制文件,包含代码、数据段,用于 vivado 仿真和上板下载
test.s对 main.elf 反汇编得到的文件,可根据其中的PC和指令码用于调试
axi_ram.mifMemory Initialization File 文件
axi_ram.coe重新定制vivado ip核 axi ram 所需的 coe 文件

3)【创建Vivado工程】打开Vivado,在下方的控制台Tcl Console中,首先切换目录至fpga/nscscc-team/run_vivado,再调用create_project.tcl脚本。具体命令如下:

<span style="background-color:#dadada"><span style="color:#1f0909"> cd $CHIPLAB_HOME/fpga/nscscc-team/run_vivado
 source create_project.tcl</span></span>

脚本执行完成后,再手动添加myCPU代码至工程中

4)【执行Run Linter进行RTL分析】成功建立Vivado工程后可以先运行左侧的Run Linter进行语法检查。

5)【进行功能测试仿真】

首先修改 $CHIPLAB_HOME/chip/soc_demo/nscscc-team/soc_config.vh头文件,打开 RUN_FUNC_TEST宏,关闭RUN_PERF_TEST宏。该文件还存在两个可供调整的宏SIMU_USE_PLLSIMU_USE_DDRSIMU_USE_PLL为1时使用PLL产生时钟,为0时使用仿真时钟;SIMU_USE_DDR为1时使用DDR3作为内存,为0时使用仿真SRAM模型作为内存。两者均为0时仿真速度最快,为1时更符合上FPGA板的情况。SIMU_USE_DDR为1时仿真极慢,运行stream_copy测试程序大约需要15小时,建议仅在上板与仿真不一致且怀疑访存问题时打开该宏。

完成宏的修改后在Vivado中点击Run Simulation。打开仿真界面后在控制台Tcl Console中执行下列命令,进行地址切换与调用tcl脚本执行仿真:

<span style="background-color:#dadada"><span style="color:#1f0909"> cd [get_property DIRECTORY [current_project]]
 source ../run_func_test.tcl</span></span>

功能测试包含58个测试点,应看到Vivado控制台打印信息Number 8'd58 Functional Test Point PASS!!!,证明功能测试前仿真通过。另外还可通过观察波形的方式判断仿真结果,具体可参考《CPU设计实战:LoongArch版》中func测试仿真验证结果判断

5)【进行性能测试单个测试用例仿真】

首先修改 $CHIPLAB_HOME/chip/soc_demo/nscscc-team/soc_config.vh头文件,打开 RUN_PERF_TEST宏,关闭RUN_FUNC_TEST宏。

在性能测试中,还需要注意$CHIPLAB_HOME/chip/soc_demo/nscscc-team/soc_config.vh头文件中的RUN_PERF_NO_DELAY宏。打开该宏后,可以关闭内存的延时倍增,以加快仿真。性能测试分数提交应当是关闭RUN_PERF_NO_DELAY宏的分数。

在Vivado中点击Run Simulation。打开仿真界面后在控制台Tcl Console中执行下列命令,进行地址切换、更换内存初始化文件、重新开始仿真。

<span style="background-color:#dadada"><span style="color:#1f0909"> cd [get_property DIRECTORY [current_project]]
 file copy -force ../../../../software/examples/nscscc_perf/obj/stream_copy/inst_data.bin ../inst_data.bin
 restart
 run all</span></span>

例子中给出的是执行用时较短的 stream_copy 测试用例,执行其它性能测试用例,修改该字段即可。

如果性能仿真正确运行,在控制台Tcl Console里可以看到类似如下打印信息

<span style="background-color:#dadada"><span style="color:#1f0909"> Test begin!
 …(不同程序有不同打印)
 … PASS!... (不同程序有所不同)
 …: Total Count =…(不同程序有所不同)</span></span>

6)【进行性能测试全部测试用例仿真】 可直接使用tcl脚本对性能测试所有程序执行仿真,控制台命令如下:

<span style="background-color:#dadada"><span style="color:#1f0909"> cd [get_property DIRECTORY [current_project]]
 source ../run_allbench.tcl</span></span>

看到控制台输出stringsearch测试通过后,证明所有性能测试完成。

4.3 基于Vivado进行综合实现

4.3.1 功能测试上板验证

1)功能/性能测试宏修改

首先修改 chiplab/chip/soc_demo/nscscc-team/soc_config.vh头文件,打开 RUN_FUNC_TEST宏,关闭RUN_PERF_TEST宏。

2)点击Generate Bitstream进行综合、实现、bit生成。

3)下载bit文件

打开Open Hardware Manager,连接好FPGA开发板后,选择Program Device,自动选择最新生成的比特文件。选择Program,等待下载完成。

4)通过JTAG下载bin文件

首先需要修改脚本fpga/nscscc_team/run_vivado/jtag_axi_mater.tcl第60行至第62行,选择需要下载的bin文件。这三行分别代表刚刚仿真中使用的bin文件、功能测试bin文件、性能测试bin文件。现在希望进行功能测试,因此打开第二行,将另外两行注释掉。

<span style="background-color:#dadada"><span style="color:#1f0909"> # set bin_file [open "../inst_data.bin" "rb"]
 set bin_file [open "../../../../software/examples/nscscc_func/obj/main.bin" "rb"]
 # set bin_file [open "../../../../software/examples/nscscc_perf/obj/allbench/inst_data.bin" "rb"]</span></span>

完成修改后在Hardware Manager界面下方,Tcl Console中调用脚本进行bin文件下载,使用的命令如下。

<span style="background-color:#dadada"><span style="color:#1f0909"> cd [get_property DIRECTORY [current_project]]
 source ../jtag_axi_master.tcl</span></span>

脚本运行完成后便已经将bin文件下载至DDR3中。另外,为方便调试,运行完脚本后还可以使用下列函数进行内存读写。

<span style="background-color:#dadada"><span style="color:#1f0909"> # 从0x1c000000地址处读32位数据
 ReadReg 1c000000
 ​
 # 向0x1c000000地址处写32位数据
 WriteReg 1c000000 00000000
 ​
 # 连续从0x1c000000地址读取10个32位寄存器值并写入文件
 ReadRegsToFile 0x1c000000 10 ../log.txt </span></span>

5)观察实验现象 在FPGA上板验证时其结果正确与否的判断只有一种方法,func正确的执行行为是:

1.开始,单色LED全灭,双色LED灯一红一绿,数码管显示全0;

2.执行过程中,单色LED全灭,双色LED灯一红一绿,数码管高8位和低8位同步累加;

3.结束时,单色LED全灭,双色LED灯亮两绿,数码管高8位和低8位数值相同,对应测试功能点数目,龙芯杯功能测试应在数码管上出现3A 00 00 3A。

如果func执行过程中出错了,则数码管高8位和低8位第一次不同处即为测试出错的功能点编号,且最后的结果是单色LED全亮,双色LED灯亮两红,数码管高8位和低8位数值不同。

另外,可通过修改拨码开关switch值调整程序执行速度,从而看到完整的数码管数字递增。

4.3.2 性能测试上板验证

1)功能/性能测试宏修改

首先修改 chiplab/chip/soc_demo/nscscc-team/soc_config.vh头文件,打开 RUN_PERF_TEST宏,关闭RUN_FUNC_TEST宏,关闭RUN_PERF_NO_DELAY宏。

2)点击Generate Bitstream进行综合、实现、bit生成。

3)下载bit文件

打开Open Hardware Manager,连接好FPGA开发板后,选择Program Device,自动选择最新生成的比特文件。选择Program,等待下载完成。

4)通过JTAG下载bin文件

首先需要修改脚本fpga/nscscc_team/run_vivado/jtag_axi_mater.tcl第60行至第62行,选择需要下载的bin文件。现在希望进行性能测试,因此打开第三行,将另外两行注释掉。

<span style="background-color:#dadada"><span style="color:#1f0909"> # set bin_file [open "../inst_data.bin" "rb"]
 # set bin_file [open "../../../../software/examples/nscscc_func/obj/main.bin" "rb"]
 set bin_file [open "../../../../software/examples/nscscc_perf/obj/allbench/inst_data.bin" "rb"]</span></span>

完成修改后在Hardware Manager界面下方,Tcl Console中调用脚本进行bin文件下载,使用的命令如下。

<span style="background-color:#dadada"><span style="color:#1f0909"> cd [get_property DIRECTORY [current_project]]
 source ../jtag_axi_master.tcl</span></span>

下载 allbench 的 bin 文件后,在实验板上使用 8 个拨码开关的右侧 4 个选择运行哪个测试,随后按复位键,开始运行由拨码开关指定的测试。约定拨码开关拨上为 1,拨下为 0,则 4 个拨码开关与性能测试程序的对应关系如下表。

序号运行的测试程序拨码开关状态
1bitcount5'b0_0001
2bubble_sort5'b0_0010
3coremark5'b0_0011
4crc325'b0_0100
5dhrystone5'b0_0101
6quick_sort5'b0_0110
7select_sort5'b0_0111
8sha5'b0_1000
9stream_copy5'b0_1001
10stringsearch5'b0_1010
11fireye_A05'b0_1011
12fireye_B25'b0_1100
13fireye_C05'b0_1101
14fireye_D15'b0_1110
15fireye_I25'b0_1111
16inner_product5'b1_0000
17lookup_table5'b1_0001
18loop_induction5'b1_0010
19my_memcmp5'b1_0011
20minmax_sequence5'b1_0100
其它不运行性能测试其它
4.3.3 CPU 频率调整

性能测试统计的是 myCPU 运行性能测试程序实际花费的时间,其原理是:测试换 SoC_AXI_Lite 里设置了一 个固定 100MHz 的计时器,在运行性能测试程序的前后读取该计时器,其差值就是运行这一性能测试程序的所花费的实际时间。因而需要大家自行调整 SoC_AXI_Lite 里的 cpu_clk,使其为 myCPU 支持的最高频率,以获取最高性能分。调整 cpu_clk 的方法为:

双击Vivado工程中的clk_pllIP核,重新定制,在 IP 定制界面->Output Clocks修改 clk_out1Output Freq。不允许修改clk_out2。完成修改后可重新进行综合、实现、bit生成。

调整 cpu_clk 后,一定要注意综合实现生成 bit 流文件后,Implementation 栏的 WNS 不允许为负值。 当 WNS 为负值时,表示设计中有违约路径,该栏也会显示为红色。在此提醒大家:

(1) WNS 为负值,生成的 bit 流文件也可能是能够正确运行的。但是比赛统一约定,不允许 WNS 为负值。

(2) 通常 SoC 里 uncore 部分不会成为违约路径,但如果发现 myCPU 没有违约路径,WNS 却为负值,这也是不被允许的。比赛统一约定,不允许 WNS 为负值。

(3) myCPU 一定是嵌入到性能测试环境 SoC_AXI_Lite 里综合实现后 WNS 非负值。如果预赛提交作品不满足该项,性能测试分记为 0 分。

4.3.4 综合、实现的优化参数不允许修改

大赛统一要求:不允许自行修改综合、实现、生成 Bit 流文件时候的参数,也不允许修改约束文件 soc_lite.xdc。

所以在生成 Bit 流文件准备上板时,必须按照发布包里的工程设置完成综合、实现的步骤。

我们在评审预赛作品时,会严格按照发布包里的环境进行综合、实现并查看上板情况,如果有时序违约,按 照“预赛提交说明.pdf”,得分会记为 0 分。

在新的发布包里,综合、实现策略为性能优化优先。

之所以不允许大家再修改编译参数,是因为时间有限,不希望大家将时间浪费在尝试(调试)综合、实现各 种参数以获得最高频率。其实再精细优化综合、实现的参数,也最多只能再获得少许的频率提升。我们希望大家将时间尽量花在有意义的事情上,比如设计 myCPU 之上运行的应用、系统等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值