自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

http://www.icfgblog.com/

记录踩坑,分享回馈

  • 博客(74)
  • 收藏
  • 关注

原创 Matlab蒙特卡洛模拟二维伊辛模型相变过程

一、什么是伊辛模型伊辛(Ising)模型是描述磁系统相变最简单的模型,但模型里自旋之间的相互作用赋予了它奇妙的特性,最有趣的就是对称性破缺。这一模型可以被推广用于研究连续的量子相变、基本粒子超弦理论、动力学临界行为等,甚至被认为可以描述深林火灾、交通拥堵、舆论传播等社会经济现象。如图,每个格点的方向只有向上或向下两者状态,但临近的自旋之间有相互作用,而且点阵可以是一维、二维、三维、甚至更高维...

2020-04-07 18:27:40 18716 26

原创 PRBS并行输出

PRBS(Pseudo-Random Binary Sequences)是通过伪随机数发生器产生的伪随机数序列,通常用于高速数字通信测试。

2024-02-01 18:47:49 2084 3

原创 Gem5 Debug

Gem5的源码在src文件夹,涉及很多内容,如果希望修改某些模块,或增加某些功能,总感觉无从下手:一方面对Gem5的代码组织不清楚,另一方面对硬件结构不熟悉。经过一番探索,逐渐有些感觉,特来记录一波。

2022-08-19 20:11:34 1406 3

原创 Gem5 O3 可视化

gem5是研究体系结构的硬件仿真工具,官方也提供了较详细的入门文档。在研究超标量乱序CPU时,Gem5也提供了可视化样例这个脚本会产生trace.out文件

2022-08-01 09:35:42 1817

原创 Difftest踩坑笔记(一)

Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。

2022-06-12 19:52:03 2791

原创 Difftest踩坑笔记(二)

如何搭建自己的Difftest框架呢?一生一芯仓库的wiki给了优秀的回答,但要全搭起来还是不容易,同样是两个原因:不够保姆、版本。

2022-06-12 19:49:50 1189 1

原创 捡到RoCC的贝壳

RISC-V RoCC时序图,内存模型介绍

2022-06-03 16:29:19 677

原创 虚拟地址转物理地址

操作系统启动过程中,如何完成物理地址到虚拟地址的转换?虚拟地址又是如何翻译成物理地址的?以qemu-system-riscv64为例,opensbi会将内核搬到内存0x80200000的位置,如果内核的.ld链接文件也是以0x80200000开始,那么人畜无害,操作系统一直在物理地址下运行,可以作为RTOS简单控制。但如果要开启虚拟地址,要做什么操作呢?1. 物理地址到虚拟地址的转换?首先我们在链接的时候,需要修改.ld的基址,0x80200000修改为想要内核运行的虚拟地址下,比如0xFFFFFFF

2022-05-21 15:28:51 5335

原创 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 1938

原创 RK3399pro装labelme

一、硬件与系统操作系统(cat /etc/issue):Ubuntu 18.04硬件(lscpu):aarch64,Cotex-A53,二、基本情况嵌入式系统里面只有python3.5,labelme只能支持python3.6以上。由于嵌入式系统空间有限,anaconda不太方便安装,版本管理就不那么方便。不同于x86架构,安装简单的labelme花了九牛二虎之力。三、排坑之路安装python3.6之后,pip总是对应python3.5,在知乎上找到这篇多版本Python安装pip及pip版

2021-10-25 10:24:00 312

原创 ADC(三)Guard ring

Guard ring 是用来隔离电路的,特别是模拟模块和数字模块,灵敏放大模块和高功率模块等。一开始画单元模块的时候,一直在纠结需不需要画Guard ring,或者说多大的模块需要才需要画Guard ring?上学期画过简单的反相器,两个黄色的框就是Guard ring ,外边是Nwell接高电平,里边是Psub接低电平。同时Pmos外边也围了Nwell、Nmos外边也围了Psub。小小一个反相器,要围那么多东西,这要多消耗面积啊?上学期简单的课程作业可以这么玩,现在可是要流片呀,而且这么多元件,每个

2021-09-08 20:31:09 15723 7

原创 rk3399pro部署unet

