Dorapocket
moveonmoveonmoveonmoveon
Dorapocket

Windows 环境下调试蜂鸟HBird E203内核

Windows 环境下调试蜂鸟HBird E203内核

蜂鸟 E200 是一个处理器系列,包含了多款不同的具体处理器型号。所有的 E200 系列处理器核均支持协处理器接口,可用于自定义扩展指令
– E201 核是面积 小的核,可 以配置为 RV32IC RV32EC 架构,不支持其他的
展指令子集。
– E203 核可以配置为 RV32IMAC 或者 RV32EMAC 架构,使用面积优化的多周期硬件乘除法单元。
– E205 核为 RV32IMAC 架构, 使用单周期 硬件乘法单元和多周期的硬件除法单元
– E205f 核为 RV32IMAFC 架构,在基本的 E205 基础上加入了单精度浮点运算单元
– E205fd核为 RV32IMAFDC 架构 ,在基本 E205 基础上加入了单精度和双精度浮点运算单元。

蜂鸟E200处理器有一定的可配置性,可在e200_opensource/rtl/e203/core/config.v中进行更改,核配置选项可在官方手册中查询

目录组织结构剖析

  • rtl 存放RTL目录
  • tb 测试平台目录
  • vsim 仿真目录
  • fpga FPGA项目脚本目录
  • riscv-tools 存放工具目录
  • doc 文档

WINDOWS环境下工作环境配置

因为Windows环境下的bash操作和LINUX不同,故原来写的Makefile不再可用,因此不能简单通过文档中的 make install 来进行安装,所以我们有两个选择
– 重写Makefile,修改为Windows CMD指令
– 读懂Makefile在干啥,然后手动操作一遍

本教程取后面的方法。首先获得调试FPGA所需要的核心Verilog文件
Makefile对于install参数的定义如下:

install: 
    mkdir -p install
    cp ../rtl/${CORE} ${INSTALL_RTL} -rf
    cp ${FPGA_DIR}/src/system.org ${INSTALL_RTL}/system.v -rf
    sed -i 's/e200/${CORE}/g' ${INSTALL_RTL}/system.v
    sed -i '1i\`define FPGA_SOURCE\'  ${INSTALL_RTL}/core/${CORE}_defines.v

