Posts

Paper Notes

 Cambricon-C: Efficient 4-bit Matrix Unit via Primitivization  这篇论文比较创新地使用了counter来规避4-bit的乘法。 4-bit数据可以被直接穷举,因此4-bit乘法的值也很容易通过查找表的方式来快速实现。 为了加强这个查找表的速度且降低功耗,此工作用了quarter square mul tiplication来将乘法变成 两个数的加法与减法。 会容易不能快速理解的点:图9中的16x29x32的输入实际上是代表一列PE,但是后面的电路却只针对一个PE。 因此其电路逻辑是,根据PE内部储存的不同Q值出现的次数算出来后,再用乘法与加法树完成计算。 因此,GEMM中计算乘法的次数被大大降低,从而大幅提高了功耗效率。但是从面积角度上讲,此研究或仍有提高空间。

ECC

 汉明码是通过奇偶校验的方式对编码是否有错进行判断并纠正。  对于任一数据,首先需要将其改造为汉明码,即,预留,第01,10,100,1000(二进制)位等的数据。    然后比如,第110位,因为其位可以同时含有010和100,那么对应的第01和100位就需要记录对应位的值,并对所有记录的值进行奇偶性计算。比如,如果所有含有最后一位为1的位的数里,含有1的数量为奇数,那么第01位需要补一个1,使所有含有最后一位为1的位的数里的1的个数保持为偶数。以此类推,计算所有特殊位的值。计算有多少个1的数量是偶数还是奇数的过程可以通过xor来实现。    经过传递编码之后,现在需要对数字进行校验。    首先校验所有含有最后一位为1的位的数里1的数量的奇偶性。由于我们人工已经确保了这个值一定是偶数,如果出现奇数,则代表一定出现了错误。 以此类推,不断计算所有特殊位,如第10,100,1000,即倒数第二位为1,倒数第三位为1...等等。    假如,最后计算的结果是,倒数第一位为1的位的所有1的数量为奇数,且倒数第三位为1的的所有1的数量为奇数,其他都是偶数,那么发生错误的坐标可以直接计算出来:     第101位,即,汉明码的第5位。     这是因为实际上,我们利用二进制的加法,对原始数据进行了特殊处理,从而保证了所有奇偶校验位可以表达所有的位。 比如第8,4,2,1位的奇偶校验位可以表示直到汉明码的第15位。比如,第1111位,它实际含有四个1,所以他被这四个奇偶校验位全部追踪,有且只有它发生错误时,才会导致所有四位出现问题。实际上可以理解为,比如第1010位发生错误,由于它含有倒数第二位和倒数第四位的1,所以它被第8和第4位所检验的奇偶性包含。那么反过来,当8 4 两个奇偶性出问题时,这代表着所出现问题的数字一定是包含了1000和0010,即1010。 由于汉明码采取了正好是对应二进制数字每位的编码方式,如果其他位不出现奇偶性不出现问题,那么也证明所出现问题的位数一定不包含那些位。     这样的方法使得汉明码拥有一位纠错能力。     而实际上,我们还会使用最后多加的一位奇偶校验位来多验证一...

Dadda和Wallace乘法器的区别

 Dadda是从bottom到top反向推算如何进行数据压缩,高层是低一层的1.5倍取整。最低一层是2,所以从下到上是2,3,4,6,9,13...   Wallace乘法器则是遇见三列可压缩的数据就可以压缩,所以可以这样计算:                  新stage层数 n,  旧stage层数k,则                            n=2*(k/3取整)+kmod3,如k=8时,则n=2*2+2=6    具体实施时,wallace一定要维持3:2的压缩,dadda则是按着规定的层数递减即可,最终dadda会比wallace省用很多加法器。    压缩的时候需要进行递补的原则,比如 竖着的三位如若使用FA进行压缩,就会只剩一位,那么此时需要后面的列使用HA来传递一位补位。具体可以根据以下网站的图片来理解。 https://stackoverflow.com/questions/54374925/differences-between-wallace-tree-and-dadda-multipliers                         具体而言当使用wallace来压缩时,因为对于三列的阵列来说,当遇到第一个三列进行压缩时,FA虽然能压缩3bit的数据到2bit,但是cout是传递到后一列的,所以实际上,每一列的压缩其实等价于是4->2。而第一个使用3列的部分,需要从前一列得到补位来维持两列,所以前一位需要使用HA来传递一位进位。   而使用dadda压缩时则不那么激进,比如我们现有最大8列数据,我们只需要进行最简单化的8->6压缩即可。所以,对于8列数据的隔壁7列数据来说,使用一个HA即可,实现7->6。而7列数据的进位被传递到了拥有8列数据的阵列,那么实际上8列会变成9列,所以...