最近参与一个项目,需要利用unet做焊点检测,unet最终要部署在Rockchip的rk3399pro嵌入式系统里,该系统内部有神经网路加速器,但需要先转成.rknn的格式。RK3399Pro NPU Manual提供了入门指导,里面的RKNN toolkit 包含了样例和转换工具。我的unet版本是参考github头像匹配的pytorch版本。一、出师不利样例提供了torchvision上resnet_18的python版本,能够成功转成rknn格式,代码如下:import numpy as np

2021-09-05 20:17:29 1813

原创 ADC(零)天线错误

上文ADC笔记(一)说已经完成了说有版图,没想到8月底经历了一场刺激的debug之旅,差点崩溃。一、溃不成军版图gds文件的提交在8月底,当时以为传个gds文件就可以交差了,没想到提交的时候,还要自动做两个drc检查:全芯片drc:CLM18_LM16_LM152_6M.215_1a.fullchip天线检查:CLM18_LM16_LM152_6M_ANT.215_1a当时上百个错误如下,“我看不懂,但大受震撼”。那时在深夜,突然体会到《西游记》最后一难——通天河遇鼋湿经书。本以为历经千难,完结

2021-09-04 21:30:46 2425 1

原创 Chisel,说爱你不容易

很早就听说Chisel,伯克利的又一大作,也听说其学习门槛高,基于scala语言,语法非常灵活。近期的国科大搞的“一生一芯”计划,“香山”处理器等,更是将Chisel推向了又一个高潮,据包老师说,Chisel的开发效率远高于verilog香山高性能riscv处理器,这种提高生产力的语言,怎么能不学?一、Chisel的难点Chisel 早期的门槛有两个,一个是开发环境,另一个是从verilog转变。开发环境说来简单, 真搭起来还真不容易,我花了两三天时间才实现想要的效果:产生电路的.v文件产生.vc

2021-08-29 19:43:43 890

原创 ADC笔记(二)

电路设计和前仿的时候,不需要考虑外围的IO PAD,但当通过了前仿,并且画好了除PAD的版图,该如何添加外围的PAD呢?最初的电路图如下:对应的版图如下:一、IO PAD 电路一开始以为这些复杂的PAD需要自己手画,没想到它也是有电路图,我们需要在原来ADC_core(上图)的外面包一层PAD电路,然后调它的版图,最后连线,流程和搭ADC_core基本一致。外面包的一层Pad电路如下:这些pad有几个注意的地方:PAD也需要供电数字输入、输出口需要添加driver模拟输入口不能添加

2021-08-25 17:15:26 2767

原创 ADC笔记(一)

耗时一学期的模拟IC实践课终于结束,经历了电路设计、前仿、版图、后仿、IOpad、金属dummy,最终生成GDSII文件的全部过程,确实收获不少,最终的版图如下,还挺有美感的。这是8比特异步SAR ADC,没有加冗余,后仿的ENOB为7.77,采样速度是33M/s,希望流片之后不会变砖。整个过程经历不少坑,希望做一些记录,纪念“那些月一起de过的bug”。一、如何生成GDSII版图?模拟版图相信一般的专业课都会教,B站也有很多视频,比如画一个反相器,复杂一点的有五管放大器。版图方面也有一本很好的入

2021-08-25 16:24:16 2591

原创 modelsim和vivado仿真不一致——噩梦debug

昨天经历了恶梦debug,中间排了很多坑,特来记录一番。一、问题描述和队友写了lenet神经网络推理的硬件实现,在modelsim已经跑通,且验证了功能,但需要移植到vivado,利用里面的dist_rom加载权重。顺便插一句,vivado有两者存储IP:dist_ram和blk_ram,分别表示分布式存储和块存储。分布式存储利用lut单元,分布在电路周围,因此布线容易,但容量有限制。块存储是真实的ram,容量大,但有可能布线较长。但将reg更换成rom和ram之后,运行结果和modelsim不

2021-07-30 17:44:41 5041

原创 炼丹术——可变学习率训练

学习率对网络训练的效果影响很大,一般来看,越到后面,学习率要越小,手动可以调节,但可变学习率会更方便。还有一种更骚的操作是warm up学习,学习率早期先增大预热,再减小。一、不变学习率设定学习率为0.01,训练30个epoch,batch_size=128。发现15个epoch之后训练变缓,因此可以在次改变学习率。最终的训练集86.1%,测试集集83.3%#############1. 数据准备import torchimport torch.nn as nnimport torch.nn.f

2021-06-29 09:21:01 1278

原创 大佬的矩阵乘法加速

