RISC-V MCU中文社区

【分享】 E203外设的例化与编译配置

发表于 开源蜂鸟E203 2023-05-21 16:33:10
0
1796
0

E203外设的例化与编译配置

队伍编号:CICC2136
队伍名称:芯如止水

增加外设,包括硬件例化、总线连接、底层开辟空间等一系列过程,同时需要在软件中配置地址、接口信号数据类型等,才能正常编译使外设运行相应的程序。接下来将以SHA256外设模块为例,介绍上述过程。

SHA即Security Hash Algorithm安全散列算法,SHA-256是其中消息摘要位数为256位的一种算法,被广泛用于口令的加密、消息认证码的构造、数字签名和伪随机数生成器等。这里的电路处理输入数据长度为512比特的消息,并输出256比特的加密结果,其顶层端口信号定义如下:

module e203_sha (
    input                          clk,
    input                          rst_n,
    //
    input                          sha_cfg_icb_cmd_valid,
    output                         sha_cfg_icb_cmd_ready, 
    input                          sha_cfg_icb_cmd_read,
    input  [`E203_ADDR_SIZE-1:0]   sha_cfg_icb_cmd_addr,
    input  [`E203_XLEN-1:0]        sha_cfg_icb_cmd_wdata,
    input  [`E203_XLEN/8-1:0]      sha_cfg_icb_cmd_wmask,
    //
    output reg                     sha_cfg_icb_rsp_valid, 
    input                          sha_cfg_icb_rsp_ready,
    output reg  [`E203_XLEN-1:0]   sha_cfg_icb_rsp_rdata,
    output                         sha_cfg_icb_rsp_err,  
    output                      sha_irq
);

1 硬件实现

1.1 模块例化
在subsys中例化硬件设计(e203)/rtl/subsys/e203_subsys_main.v对除去aon_top模块和debug_module模块外进⾏了包括核在内的所有硬件设计进⾏了例化。推荐将增加的外设例化在e203_subsys_main层,将该外设设置为ICB总线的从设备,接收CPU发出的指令信息。

在例化过程中,需要重点关注ICB总线接口信号和外设中断信号。cfg_icb系列ICB总线接口信号在e203_subsys_perips层中与icb总线进⾏连接。e203_subsys_perips同样例化在e203_subsys_main中,因此需要在e203_subsys_perips模块端口定义这些cfg_icb系列ICB总线接口信号。

外设中断信号可通过如下方式接入到e203_cpu_top的端口信号中:

.ext_irq_a               (sha_irq | plic_ext_irq),

1.2 总线设置
在(e203)/rtl/subsys/e203_subsys_perips.v中例化了sirv_icb1to16_bus,sirv_icb1to16_bus.v在e203/rtl/fab中,是⼀个有16外设的总线包装⼝,因此在总线上挂载外设需要设置其中变量。将SHA256外设接入总线O15的位置:

    .o15_icb_enable     (1'b1),

    .o15_icb_cmd_valid  (sha_cfg_icb_cmd_valid),
    .o15_icb_cmd_ready  (sha_cfg_icb_cmd_ready),
    .o15_icb_cmd_addr   (sha_cfg_icb_cmd_addr),
    .o15_icb_cmd_read   (sha_cfg_icb_cmd_read),
    .o15_icb_cmd_wdata  (sha_cfg_icb_cmd_wdata),
    .o15_icb_cmd_wmask  (sha_cfg_icb_cmd_wmask),
    .o15_icb_cmd_lock   (),
    .o15_icb_cmd_excl   (),
    .o15_icb_cmd_size   (),
    .o15_icb_cmd_burst  (),
    .o15_icb_cmd_beat   (),

    .o15_icb_rsp_valid  (sha_cfg_icb_rsp_valid),
    .o15_icb_rsp_ready  (sha_cfg_icb_rsp_ready),
    .o15_icb_rsp_err    (sha_cfg_icb_rsp_err),
    .o15_icb_rsp_excl_ok(1'b0),
    .o15_icb_rsp_rdata  (sha_cfg_icb_rsp_rdata),

然后需要配置O15对应的外设基地址和寄存器可用位宽,示例如下所示:

  .O15_BASE_ADDR       (32'h1004_2000),       
  .O15_BASE_REGION_LSB (12)

2 软件编译

2.1 软硬件接口

在hbird-sdk/SoC/hbirdv2/Common/Include/hbirdv2.h加入SHA256外设地址定义:

#define SHA_CFG_BASE            (HBIRD_PERIPH_BASE + 0x42000)          
#define SHA_ANS_BASE            (HBIRD_PERIPH_BASE + 0x42040)       
#define SHA_CFG                 ((SHA_CFG_TypeDef *) SHA_CFG_BASE)
#define SHA_ANS                 ((SHA_ANS_TypeDef *) SHA_ANS_BASE)
#define SHA_CFG_REG(offset)     _REG32(SHA_CFG_BASE, offset)
#define SHA_ANS_REG(offset)     _REG32(SHA_ANS_BASE, offset)

其中SHA_CFG_TypeDef和SHA_ANS_TypeDef为单独定义的结构体,分别包含16个uint32_t和8个uint32_t,用于提供SHA256的输入数据和输出数据。

2.2 程序及编译设置
仿照hbird-sdk/application/baremetal/下的文件夹创建子目录,存放外设应用程序(.c、.h文件)和Makefile,Makefile示例如下:

TARGET = sha
HBIRD_SDK_ROOT = ../../..
SRCDIRS = . src
INCDIRS = . inc
COMMON_FLAGS := -O2
include $(HBIRD_SDK_ROOT)/Build/Makefile.base

此外,修改(e203)/vsim下的Makefile,使得TESTCASE指向上述外设应用文件夹下生成的.verilog文件(这里假设把.verilog文件复制到了(e203)/tb下),则仿真时硬件能够正确读入程序:

TESTNAME     := sha
TESTCASE     := ${RUN_DIR}/../../tb/${TESTNAME}

2.3 运行仿真
首先进入hbird-sdk/application/baremetal/下创建的子目录,运行以下命令编译程序:

make dasm SOC=hbirdv2 CORE=e203 DOWNLOAD=ilm

然后将生成的sha.verilog复制到(e203)/tb下,接着进入(e203)/vsim,依次运行:

make clean
make install
make compile
make run_test SIM=vcs

则可查看仿真结果。还可通过命令:

make wave SIM=vcs

来查看仿真波形。

喜欢0
用户评论
zzzjy

zzzjy 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板