平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

2023-11-17

在过去的几年里,阿里集团平头哥陆续推出了几款RISCV处理器,有些处理器已经在产业界得到了应用,比如在某志的D1处理器中,就嵌入了平头哥的玄铁C906内核为 “芯”。RISCV虽然是一个开放标准,并且网络上也不乏一些开源核的RTL实现,但是商用的RISCV内核一般都是闭源的。不过令人惊喜的是,在今年十月,平头哥将其设计的四款RISCV内核开源,这其中就包括D1使用的C906核心。

玄铁 C906 是阿里巴巴平头哥半导体有限公司开发的低成本 64 位 RISC-V 架构处理器核,玄铁 C906 基于 64 位 RISC-V 架构,并对 RISC-V 架构进行了扩展增强。扩展增强包括:

1.指令集增强:重点针对内存访问、算术运算、位操作、Cache 操作四个方面进行增强,总计扩展130 条指令。同时,玄铁处理器开发团队在编译器层面对这些指令进行支持,除 Cache 操作指令外这些指令均可编译产生,包括 GCC 和 LLVM 编译.

2.内存模型增强:扩展内存页面属性,支持 Cacheable、Strong order 等页面属性,并在 Linux 内核上进行支持.

  • 玄铁 C906 的主要体系结构参数包括:
  •  RV64IMA[FD]C[V]架构
  • 平头哥指令扩展增强技术
  • 平头哥内存模型增强技术
  • 5 级整型流水线,单发按序执行
  • 128 位的向量计算单元,支持 FP16/FP32/INT8/INT16/INT32 的 SIMD 计算.

C906是RV64位指令集,5 级按序单发射,8KB-64KB L1 Cache支持,不支持L2 Cache,支持半/单/双精度,VIPT四路组联L1数据缓存.

C906框图

开源地址:T-Head Semiconductor Co., Ltd. · GitHub

下面以openC906为例,介绍如何基于开源项目搭建一个处理器内核仿真平台。通过仿真平台可以获得CPU内部时钟级的运行信息,捕捉到程序运行任意时刻的信号,这对于一名系统工程师来讲,意义重大。下面开始。

环境准备

  1. ubuntu18.04
  2. iverilog,vvp,gtkwave工具
  3. 平头哥裸机GCC编译器

iverilog(vvp), gtkwave安装:

gcc:

平头哥芯片开放社区(OCC)

我选择的包为:Xuantie-900-gcc-elf-newlib-x86_64-V2.0.3-20210806.tar.gz,下载后解压:

获取RTL代码

git clone https://github.com/T-head-Semi/openc906.git

配置&修改

代码下来,不能直接仿真运行,必须要做一些修改。感觉平头哥在文档方面做得很差劲,比较不注意细节,GITHUB上文档就三言两语,即便为社区做了好事,在一些细节上不注意,也会遭到埋怨。下面就将这些平头哥文档中没有说明,但是必须要解决的问题列举出来。

首先看一下目录结构:

这个目录结构和GITHUB文档中给出的结构有所不同,sdk中缺少smart_run目录下的work目录。

work目录需要手工创建,而文档中并没有说明,这是第一个问题, 没有work目录会导致后面运行make 失败,我们手工创建,创建之后目录列表是下面的样子:

其余问题我们在具体操作步骤中解决。

综合

RTL环境需要在csh中运行,csh有一些不便,比如不支持自动补全等等,不知道为何T-HEAD一定要将配置脚本写为.csh格式。

首先,配置工程路径环境变量,执行以下命令序列:

$ csh
% cd C906_RTL_FACTORY
% source setup/setup.csh

然后将工具链路径替换为真实的编译器路径:openc906/smart_run/setup/example_setup.csh

之后切换到smart_run目录 

初始化工具链环境变量:

 % source./smart_run/setup/example_setup.csh

可以看出这一步出了问题,这是第二个平头哥文档没有提到的问题,解决方式是删除example_setup.csh头部的版权声明部分,这里要留意。

 删除之后,再次运行,这次成功:

之后是综合,进入到openc906/smart_run目录,执行make help:

综合的话,执行命令make compile

这个错误,经过请教群友(GITHUB上有钉钉群二维码,扫码加入即可QA),经历过同样的问题的群友分享了解决方案,修改方式如下:将56行的static integer FILE修改为integer FILE.

怀疑这个问题和iverilog的版本有关,在群里得到确认,既然构建系统中指定iverilog为默认的综合工具,在发布之前难道没有验证么?

不管怎样,流程还要继续,再次编译,这次成功执行:

在work目录下,生成了仿真VVP文件

执行 make showcase,查看有哪些用例可以跑:

我们执行其中一个,执行make runcase CASE=coremark,又出错:

这次出错的改法是,拷贝命令添加 -fr 选项:

仍然有错误,看到了/bin/sh提示,想到莫非是shell解释器不对,修改/bin/sh指向bash