感谢这篇博文的分享,原理讲得很清楚,于是我便在三台机器上做了尝试,理清了不少东西,顺便记录一番。大佬是怎么优雅实现矩阵乘法的?github 源码核心代码用汇编,“sgemm_kernel_x64_fma.S”由于之前用过avx256指令集做过加速,也了解cpu亲和性方面的知识,于是我便在三台机器上做了尝试,理清了不少东西,顺便记录一番。大佬的配置如下,计算性能时有两点需要注意:为什么是8x2? 利用了avx256寄存器,一次可以处理8个32bit 的float类型数据,2表示乘、加两种运算。为

2021-06-28 17:06:51 872

原创 ONNX实践

有关ONNX的大体介绍已经很多了,比如ONNX简明教程,但相关的代码要么很复杂,要么太简单,这里将介绍三个方面:如何生成.onnx如何查看.onnx如何转成.json格式一、如何生成.onnximport torchimport torch.nn as nnimport torch.nn.functional as Fclass LeNet(nn.Module): def __init__(self): super(LeNet, self).__init__()

2021-06-08 21:48:59 397

原创 内联汇编的妙用

一、问题描述AES加密模式中,有一种CTR模式,其流程如下图:加密时,除了明文和密钥外,还需要一个初始向量COUNTER1,将其加密的结果和明文异或,即可得到密文;下一块明文加密时,COUNTER1加1得到COUNTER2。详情可以查看博文AES的五种加密模式。以下是我用拓展指令集在AES加速的CTR模式代码,测试的了三块数据,初始向量vi=“0102030405060708”(128bit),但编译之后,加密的结果只有第一块正确,其余两块不正确,vivado查看波形,发现三次的COUNTER没有改

2021-05-23 20:01:38 305

原创 tensorpack——Dorefa(二)- alexnet

上次跑通的是Dorefa样例下的svhn-digit-dorefa.py代码,这次准备跑alexnet-dorefa.py,其中碰到了无数的bug,折腾了好几天,终于跑通了!这里只挑选其中几个我花时间最多的bug。一、数据集路径虽然官方代码有描述数据集路径,但对于脑残的我,还是不太理解,还是上图吧:代码默认的目录是~/tensorpack_data/数据集,跑alexnet-dorefa.py的–data路径就是:/root/.keras/tensorpack_data/imagenet/二、cu

2021-05-11 21:24:14 369

原创 软硬件协同设计的大小端问题

缘起最近需要在soc系统内做协处理器,加速AES加密运算,寄存器一次读取32bit,AES一次处理128bit,因此在数据拼接的时候,需要考虑大小端的问题,特来记录一番。一、什么是大小端大小端的问题发生在寄存器和内存间传递数据,这点非常重要,很多地方简单地说是数据存储方式,其实不准确。追根溯源,大小端问题是在设计load,store指令的时候考虑的,因此本质是寄存器和内存交互的问题,其他地方不会发生。比如c语言里定义一个变量int a=ox1234,那么查看在线汇编平台的对应汇编代码:# 给2号寄

2021-05-10 19:26:36 417

原创 tensorpack——Dorefa样例

最近在学习量化,想先复现一下Dorefa,官网确实有源代码,貌似挺简单,但当我真正去跑的时候,“坑之大,不知其几千里也!”,特来记录一番。tensorpack需要的环境:Python 3.3+.Python bindings for OpenCV. (这是大坑)TensorFlow ≥ 1.5, < 2首先想到的是在服务器上跑,但服务器是docker镜像,而且全是tf2.0以上,为止奈何?先在自己window下跑通简单的样例吧,之后再想办法一、失败尝试v1windows里刚好装

2021-05-07 15:28:03 622 2

原创 LFSR和特征函数

测试课程碰到了随机向量生成方面的内容,碰到了线性反馈移位寄存器(Linear Feedback Shift Registers,LFSR)。课件上只简单提了一下,但没有说EE和IE两者结构的区别,以及对应特征函数的作用。全网搜了一通,也没看到说清楚的,最后还是在bing上搜到一篇比较好的课件,特来记录一番。一、LFSR是什么LFSR有两者类型,外部反馈型和内部反馈型:两个电路明显的区别是,EF只更新最后一位,其余移位,且关键路径更长;IF不单纯移位,关键路径更短。给定初始状态,每个周期会有新的输出,

2021-05-06 14:55:37 9572 2

原创 非均匀量化

