tag 标签: CPU设计实战

相关帖子
相关博文
  • 热度 12
    2021-7-14 11:31
    3063 次阅读|
    0 个评论
    感谢“面包板社区”,给了我这个评测的机会,让我可以接触到龙芯团队的成果。 回顾一下, 《CPU设计实战》-(1) 前四章的初印象 《CPU设计实战》-(2) booth算法 ================================================ 我们目前还是停留在 第五章: 在流水线中添加运算类指令 ================================================ Booth 算法 实质是 :如何从 二进制数 的 “形式” 得到其 “数值” 的另外一种方法 比如 0101 这个"数",如何得到其"值"? 1) 经典的“按其位的权 累加”的方法: 计算过程= ( 1 * 2^0 ) + ( 0 * 2~1 ) + ( 1 * 2^2) + ( 0 * 2^3 ) 总共要加 4 次,每个位置的 0,1 都需要参加计算 2) Booth 的简化方法: 多看2个位置: -1位,4位, 这两位的数据当然都是0, 计算过程= ( -1 * 2^0 ) + ( 1 * 2~1 ) + ( -1 * 2^2) + ( 1 * 2^3 ) 虽然要看6个位置,累加最多只需 4 次,这个例子里没有连续的0或1可以跳过,计算次数也没有变少了,优点并没有展现出来。 而一般的数字组成,总会有大量的0和1的重复序列,Booth就可以节省很多的计算。 比如:8位 1111_1111 :传统算法要加 8次; Booth算法立刻得出:1*2^8 -1 (这也解释了 -1的几何意义) 再如:8位 1111_0000 :传统算法要加 8次; Booth算法立刻得出:2^8 -2^4 所以, Booth 天生和 乘法 非常亲近; 而和 加法 的距离比较远。 ------------------------------------------------------------------------------- Booth 权重算法 和 Booth 乘法器, 究竟还是不一样的: ------------------------------------------------------------------------------- 本书 P140: 5.2.2 , 电路级实现“乘法器”: 乘数A和B,全部使用补码表示,进行经典的乘法计算,发现: A补码 * B补码 !== 补码 而是: 补码 == A补码 * B' ; 其中 B' = 这个事实说明什么? 可以继续对 B' 进行处理:以32位举例 B' = B’ = -Y31 * 2^31 + Y30 * 2^30 + Y29 * 2^29 + ... + Y1* 2^1 + Y0 *2^0 让单数位置的数值为了0,仅仅保留双数位 注意: -Y31 * 2^31 == -2*31 * 2^30, 余例仿此。 B' = (Y29+Y30-2*Y31) *2^30 + (Y27+Y28-2*Y29) *2^28 + ... B' = 原来 32位乘法运算:要进行32次乘法和移位,最后展开变成64位,在64个位置要 32个数字累加(带进位),总之比较复杂,运算资源也很大; 现在,运算次数可以减少1半,只要 16 位乘法运算即可 ---------------------------------------------------- 说实话, 我看不出 这种 Booth乘法器, 和 Booth 权重算法 有什么关系吗?
  • 热度 5
    2021-7-10 11:42
    4297 次阅读|
    2 个评论
    感谢“面包板社区”,给了我这个评测的机会,在 位竞争者中杀出,我很感激。 《CPU设计实战》-(1) 前四章的初印象 回顾一下,虽然没有“龙芯试验箱”,但这本《配套教程》还是讲解了很多开发过程。闭上眼睛回想一下,我以前掌握的哪些 FPGA的开发知识都还没有过时和落伍。 下面我们继续阅读,进入下一章.. ================================================ 第五章节,在流水线中添加运算类指令 booth计算 5*(-7)的例子,我居然一下子没有看懂!!... -------------------------------------------------- 不是廉颇老矣,而是这个 “booth乘法器”, 我以前居然没有见过!!! 应该是和 抠底壳算法 一样,是2010年以后流行起来码技术,正好可以刷新我的知识结构! 一本书如果能为自己带来新知识,哪怕是新增一种新技术储备,这本书就很值了!! 百度百科的解释: 布斯算法将乘数看作从最低位开始的一串二进制数字。 从最低位算起,只要这串数字为“0“,就不执行任何操作; 当这串数字遇到第一个“1”时执行一次减法,即减被乘数与该位权值的乘积,而对于其后的“1”不执行任何操作; 当这串数字再变为“0”时,则遇到第一个“0”时执行一次加法,即加被乘数与该位权值的乘积,而对其后的“0”则不执行任何操作。 如此一直进行到最高位 。 -------------------------------------------------- 我理解了一下: booth 算法的原理,应该是这样的: -------------------------------------------------- 举例: 5(0000_0101) * 7(0000_0111) 乘法运算,先 按数字7 来计算,比较快一点: (数字7: 0111 : 从右到左,从最低bit到最高位的顺序; 默认 第-1位,其bit 已经是 0) 第0位 1,发生一次上跳变,累加数字: - 2^0 * 5; (0变1,负号,本地权重2^0) 第1位 1,没有跳变,累加数字0; (1变1,无变化) 第2位 1,没有跳变,累加数字0; 第3位 0,发生下跳变, 累加数字 : 2^3 *5 (1变0,为正) 再往后,都是0,没有跳变,累计数都是0 所以最终结果是: - 2^0 *5 + 2^3 *5 = -5 + 40 = 35 = 5 *7 --------------------------------- 同例: 5(0000_0101) * 7(0000_0111) 乘法运算,用5计算: (数字5: 0101 : 从右到左,从最低bit到最高位的顺序; 默认 第-1位,其bit 已经是 0) 第0位 1,发生上跳变,累加数字: - 2^0 * 7; (0变1,负号,本地权重2^0) 第1位 0,发生下跳变,累加数字: 2^1 * 7; (1变0,为正) 第2位 1,发生上跳变,累加数字: - 2^2 * 7; (0变1,负号) 第3位 0,发生下跳变,累加数字: 2^3 * 7 (1变0,为正) 再往后都是0,没有跳变,累计数都是0 所以最终结果是: - 7 + 14 -28 + 56 = 35 = 5 *7 -------------------------------------------------------------- 采用 booth 算法,不仅是 每个bit的1参与运算,0也参与运算; 并且连续的1,连续的0不参与运算, 理论上可以降低运算强度 特殊情况下,对于 010101 这样的交错的序列,似乎booth算法也就没什么加速了 ================================================ 再回到书本的例子中来,其实是一个 码制的表示和转换问题: 无符号数的加法: 可以直接用加法器运算 (缺点是进位链比较长,不在本次讨论范围部内) 有符号数减法: 在计算之前先判断大小,按照大小顺序送入减法器输出结果(绝对值) 然后再根据 小减大还是大减小,确定正负符号 (缺点是非常麻烦,还要逻辑判定等,而使用补码表示就会很简单) 无符号数的乘法: 是一个循环移位累加器,逐bit左移累加,在N拍后得到累加结果 (缺点是计算时间比较长,而且不支持有符号数) 有符号数的乘法: 因为原码的乘法已经没有多少优化空间 可以先变换成 符号+原码 形式,套用无符号乘法计算绝对值乘积, 再确定最终的正负符号,码制变换成 补码形式最终输出 (乘法器的缺点很多,这也正是 booth乘法器要针对的地方!!) ---- ----
  • 热度 4
    2021-7-7 14:01
    4546 次阅读|
    2 个评论
    《CPU设计实战》-(1) 前四章的初印象
    《CPU设计实战》-(1) 前四章的初印象 非常感谢“面包板社区”,给了我这个评测的机会,在55位竞争者中杀出,概率低于9%,我很感激。 本书来自 “龙芯团队”,在封二页上还有这两位作者的照片,没有秃顶,也没有胡子。 虽然年轻,但是有龙芯作为背书,应该是技术沉甸甸。 不过对那些 经多见广目光如炬 的读者如我,早就从思想上已经做好了觉悟:别想从这本书中看到龙芯的太多技术内幕。 ----------------------------------------------------- 第一章节 只有三页,基本的科普内容,还算规矩的开章; 第二章节,看到了不想看到的东西: 1)龙芯实验箱:购置一套这个玩意来做实验,恐怕不会便宜。 2)Xilinx 的 vivado :看到了一大堆的 操作过程拷屏,拉低了不少本书的档次。 第三章节,数字逻辑电路设计基础 从一个 有着10年 Verilog开发经验者的挑剔的眼光看来,讲数字电路应该离不开: 组合逻辑,同步时序逻辑,亚稳态等问题。结果本书的顺序是: 译码器--编码器--多路选择器--触发器--ALU运算单元--寄存器--RAM--流水线 最后本章开始,学习目标处的“理解同步RAM和异步RAM的区别和仿真行为” 3.2.1的例三,可算是“同步RAM”的介绍;3.3.1算是“同步RAM仿真”;3.3.2算是“异步RAM仿真”的介绍。可是期望中的“RAM仿真”出来的时序图缺失了。 这个区别只能是 购买了 龙芯实验箱的同学,自己仿真,自己比较出结果了。 第四章节,简单流水线CPU设计 说实话,代码部分比较多。作者想说的话,完全都在代码里了。 缺少:设计原则,实现构想,提示用户注意的技术要点,要点的提炼 让本书实际成为了 龙芯实验箱的配套辅导书,而不是一本理论书。 我在10年前曾经在《FPGA设计教材》的指导下(好像是北航的那本),做过简单的 RISC 处理器; 工作中也曾经用过 picaRISC 。所以我特别希望能 系统学习 RISC 的相关理论。我在第四章翻来覆去查找,略显失望。 这部分都是一些太基本内容,平平淡淡地展示出来,并没有发现大的错误。貌似该说的都说了,缺乏叙事特色,即不“平实易懂”,也没有“一针见血”的阐述。 就是类似教科书一般 平平淡淡地讲解一二三四。 在前面应该有一章节,专门介绍 RISC 的设计理念和设计哲学: 1)RISC构架的指令长度为什么是固定的?固定长度的好处是什么?坏处是什么? 2)RISC构架的指令类型分析:为什么可以省略掉某些指令类型? 3)RISC寻址方式比较少:什么时候不够用?不够用时如何分析? 4)RISC指令集的特点,MIPS/ARM的区别,设计的侧重点是什么?等等 这样的前导内容,对初学者非常友好,让初学者知其然更知其所以然,后面的学习事半功倍; 而缺少这样的前导内容,需要初学者自己领悟,结果往往就是从入门到放弃。 本章内容的最后,还是没有自己动手实现CPU,也没有CPU实现的代码解释,而是直接实例化了最小RISC核 草草了事。 从前4章的阅读体验来看,本书就像是 龙芯实验箱的配套辅导书,是龙芯实验箱的教程。 即:是针对 龙芯 特定CPU的设计书,而不是针对 通用CPU设计的理论书。 原本书名《CPU 设计实战》好似不太合适,建议修改为《龙芯生态系列之:龙芯 CPU配套教程》