二进制加减法归纳

首先,加减法的基础:  计算机以补码作为计算基础:  不论正负数,最高位永远代表符号位,正数的符号位为0,负数为1。  正数的补码就是其本身,即01011为01011.  负数的补码略微复杂,我自己比较喜欢的计算方式为:    首先最高位是符号位1,以4bit为例,那么1000就代表着 -1*2^3=-8。    其余位按正常处理,如1011就是 -8+2+1=-5。  如果计算机有很多富裕的位,那么正数需要将富裕的最高位全部补0,负数全部补1。正数很好理解,负数全部补1可以理解为:     如1011,如果增加一位最高位补1,那么新的最高位(2^4)就是之前最高位(2^3)的两倍,由于2^3不再是最高位,所以其符号变为正号,新最高两位的数字和仍然是-2^3,并不会发生变化,如果再增加最高位,同理,新最高位是旧最高位的两倍,即2^5=2*2^4=2*2*2^3,而其后两位2^4+2^3=3*2^3,和最高位的计算和仍然是-8。也就是说,不论如何增高位的1,在补码的计算规则下,高位1的计算和永远是不变的。     本质上,这是由于:比如11111=-1,当每一位都是1的时候,值为-1,其余负值都是在此基础上去减去对应位的数值。所有不论前面有多少位是1,并不影响后续位需要扣除的值。    所以,001011=01011,             11011=1011=-16+8+2+1=-5。 溢出: 当符号位不同的数字相加肯定不会溢出,因为最终数一定会比原来某一个数小。 当符号位相同的数字相减肯定不会溢出,因为减法的本质是加上一个负数,即两个符号位不同的数字相加。 只有两个数字都很大的时候,相加或相减有可能发生溢出,具体的归纳可以查询书籍。

Little-Endian&Big-Endian

 大端格式与小端格式: 如数据 0x01020304 在内存中,如若为小端格式则,低位内存存储低位数据,高位内存存储高位数据: 地址  4000  4001  4002  4003 对应  04        03      02       01 大端格式则相反。 目前主流CPU均采用小端格式。

对MOSFET的电压曲线的归纳

最基本的: 只有VDD: 只存在漏电流。 VDD,VG共同作用: 当VG<Vth时,除了漏电流,并不存在电子的流动,所以实际上能检测到的电流也就是漏电流,但此时的漏电流可能会略比只存在VDD时的漏电流略大。 当VG>Vth, 电子开始受到Gate极的电压的吸引,形成导电沟道,而由于VDD存在电压,所以形成导电沟道的电子受到VDD的吸引,形成电流,电流方向为Drain to source。 预夹断: 在VG>Vth的情况下,VDD不断增加,当VDD=VG-Vth时,此时,VDD的电压便和导电沟道的正中间的电压相等,电子不再集中像Gate极靠拢,也就是电子会逐渐在Drain极附近形成包围圈,从而使得从Source导向Drain极的电子数量变少,所以导电沟道的电子无法再不断显著增加。这便是预夹断形成的本质原因,从而使得MOSFET进入saturation区。 如果此时不断增加VDD,聚集在VDD的电子会越来越多,也就是导电沟道越来越短,从而Ids的值基本不再增加。 关于预夹断的可以从以下URL中寻得更多介绍与讲解: http://www.kiaic.com/article/detail/2672.htm

FEOL MOL BEOL

 FEOL: Front-End-Of-Line, 俗称前端,描述diffusion layer如何与poly连接,Tox厚度等等。  MOL: Middle-Of-Line, MOL layer, 从FinFET时代起常见的技术,描述Poly、diffusion和Local interconnect layer的连接,加入MOL layer在一定程度上可以减少local wire的电阻。  BEOL: Back-End-Of-Line, 俗称后端,负责描述place-and-route阶段的global wire。