一、为什么需要非均匀量化?tensorflow,pytorch 等框架下也有量化操作,通常是为了减少权重存储空间,有利于部署移动端。但是基于数字电路的量化只能是均匀的,那么为什么还要研究非均匀量化呢?忆阻器的电导权重是模拟量,本身具备非均匀量化的可能性,而且忆阻器电导的中间值比较不稳定,均匀量化的时候很难精确。神经网络的权重本身是非均匀分布的,在密集的地方多取点,稀疏的地方少取点,量化后的误差会更小。二、如何确定非均匀量化点?选取的量化点有一个中心思想:它们最接近原始的分布。正好,数

2021-04-17 21:25:46 6342 2

原创 CNN训练MNIST数据集tenflow2(下)

接下来利用tflite做量化,其实中间的数据流到底有没量化,我也不清楚。。。一、数据准备# 1.数据准备import tensorflow as tfimport numpy as npmnist = tf.keras.datasets.mnistimg_rows,img_cols = 28,28(x_train_, y_train_), (x_test_, y_test_) = mnist.load_data()x_train = x_train_.reshape(x_train_.sh

2021-03-26 22:13:13 176

原创 CNN训练MNIST数据集tenflow2(中)

CNN训练MNIST数据集tenflow2(下)紧接上文CNN训练MNIST数据集tenflow2(上),我们已经做好了训练,分别保存了32bit、16bit、8bit的量化模型。本篇的工作是加载模型,查看增加噪声、权重量化时的精度变化。数据流量化的结果将在下篇介绍。一、加载数据集# 1. 加载数据集import tensorflow as tfimport numpy as npminst = tf.keras.datasets.mnistimg_rows,img_cols = 28,28

2021-03-26 22:11:54 230

原创 CNN训练MNIST数据集tenflow2(上)

CNN训练MNIST数据集tenflow2(中)CNN训练MNIST数据集tenflow2(下)背景还是那片nature的文章Fully hardware-implemented memristor convolutional neural network。忆阻器的精度很低,虽然外围的ADC是8bit,但忆阻器实际的精度有4bit就不错了。希望先用32bit浮点数训练网络,然后做量化,比较准确率的下降情况:搭建网络增加噪声量化权重量化数据流测试的环境如下:python 3.7.4,

2021-03-26 22:09:23 354

原创 Cadence ic5 自定义快捷键及奇技淫巧

这两天一直折腾Cadence ic5的环境,“工欲善其事,必先利其器”,为了最后的ADC设计流片,也是要拼了。忆阻器阵列的外围电路需要ADC,占总体功耗的90%,因此想设计低功耗的ADC。一、问题描述Cadence ic5 没有对齐“Align”的快捷键,靠肉眼对齐的话,后期连线之后,DRC容易出错。undo 的次数只有一次,如何增加?二、 方案1.对齐ic5 的对齐不太好找,Edit->Other->Align:设置如下:先选择一个器件,之后的器件和它对齐;可以选水平或垂直

2021-03-20 11:26:33 1661 1

原创 cadence ic5 dc仿真,添加“gm“ operating point

集成电路实践课需要用古老的cadence IC5仿真并画版图,刚从IC6练就的操作,好多使不上,相当郁闷。考虑过讲IC5的工艺库转成OA格式,但是打开之后版图连颜色都没有,考虑到之后需要流片,还是不瞎折腾,专心学习IC5的操作吧。仿真时第一个bug是,查看静态工作点的时候,mos管没有“gm”一项,这可是重要参数,每次用print查看的话,得多费劲!好在搜到了解决方案(这种细微的问题只能用英文搜,Google不行只能用Bing):启动菜单CIW->Tools->CDF->Edit

2021-03-20 11:24:36 3282

原创 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 14438 2

原创 忆阻器阵列学习笔记

