
体系结构
文章平均质量分 76
icfg66
“君子终日乾乾,夕惕若厉,无咎。”
展开
-
Gem5 Debug
Gem5的源码在src文件夹,涉及很多内容,如果希望修改某些模块,或增加某些功能,总感觉无从下手:一方面对Gem5的代码组织不清楚,另一方面对硬件结构不熟悉。经过一番探索,逐渐有些感觉,特来记录一波。原创 2022-08-19 20:11:34 · 1691 阅读 · 3 评论 -
Gem5 O3 可视化
gem5是研究体系结构的硬件仿真工具,官方也提供了较详细的入门文档。在研究超标量乱序CPU时,Gem5也提供了可视化样例这个脚本会产生trace.out文件原创 2022-08-01 09:35:42 · 2270 阅读 · 0 评论 -
Difftest踩坑笔记(一)
Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。原创 2022-06-12 19:52:03 · 3466 阅读 · 0 评论 -
Difftest踩坑笔记(二)
如何搭建自己的Difftest框架呢?一生一芯仓库的wiki给了优秀的回答,但要全搭起来还是不容易,同样是两个原因:不够保姆、版本。原创 2022-06-12 19:49:50 · 1485 阅读 · 1 评论 -
捡到RoCC的贝壳
RISC-V RoCC时序图,内存模型介绍原创 2022-06-03 16:29:19 · 801 阅读 · 0 评论 -
虚拟地址转物理地址
操作系统启动过程中,如何完成物理地址到虚拟地址的转换?虚拟地址又是如何翻译成物理地址的?以qemu-system-riscv64为例,opensbi会将内核搬到内存0x80200000的位置,如果内核的.ld链接文件也是以0x80200000开始,那么人畜无害,操作系统一直在物理地址下运行,可以作为RTOS简单控制。但如果要开启虚拟地址,要做什么操作呢?1. 物理地址到虚拟地址的转换?首先我们在链接的时候,需要修改.ld的基址,0x80200000修改为想要内核运行的虚拟地址下,比如0xFFFFFFF原创 2022-05-21 15:28:51 · 5531 阅读 · 0 评论 -
RISCV 特权级拾遗
最近了解了一波RISCV特权指令,起因是想弄清楚linux启动过程中M模式、S模式、U模式分别是如何切换的?中断和异常的时候硬件做了什么,软件要做什么?如何判断当前运行在什么模式下?1. 模式转换带着这些问题查看手册,确实收获不少,比如:开机时,默认进入M模式。初始化之后,配置mstatus寄存器MPP位,执行mret指令可以跳转到S或U模式。U模式下主动执行ecall(同步异常),可以进入M模式,跳转到预先保存在mtvec的异常处理程序地址,最后通过mret返回U模式。U模式下被动接受的中断包原创 2022-04-27 15:46:41 · 2304 阅读 · 0 评论 -
大佬的矩阵乘法加速
感谢这篇博文的分享,原理讲得很清楚,于是我便在三台机器上做了尝试,理清了不少东西,顺便记录一番。大佬是怎么优雅实现矩阵乘法的?github 源码核心代码用汇编,“sgemm_kernel_x64_fma.S”由于之前用过avx256指令集做过加速,也了解cpu亲和性方面的知识,于是我便在三台机器上做了尝试,理清了不少东西,顺便记录一番。大佬的配置如下,计算性能时有两点需要注意:为什么是8x2? 利用了avx256寄存器,一次可以处理8个32bit 的float类型数据,2表示乘、加两种运算。为原创 2021-06-28 17:06:51 · 978 阅读 · 0 评论 -
软硬件协同设计的大小端问题
缘起最近需要在soc系统内做协处理器,加速AES加密运算,寄存器一次读取32bit,AES一次处理128bit,因此在数据拼接的时候,需要考虑大小端的问题,特来记录一番。一、什么是大小端大小端的问题发生在寄存器和内存间传递数据,这点非常重要,很多地方简单地说是数据存储方式,其实不准确。追根溯源,大小端问题是在设计load,store指令的时候考虑的,因此本质是寄存器和内存交互的问题,其他地方不会发生。比如c语言里定义一个变量int a=ox1234,那么查看在线汇编平台的对应汇编代码:# 给2号寄原创 2021-05-10 19:26:36 · 484 阅读 · 0 评论 -
SoC,SiP,IP和Chiplet的区别
最近经常听到Chiplet的概念,据说AMD的锐龙系列就是利用chiplet技术逆袭Intel的。那么chiplet和SoC,SiP,IP核等有什么关系呢?找了不少资料,特来总结一番。其实这些概念的出现有一个共同的主线,让IC设计和制造越来越容易。一、IP早期的复制电路都是全定制,比如Intel的4004cpu,这种设计非常耗时。考虑到cpu的很多模块有相似的地方,能不能把这些东西模块化?于是就有了IP核的概念,Intelligent Property,即知识产权核。IP核在EDA上有非常重要的地位,原创 2021-03-20 11:19:35 · 14910 阅读 · 2 评论 -
忆阻器阵列学习笔记
最近阅读组里忆阻器阵列的nature文章,搞清楚很多问题,特别是CNN的算法如何在忆阻器上实现这点,特来整理一波。Fully hardware-implemented memristorconvolutional neural network一、顶层结构这图包含很多信息量:图a:中间的忆阻器阵列PE chip只做矩阵乘法,得到的电流通过ADC转成数字信号,然后在软件上进行pooling,Activation,Accumulate等操作,再进入下一层卷积网络。(这一点困扰了我很久,我之前以为po原创 2021-03-20 11:15:16 · 11090 阅读 · 6 评论 -
C++avx256指令集加速实例
背景avx256是x86cpu架构下实现SIMD(单指令多数据)的指令集。它能够利用cpu内部256bit的寄存器,同时对4位double或8位int类型的数操作,达到很好的加速效果。这里通过一个计算π\piπ的实例来展示其威力:π=4∫0111+x2dx\pi = 4\int_0^1\frac{1}{1+x^2}dxπ=4∫011+x21dxlinux系统下可以通过如下命令查看电脑是否支持avx256指令集:cat /proc/cpuinfo | grep flagssse4就表示原创 2020-10-07 12:47:31 · 7350 阅读 · 1 评论 -
OpenSRAM结构
前言一般做asic芯片要用sram时,都是通过晶圆厂提供的工具产生的,比如台积电,还有ARM的commory complier。但由于贸易战的缘故,这种工具也开始被限制,幸运的是GitHub上分享了一个用python写的commory complier工具,它可以可以根据需求,自动产生Sram的网表、verilog、版图等信息。OpenRAM开源项目详见GithubOpenRAM顶层模块1、存储单元阵列:尽量保持方阵;两边多加了三列:dummy左列、replica列、(方阵)、dummy右列原创 2020-07-11 14:01:21 · 1099 阅读 · 0 评论 -
MIPS延迟槽技术
原始流水线先放一张原始的MIPS流水线图,图片来自雷思磊的《自己动手写CPU》目前流水线是按顺序执行,没有加入跳转语句的数据通路,假设我们在**“执行阶段”**才知道比较跳转指令beq需要跳转,那么此时已经在取指、译码的两条指令会无效,下一个时钟周期需要把它们清空,于是流水线出现两个周期的气泡。跳转前的状态如下:······beq $t1,$t2,label #执行阶段ori $3,$3,0x8 #译码阶段,下一刻清空ori $3,$3,0x9 #取指阶段,下一刻清空·原创 2020-06-10 09:52:18 · 9103 阅读 · 2 评论