tfpwl_lj的个人空间 https://blog.eetop.cn/1638430 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

RISCV 西数SweRV-EH2 IP 使用总结

热度 14已有 4539 次阅读| 2021-8-23 11:00 |系统分类:芯片设计| RISCV

SweRV-EH2 IP 使用总结

Source: https://github.com/chipsalliance/Cores-SweRV-EH2

1.配置篇

1.1 熟悉swerv.config 文件中配置选项的含义

   与FW开发人员,验证人员等共同决定各配置选项参数。

   注意:

   a,以下选项

        {inst,data}_access_enable[0-7] : default 0

        {inst,data}_access_addr[0-7] : default 0x00000000

        {inst,data}_access_mask[0-7] : default 0xffffffff

配置了也不起作用,都是默认状态。

 

b,没有配置线程的选项,但可以在生成的文件中修改来达到双线程效果。

 

2.FW篇

2.1 根据IP 路径下 tools/Makefile 文件熟悉如何生成hex代码文件

注意cmark_iccm.ld 链接器文件,用于划分代码,数据的memory分布区域。

 

2.2 配置中断向量表,后续调试过程都会触发异常/中断。

 

2.3 熟悉常见的异常和中断,便于后期调试。

 

2.4 仿真用(前),采用通用的printf基础函数库,设定打印内容指向的硬件地址,便于后续将打印信息打印到terminal控制台里。

 

2.5 FPGA调试用,实现UART的相关代码,便于后期上FPGA调试时,将printf的信息打印到PC里。

 

3.验证篇

3.1. 验证人员需将FW hex代码通过backdoor的方式注入到CPU内部的ICCM,DCCM。须熟悉ICCM,DCCM的底层memory结构,bank数量及分布,才能正确写入hex可执行代码。

 

3.2 仿真用(后),printf在硬件端的实现,验证人员在与FW人员约定的硬件地址(比如DCCM最后一个地址)里取出printf打印出的ASCII 码,并用$write函数打印到terminal终端里,方便debug。

 

3.3调试常规流程,查看ifu,lbu等总线是否有异常;查看trace_*等信号,熟悉常见的异常和中断,前期调试,多会出现异常和中断。

4.warning&error

4.1 读取ICCM的数据,CPU将通过lsu总线来读取,如需要此功能,可将lsu总线通过AXI bridge接到CPU的DMA接口上。

4.2

Warning-[ENUMASSIGN] Illegal assignment to enum variable

eh2/ifu/eh2_ifu_mem_ctl.sv, 560

" rvdff #(($bits(eh2_err_stop_state_t) * 6'b1)) icache_ecc_1.err_stop_stateff( .clk (active_clk),  .din (err_stop_state_thr),  .dout (err_stop_state_thr_ff),  .rst_l (rst_l));"

  Only expressions of the enum type can be assigned to an enum variable.

  The type logic [(WIDTH - 1):0] is incompatible with the enum

  'eh2_err_stop_state_t'

  Expression: dout

  Use the static cast operator to convert the expression to enum type.

 

resolved:

typedef logic [$bits(eh2_err_stop_state_t)-1:0] eh2_err_stop_state_t_bits;//eh2_def.sv 33 line

eh2_err_stop_state_t_bits err_stop_state; //eh2_ifu_mem_ctl.sv 457 line

eh2_err_stop_state_t_bits [pt.NUM_THREADS-1:0]                              err_stop_state_thr;//eh2_ifu_mem_ctl.sv 406 line

eh2_err_stop_state_t_bits [pt.NUM_THREADS-1:0]                              err_stop_state_thr_ff;//eh2_ifu_mem_ctl.sv 407 line

 

4.3. all $error

Error-[EEST] $error elaboration system task

  msg: 

  location: file

eh2/lib/beh_lib.sv

  line 561

  path: rvdffiee

 

resolved: add "initial" in line 561

 

4.4 无法识别eh2_param.vh中的语法

解决办法:替换 pt 结构体,将”pt.”替换成”pt_”, “:”替换成“=”,主要思路是将struct类型的对象换成普通的parameter定义,其他细节也需要处理。此外,相应的其他.sv文件的“pt.”也要批量替换成“pt_”

 

4.5. eh2_mem.sv undriver 各种undriver

line:115

   assign btb_sram_pkt.wayhit_f1='0;

   assign btb_sram_pkt.wayhit_p1_f1='0;

   assign btb_sram_pkt.tag_match_way0_f1='0;

   assign btb_sram_pkt.tag_match_way0_p1_f1='0;

   assign btb_sram_pkt.tag_match_vway1_expanded_f1='0;

   assign btb_vbank0_rd_data_f1='0;

   assign btb_vbank1_rd_data_f1='0;

   assign btb_vbank2_rd_data_f1='0;

   assign btb_vbank3_rd_data_f1='0;

 

4.6. bus_rsp_valid_q, bus_rsp_ready_q, bus_rsp_write_q, bus_rsp_error_q;bus_rsp_rdata_q 各类无驱动warning, 不要处理。由于它采用了隐式接口,所以会报,实际上是有连接的。