最近阅读组里忆阻器阵列的nature文章,搞清楚很多问题,特别是CNN的算法如何在忆阻器上实现这点,特来整理一波。Fully hardware-implemented memristorconvolutional neural network一、顶层结构这图包含很多信息量:图a:中间的忆阻器阵列PE chip只做矩阵乘法,得到的电流通过ADC转成数字信号,然后在软件上进行pooling,Activation,Accumulate等操作,再进入下一层卷积网络。(这一点困扰了我很久,我之前以为po

2021-03-20 11:15:16 9486 6

原创 Hummingbirdv2 E203 仿真排坑之路

参照官方文档中Quick Start 4.1 “How to run simulation”部分,中途遇到很多坑,特来记录一番。1.环境设置1.1 强烈建议用 ubuntu 18.04,安装时要点“下载更新”我的是vmware 15.5pro虚拟机。这里有两个坑:第一次用20.04,最后在运行make run_test SIM=iverilog的时候,老是出现lxt2 support disabled since zlib not available的错误。第二次用18.04,但安装的时候没有选

2021-03-05 21:53:16 2839 15

原创 Docker 入门+实战

一、缘起导师让我跑一个忆阻器网络的GitHub项目,需要C++编译,还要用pytorch训练。自己的电脑是win10,C++编译需要用虚拟机里的linux系统;pytorch还没装,而且虚拟机肯定跑不了这种强度的训练。因此申请使用课题组的服务器,顺利登陆后,发现g++都没有!IT反问我一句:“为什么不用Docker?”,于是便开启了我docker速成之路二、简单明了说Docker我也是花了挺久在弄明白Docker(容器)的概念。不得不说,它真是很有用,正是需求促进了Docker的产生。为了弄清doc

2021-02-21 20:03:46 234

原创 忆阻器(二)——忆阻模拟器

除了真实的器件,我们也可以用运放和乘法器来搭忆阻模拟器。这节将介绍数学模型、matlab仿真及multisim仿真。一、数学模型忆阻分为磁控和荷控两种,这里介绍三次非线性磁控忆阻模型:{I=W(φ)VW(φ)=a+3bφ2dφdt=V\begin{cases}I=W(\varphi)V \\W(\varphi)=a+3b \varphi ^2\\\frac{d \varphi }{dt}=V\end{cases}⎩⎪⎨⎪⎧​I=W(φ)VW(φ)=a+3bφ2dtdφ​=V​这里的WWW

2021-02-21 19:59:32 11874 39

原创 忆阻器(一)——基本概念和实例

忆阻器字面包含两层意思:一是电阻,二是具有记忆性。它是伯克利的蔡少棠教授由电路完备性的角度预言的器件,下面我们也尝试一番。一、电路理论完备性已知四个基本电学量:电流III、电压VVV、电荷QQQ和磁通量φ\varphiφ。从中任取两个量,就有C42=6C_4^2=6C42​=6种组合,即六种关系:{R=VII=dQdtV=dφdtL=VdI/dt=dφdIC=QVdφdQ=?\begin{cases}R=\frac{V}{I} \\I=\frac{dQ}{dt}\\V= \frac{d\var

2021-02-21 19:57:51 16806 6

原创 C++多线程4——锁竞争

一、为什么要锁锁是为了防止多线访问共同内存时的冲突问题,先看实例:两个线程分别对全局变量累加://gcc lock_test.c -lpthread#include <stdio.h>#include <unistd.h>#include <pthread.h>int num = 0; //设置为全局变量,在全局区域共享void* myfun(void* arg);pthread_mutex_t mtx;int main(){ //1.产生两个

2021-02-13 10:32:37 978 2

原创 C++多线程3——线程池

一、线程池的好处如果任务的数量一开始不确定,我们该如何开辟线程?如果来一个任务开辟一个线程,任务结束之后又销毁线程,那么整体的效率会很低,大多数时间都在产生和销毁线程,该如何摆脱这种困境?线程池的概念孕育而生,我们可以一次产生4个线程,它们组成一个线程池,相当于食堂的打菜大妈;接着会有一波任务接连过来,这些线程便依次完成这些任务,如果暂时没有任务,它们也不销毁,继续等待,直到设定的一定之间后,才销毁线程池。线程池能够大大提高任务执行的效率。二、线程池实例如果从头开始写线程池,会非常复杂,目前我也没

2021-02-13 10:31:41 395

原创 C++多线程2——亲和性

一、多核CPU的结构服务器的多核结构属于NUMA(Non-Uniform Memory Access,非一致性内存访问)架构。这里有一篇很好的介绍NUMA架构理解。以我们课题组的服务器为例,上面有两个“插槽”,即两个socket(物理概念),逻辑上称为节点node。每个插槽10个物理核core,每个物理核通过超线程技术可以产生两个逻辑核processor。因此我们服务器可以有$ 2 \times 10 \times 2=40$个线程 。CPU亲和的意思是,假设我们产生40个线程,希望每个线程运行在

2021-02-13 10:30:31 895

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除