EXTRA_FPGA_VSRCS := 
verilog := $(wildcard ${INSTALL_RTL}/*/*.v)
verilog += $(wildcard ${INSTALL_RTL}/*.v)

为你的Verilog创建一个文件夹,名字任意
– 第一步:再e200_opensource-master/rtl/e203中复制所有的文件夹到你的工作目录
– 第二步:打开e200_opensource-master/fpga文件夹,找一个跟你的板子贴合最近的文件夹,把里面的文件复制出来到你的工作目录
– 第三步:把system.org 文件名后缀改成 .v 文件

至此 工作目录配置完毕。

WINDOWS环境下Vivado工程的建立

建立Vivado工程

打开Vivado,新建工程,选择你的芯片
添加设计文件->添加文件夹->选择你的工作目录文件夹,vivado会自动分析你的文件关联并设置顶层文件。

补全所需IP核文件

在原来的编译过程中,采用了TCL指令对IP核进行创建和例化,在Windows中的Vivado环境,需要手动添加IP核。
TCL指令目录:

e200_opensource-master\fpga\artydevkit\script

IP核生成的TCL指令见ip.tcl
源码如下

create_ip -vendor xilinx.com -library ip -name clk_wiz -module_name mmcm -dir $ipdir -force
set_property -dict [list \
  CONFIG.PRIMITIVE {MMCM} \
  CONFIG.RESET_TYPE {ACTIVE_LOW} \
  CONFIG.CLKOUT1_USED {true} \
  CONFIG.CLKOUT2_USED {true} \
  CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {8.388} \
  CONFIG.CLKOUT2_REQUESTED_OUT_FREQ {16.000} \
  ] [get_ips mmcm]

create_ip -vendor xilinx.com -library ip -name proc_sys_reset -module_name reset_sys -dir $ipdir -force
set_property -dict [list \
  CONFIG.C_EXT_RESET_HIGH {false} \
  CONFIG.C_AUX_RESET_HIGH {false} \
  CONFIG.C_NUM_BUS_RST {1} \
  CONFIG.C_NUM_PERP_RST {1} \
  CONFIG.C_NUM_INTERCONNECT_ARESETN {1} \
  CONFIG.C_NUM_PERP_ARESETN {1} \
  ] [get_ips reset_sys]

这里定义了两个IP核 一个用于配置全局时钟clk_wiz,另一个用于处理全局复位信号sys_reset
先来添加全局时钟IP核
IP Catalog->搜索clock 找到clocking wizard
选择类别MMCM,输入100MHz的信号,输出8.388MHz和16MHz的分频信号,带复位和lock脚,复位低电平使能。命名为mmcm
具体配置如下:

1

2

3

再来添加全局复位IP核
IP Catalog->搜索reset->选择Processor System Reset IP核
配置为低电平使能,位宽1,命名为reset_sys
具体配置如下:
4

根据自己板载时钟适配

适配方式:添加PLL锁相环
IP Catalog->搜索clock 找到clocking wizard
选择类别PLL,输入信号你板子时钟频率,输出100MHz,为了简单不带复位,不带lock。
具体配置如下:

5

6

7

加了这个以后需要修改system.v顶层文件
例化clk_wiz_0

wire CLK100MHZ;
clk_wiz_0 clk(
    .clk_in1(CLK50MHZ),
    .clk_out1(CLK100MHZ)
)

同时将开头的

  input wire CLK100MHZ,//GCLK-W19
  input wire CLK32768KHZ,//RTC_CLK-Y18

里面的CLK100MHZ改为CLK50MHZ。

修改IOBUF原语

system.v里面有大量IOBUF原语。IOBUF原语用于初始化双向输入输出引脚,大概长这个样子

//=================================================
  // IOBUF instantiation for GPIOs

  wire iobuf_gpio_0_o;
  IOBUF
  #(
    .DRIVE(12),
    .IBUF_LOW_PWR("TRUE"),
    .IOSTANDARD("DEFAULT"),
    .SLEW("SLOW")
  )
  IOBUF_gpio_0
  (
    .O(iobuf_gpio_0_o),
    .IO(gpio[0]),
    .I(dut_io_pads_gpio_0_o_oval),
    .T(~dut_io_pads_gpio_0_o_oe)
  );
  assign dut_io_pads_gpio_0_i_ival = iobuf_gpio_0_o & dut_io_pads_gpio_0_o_ie;

其中 上面的#部分用于对引脚进行初始化定义
下面的IOBUF如下:
– .O 输出buffer
– .IO 物理管脚约束
– .I 输入buffer
– .T 反
– 根据自己的需要搞吧

将IOBUF的GPIO约束到物理设备

直接 assign YOUR_DEVICE = gpio[x]
就能用GPIO控制你的外设啦!
当然,你要在你的顶层文件里例化你的外设,或者端口把这个输出出去。
总的来说gpio数组即是一切。。
比如:

assign LED[0]=gpio[0]

写约束文件 约束物理管脚

写*.xdc文件作为物理约束,大概格式如下

set_property IOSTANDARD LVCMOS33 [get_ports RST]
set_property PACKAGE_PIN L16 [get_ports RST]

get_ports 里面改成你在顶层文件输出引脚
PACKAGE_PIN 后面改成你想约束到的硬件端口
修改完约束以后,还要进行最后一步操作,因为E203的核引出的引脚实在太多了,有些我们并没有约束出来,在Vivado中会出现错误提示 [DRC NSTD-1] 大概就是一坨提示五六行然后后面接了几个端口号说你没有约束。
为了解决这个问题需要写一个TCL预编译指令
新建一个记事本,里面输入

set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]

关闭,修改扩展名为.tcl文件
回到Vivado,右击Generate bit stream 在Prebuild script里面选中你写的tcl文件。
进行比特文件编译,并烧录至FPGA

至此,蜂鸟E200 RISCV-CPU在Windows环境便可编译成功。

发表回复

textsms
account_circle
email

  • Fahrenhell

    您好,我想问一下,我的jtag接口一直显示检测不到内核,您知道有什么方法可以确认e203是正确运行了吗?

    1 年前 回复
    • dorapocket博主

      @Fahrenhell: 抱歉,这篇文章是很久之前写的了,具体的我也不太记得了。不过我认为你可以尝试用ila测一下总线事务,csr,pc和ir,看看是否正常

      1 年前 回复

Dorapocket

Windows 环境下调试蜂鸟HBird E203内核
蜂鸟 E200 是一个处理器系列,包含了多款不同的具体处理器型号。所有的 E200 系列处理器核均支持协处理器接口,可用于自定义扩展指令 - E201 核是面积 小的核,可 以配置为 RV32IC RV32EC…
扫描二维码继续阅读
2019-12-11