eh2_lsu_bus_intf.sv line:245

 

4.7 spyglass 会无法识别SV语法,需要使用VC_Static工具。

   使用VC_Static工具得到的report需要分析,会有很多undriver的情况。不影响使用,就暂时不要处理。

4.8 有问题可以去github上问开发者。

 

附录:

NIC400 IP(BUS bridge IP) user guide

#/bin/tcsh

#/tools/arm/AMBADesigner_r3p9/ADCL/doc/

source /tools/arm/AMBADesigner_r3p9/etc/setup.csh

source /tools/arm/AMBADesigner_r3p9/AMBADesigner/etc/setup.csh

source /tools/arm/ad_3p_tools/perl_5_8_8/linux//etc/setup.csh

source /tools/arm/ad_3p_tools/tcl_8_4_13/linux//etc/setup.csh

source /tools/arm/ad_3p_tools/python_2_4_3/linux//etc/setup.csh

source /tools/arm/ad_3p_tools/xalan_1_8_0/linux//etc/setup.csh

source /tools/arm/ad_3p_tools/xercesc_2_5_0/linux//etc/setup.csh

source /tools/arm/AMBADesigner_r3p9/etc/setup.csh

adcanvas&

1

点赞

刚表态过的朋友 (1 人)

发表评论 评论 (8 个评论)

回复 mlgbb 2021-9-7 20:18
谢谢分享,很实用!
回复 玉林枫 2022-1-26 11:43
你好,我最近在使用SWERV EL2,发现ICCM中编写代码先写sw 后写lw,但执行结果确是先执行lw在执行sw,看了下文档需要使用fence指令,我想问的是,如果使用C编写代码,要怎样才能避免这个问题,可以自动编译产生fence指令吗?
回复 tfpwl_lj 2022-1-27 17:21
玉林枫: 你好,我最近在使用SWERV EL2,发现ICCM中编写代码先写sw 后写lw,但执行结果确是先执行lw在执行sw,看了下文档需要使用fence指令,我想问的是,如果使用C编写代 ...
C语言没有对应fence的语句。只能是手动嵌入fence指令。具体网上搜一下怎么在C语言中嵌入汇编指令。我这边做硬件,暂时不涉及到写这样的C代码。
回复 玉林枫 2022-1-27 18:34
tfpwl_lj: C语言没有对应fence的语句。只能是手动嵌入fence指令。具体网上搜一下怎么在C语言中嵌入汇编指令。我这边做硬件,暂时不涉及到写这样的C代码。 ...
就硬件而言,您那边ICCM/DCCM作何使用,按照这个特性ICCM只能使用汇编编写,难道是将一些实时性强的代码,比如说中断?本来我打算仅仅使用ICCM/DCCM即可,现在看来需要在外面另外添加SRAM了。而且看DMA访问ICCM/DCCM只能以字的形式,为了JATG调试看来外增SRAM是有必要的。
回复 tfpwl_lj 2022-2-8 16:42
玉林枫: 就硬件而言,您那边ICCM/DCCM作何使用,按照这个特性ICCM只能使用汇编编写,难道是将一些实时性强的代码,比如说中断?本来我打算仅仅使用ICCM/DCCM即可,现在看 ...
ICCM只是存放代码的SRAM,靠近CPU,实时性强,访问速度快。它里面的代码用汇编或者C编译都可以。硬件仿真可以backdoor的方式来访问ICCM,做成了真实的芯片,可以通过DMA往里面写入数据。这边会把所有的固件代码都放在ICCM/DCCM里面,除非容量不够。
回复 玉林枫 2022-2-11 16:48
tfpwl_lj: ICCM只是存放代码的SRAM,靠近CPU,实时性强,访问速度快。它里面的代码用汇编或者C编译都可以。硬件仿真可以backdoor的方式来访问ICCM,做成了真实的芯片,可以 ...
多谢,我的问题解决了,我使用的VCS仿真器,ICCM DCCM没有初始化,lw指令进行DCCM读取,读出来x,进而导致仿真失败,对DCCM随便初始化一个值,程序即可正确运行。
我这边配置成AHB总线,内核以外访问ICCM,DCCM只通过其提供的DMA Slave Port。FPGA JTAG调试时,当编译添加c扩展压缩指令,Debug Bus出现半字访问,这就导致调试失败(DMA Slave Port不支持半字访问DCCM ICCM),因此我目前在内核外边加了一个SRAM供调试使用。
回复 tfpwl_lj 2022-2-12 18:40
玉林枫: 多谢,我的问题解决了,我使用的VCS仿真器,ICCM DCCM没有初始化,lw指令进行DCCM读取,读出来x,进而导致仿真失败,对DCCM随便初始化一个值,程序即可正确运行 ...
好的,CPU的CCM都要初始化为0之后才能用,不然就会报ECC err。
回复 kingxrainy 2024-3-22 22:08
谢谢

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 72

    粉丝
  • 38

    好友
  • 41

    获赞
  • 52

    评论
  • 4340

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 03:25 , Processed in 0.017214 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部