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
来查看仿真波形。