重新执行,新问题又来了,不过没关系,兵来将挡,水来土掩,如下图:

可以看到编译过程会以LOG文件的形式被记录下来:coremark_build.case.log

在work目录中果然有同名文件:

我们打开这个文件,看里面有没有记录出错信息,找到最后,一条错误赫然出现在眼前:

Srec2vmem不知道是什么鬼,看名字,猜测它可能是将ELF的BINARY 转换为仿真TB可以加载的数据格式的工具,根据经验,如果它属于SDK中的工具,是由可能下载下来后不带有可执行属性,这也是LINUX的安全策略,我们强制修改其为可执行:

至此,修改的文件包括:

之后再次执行make runcase CASE=coremark DUMP=on

DUMP=on表示我们需要生成VCD文件查看waveform.

Binggo! 错误尽除,VVP执行仿真产生波形VCD文件中,倒上一杯咖啡慢慢等吧! 

执行结束后,查看波形: 

用GTKWAVE打开波形文件:

CPU内部对你已经毫无秘密可言了,用这种方法分析系统,只要你肯投入,相信没有解决不了的问题。

quartus ii综合仿真

C906是用Verilog开发的,可以用altera的综合仿真工具quartus ii进行布局布线综合仿真,并且得到方框图。

建立综合工程File->New Project Winzard .....解决编译错误,综合仿真,综合成功即可,不用关心布局布线失败,因为我也不清楚目标FPGA应该选择哪个。

上一步成功后,点击菜单Tools->NetList Viewers->RTL Viewer 打开综合方框图即可查看。

要注意,工程的名字要和你想要查看的顶层wrapper的名字相同,比如下图我需要看MMU的顶层结果,就选择对应的aq_mmu_top.v文件的模块aq_mmu_top作为工程名进行综合。

TLB wrapper结构翻译过来如下图,根据THEAD文档描述,C906 MMU采用两级TLB,第一级为uTLB,分别为指令I-uTLB和数据D-uTLB,第二级为jTLB,在处理器reset后,硬件会将uTLB和jTLB的所有表项进行无效化操作,软件无需初始化操作。

I-uTLB有10个全相联表项,每个表项可以混合存储4K,2M和1G三种大小的页面,取址请求命中I-uTLB时,当拍可以得到物理地址和相应权限属性。

D-uTLB有10个全相联表项,可以混合存储4K,2M,1G三种大小的页面,加载和存储请求命中D-uTLB时,当拍可以得到物理地址和相应权限属性。

jTLB为指令和数据共用,两路组相联结果,表项大小为128/256/512可配,可以混合存储4K,2M和1G三种大小的页面,u-TLB缺失,j-TLB命中时,最快3个cycle返回物理地址和相应权限属性。

pmp wrapper 结构

微架构设计点:

官方生成最大取指位宽为128BIT,看代码中取INST实际只有固定的32BIT宽度。

但是前端IPACK到IBUF的数据通路确实是48BIT,IPACK和ICACHE相连,指令最终来源于ICACHE。

总结:

C906默认使用了开源综合工具进行逻辑综合,算是好处理的。另外一个开源RISCV实现芯来的蜂鸟E200就没有那么容易了,需要Xilinx的Vivado将其综合编译为MCS bitstream文件才能运行在FPGA平台上,对于做软件的人来说,就没那么容易了,尤其是大厂的工具都很高级,授权方式尤其高级,别的不说,可能安装Vivado就会被搞得头破血流,能力所限,就不尝试了。下面是芯来的一些资料:

2. Hummingbirdv2 E203 Core — Hummingbirdv2 E203 Core and SoC 0.2.1 documentation


结束

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真 的相关文章

随机推荐

  • 孙子算经 之 物不知数(韩信点兵)

    孙子算经 作者不可考 成书于四 五世纪南北朝时期 传本分三卷 它是算经十书之一 中国古代最重要的数学著作之一 其下卷26题 物不知数 为其最重要的成就之一 今有物 不知其数 三三数之 剩二 五五数之 剩三 七七数之 剩二 问 物几 何 答曰
  • 解决下载文件时报:Could not find acceptable representation

    今天在写一个文件打包下载的接口的时候一直报错误 文件是可以下载的但是后台打印的日志信息出现 Could not find acceptable representation错误 我之前百度给我的结果是由于我的返回值是json字符串 而由于
  • STM32F1各个工作状态下的工作电流

    低功耗操作实验 文章非原创 从其他网站上摘录 如果侵犯到到 麻烦联系删除 实验目的 测量 STM32 在各种状态下的功耗 包括在不同时钟频率下 32M 8M 1M 100K 10K 不同振荡器 内部 外部 不同模式 活动 睡眠 停机 待机
  • 经纬度查询_查询经纬度并自动转换格式(升级版)附带下载

    链接 https pan baidu com s 1Ysjwdu9griOXzw50RvfF1A 提取码 iwvv 链接 https share weiyun com 8ECyYM8g 密码 bwqmk8 1 史上最齐全的CAD下载资源 2
  • 二进制方式部署kubernetes集群

    二进制方式部署kubernetes集群 1 部署k8s常见的几种方式 1 1 kubeadm Kubeadm 是一个 k8s 部署工具 提供 kubeadm init 和 kubeadm join 用于快速部署 Kubernetes 集群
  • [python]多线程socket端口探测(包含top50-1000)

    这个脚本是基于tcp的 以下链接是基于tcp udp的自动切换的脚本 比这个脚本方便多了 实现UDP TCP的多线程端口探测 包含TOP 50 1000 sGanYu的博客 CSDN博客 多线程扫描工具 import optparse im
  • 数学建模常用的四大模型

    目录 1 评价模型 2 优化模型 3 分类模型 4 预测模型 本文主要介绍数学建模的四大模型分类 分别是评价模型 优化模型 分类模型 预测模型 关注公众号 数模乐园 回复 买 获得更多数模教程 1 评价模型 评价模型可以处理难于完全定量分析
  • ftp服务器查看所有文件夹,查看ftp服务器所有文件夹

    查看ftp服务器所有文件夹 内容精选 换一换 对于本文档的应用示例 查看 HOME tools projects Custom Engine main cpp中所需输入数据如下所示 ASIC场景 以root用户登录Host侧服务器 在 ho
  • R大数定律(Python切比雪夫不等式验证大数定律)模拟圆周率

    大数定律 在概率论中 大数定律 LLN 是描述大量执行相同实验的结果的定理 根据规律 大量试验所得结果的平均值应接近预期值 并随着试验次数的增加而趋于接近预期值 LLN 很重要 因为它保证了一些随机事件的平均值的长期稳定结果 例如 虽然赌场
  • 【Hive】Hive分区表

    分区作为一种提高数据操作灵活性的手段 被广泛应用于关系型数据库中 在Hive中我们同样可以采用分区的方式来提高数据操作效率 不同于关系型数据库 如Oracle Hive的分区表既可以是内部表 也可以是外部表 本篇文章主要介绍如何在Hive中
  • ValueError:optimizer got an empty parameter list 的一个可能错误

    ValueError optimizer got an empty parameter list基本都跟 init 及其里面的代码有关 比如下划线打错了 init拼错了 没有super 没在 init 函数内定义网络等 本次具体如下 今天有
  • 计数排序基础思路

    所谓计数排序 也可以称为散列表 也是一种简单的哈希桶 今天 小编带大家来了解计数排序的基本思路 一 基本思路 以升序为例 计数排序通俗来讲 分为三个步骤 首先制作包含所有要排序的数的桶 相同的数制作一个桶即可 以2 3 6 1 4 1 2
  • eclipse如何配置Maven

    Maven 翻译为 专家 内行 是 Apache 下的一个纯 Java 开发的开源项目 基于项目对象模型 缩写 POM 概念 Maven利用一个中央信息片断能管理一个项目的构建 报告和文档等步骤 Maven 是一个项目管理工具 可以对 Ja
  • C++:unique_ptr

    Code C program to illustrate the use of unique ptr include
  • Go_一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP

    网络编程三要素 ip地址 端口 协议 在网络通信协议下 不同计算机上运行的程序 可以进行数据传输 IP地址 IP地址是一种在互联网协议中用于识别和定位设备的32位或128位数字地址 它是一个设备在网络上的唯一标识符 用于在互联网上定位和识别
  • 【房价网房价信息爬虫】整站40万条房价数据并行抓取,可更换抓取城市

    写在前面 学习数据采集 先转载下来 之后在学习 这次的爬虫是关于房价信息的抓取 目的在于练习10万以上的数据处理及整站式抓取 数据量的提升最直观的感觉便是对函数逻辑要求的提高 针对Python的特性 谨慎的选择数据结构 以往小数据量的抓取
  • git fetch merge rebase squash

    合并分类 在合并分支的时候 默认是有三种选项的 分别是 普通的 merge squash merge rebase merge 区分 merge 和 rebase 更多参考GIT使用rebase和merge的正确姿势 准备 假设我们有如下图
  • Java异常 (throwable)

    异常主要是error和exception两种 throwable的两个子类 1 Error类及其子类 代表的是Error类及其子类 代表的是jvm本身的错误 错误不能被程序通过代码处理 2 Exception类及其子类 一般都是程序写错了
  • 韦东山和正点原子IMX6ULL开发版的区别

    网卡驱动复位引脚硬件区别 网卡 复位脚 厂家 io 网卡0 SNVS TAMPER9 100ask gpio5 IO9 网卡1 SNVS TAMPER6 100ask gpio5 IO6 网卡0 SNVS TAMPER7 正点原子 gpio
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用