ZhangHui Li

CPU designer, Lisper, Smalltalker & Emacs maniac.

1_12_hdl_design

Table of Contents

ASIC design

booth编码

booth算法就是补码乘法,可以根据同时计算的部分积位数,减少部分积个数。计 算前被乘数[A]要采用变形补码,即模4补码。

[A]补=A01A02.A1A2...An
[B]补=B0.B1B2...Bn
[AxB]补=[A]补x(0.B1B2...Bn)+[-A]补xB0

一位

P0=0
P1=1/2{[P0]补+(Bn+1 - Bn)x[A]补}
Pn=1/2{[Pn-1]补+(B2 - B1)x[A]补
[AxB]补=[Pn]补+(B1 - B0)x[A]补

二位

  • n(小数点后位数)为偶数
    [P0]补=0
    [p1]补=1/4{[P0]补+(Bn+1 + Bn - 2Bn-1)x[A]补}
    [Pn/2]补=1/4{[pn/2-1]补+(B3 + B2 - 2B1)x[A]补}
    [AxB]补=[Pn/2]补+(B1 +B02 -2B01)x[A]补
    
  • 为奇数
    [P(n-1)/2]补=1/4{[p(n-1)/2-1]补+(B4 + B3 - 2B2)x[A]补}
    [AxB]补=1/2{[p(n-1)/2]补+(B2 + B1 - 2B0)x[A]补}
    

wallace树

CPA(carry propagate adders)/CSA(carry save adders)伪加器

CSA进位信号保留,留待下一级处理。CPA在同级传播进位信号。

FA全加器/HA半加器

三输入带进位信号是全加器,两位不带进位信号是半加器

串行进位(行波进位)ripple carry/并行进位(先行进位/同时进为)carry look ahead

wallace树就是利用CSA的并行进位加快累加速度。对于宽位少个数相加可用柱 形,多个少宽度可用树形结构

线性移位反馈寄存器

时序逻辑电路中的时间参数

寄存器的时间参数

  • 建立时间tsu建立时间可以称为信号保持时间,或采样时间。在时钟变化之前。
  • 维持时间thold寄存器稳定时间,在时钟变化之后。
  • 传播延时tc-q寄存器从输入到输出的时间。

站间逻辑延时tlogic

污染延时tcd

最小的传播延时

时间参数的关系

寄存器正常工作要满足tsu和thold站间逻辑应满足T>=tsu+tc-q+tlogic(max) tcdregister+tcdlogic>=thold same to: thold-tcdregister<=tlogic(min)~tlogic(max)=<T-tsu-tc-q

setup/hold/transition/spread

setup问题与hold问题 不考虑寄存器传播延时,有的话算到spread里面,spread为组合电路延时。 spread+setup<cycle 寄存器,包括组合电路,采样数据都需要时间: 寄存器采样数据的时间叫setup,在时钟延到来之前,数据必须已经稳定了setup ,这样寄存器才能采样到数据。 站间组合电路采样的时间叫hold,寄存器的数据必须能够hold一段时间,才能保 证后读的组合电路采样成功。 由于时钟网络有延时,所以 spread-时钟延时>hold

SDC(synopsys Design Constraints)

  • set 设置变量
  • create_clock 创建时钟,并指明该时钟接到哪个端口
  • create_generated_clock 设置衍生时钟,-source指定从哪个源出 来,-divide_by分频,-edges个性化分频
  • 语名块用花括号,集合(数组)用方括号
  • set_clock_uncertainty 设置时钟不稳定范围
  • set_clock_transition 设置时钟边沿的transition
  • set_case_analysis 设置综合的情况类别,数字相同的为一类
  • foreach_in_collection foreach循环
  • set_ideal_network设置理想的net模型
  • port/pin/cell/ 分别为顶层端口,子模块端口,和单元名称,这些统称为object
  • get_attribute object的属性
  • group_path 设置from和to的时序约束(-critical_range),设置权重(-weight)
  • set_clock_latency 设置时钟延时
  • set_input_delay 输入延时
  • set_output_delay 输出延时
  • set_multicycle_path 设置多周期路径
  • set_dont_touch 设置不优化的路径
  • set_clock_groups 设置同步 和 异步的时钟

verilog 技巧

准确描绘状态机与counter 要具备以时钟沿为参考的变化思想 可以使用andytiming来帮助思考

architecture

memory

TLB/MMU

  • virtual address,physical address
  • 页/硬盘扇区
  • 页故障/操作系统接管
    • 软件慢,灵活性好
    • 硬件快,灵活性差
  • 页表,用来记录页的当前信息
    • 页表项
      • 虚拟页号:在页表中的偏移位置
      • 有效位:页表当前是否在存储器中
      • 脏位:程序是否已经改写该页表项,TLB中不保存脏页
      • 保护位:哪些用户可以访问该页
      • 页帧号:该页在内存中的地址
  • TLB
    • LRU算法
    • 全相联
    • 页故障 > TLB miss
    • page table walk
    • TLB 分级,一级一级比对

cache

  • 结构

    line/块是一行,组是纵向的几个line组成一组(相联度)

    • 块/line,line和块是一个意思
    • 相联度越高,cache空间利用率越高,块冲突概率越低。
    • cache有一个目录
  • 替换策略
    • LRU
    • random
    • FIFO
  • 写策略
    • 写直达(write thouth)
      • 写缓冲(write buffer)
    • 写回(write back)
      • 写回对带宽要求低
    • 写失效
      • 写分配(write allocate)
      • 不按写分配(no-write allocate),也称为绕写法(write around)
      • write back 一般用write allocate,写回一般用no-write allocate
  • cache 一致性

    cache一致性就是各处理器看到自己cache中的内容在整个存储空间中是最新的 (针对共享数据)。由于处理器之间的访问具有须序性,因些还必須数据相关性。 与处理器流水线相关性一样,主要是三种,读后写,写后读,写后写。总之就是 保证各处理器对cache进行改写后(写顺序化write serialization),不同的处 理器读出的值都是对的。

    • 共享数据组织方式
      • 目录 集中式
        • 将共享数据建一个目录。
      • 监听 分布式
        • 每个cache中的共享数据自带状态位,标识该块的状态。
        • 监听总线上的写地址,有就作废或更新。
        • 监听总线上的读地址,如果哪个处理器有最新有效的内容,就将自已的内容 返回。
        • cache状态
          • cache状态控制器
          • cache标志位
            • 复制标志位,两套标志位。
    • 保证一致性的方法
      • 写失效(write invalidate)
        • 作废拷贝,读的时候更新
      • 写更新(write update)
        • 更新拷贝,写的时候更新
      • 写失效与写更新的区别
        • 连续多个写时,写失效有优势
        • 写失效针对cache块,写更新要更新每一位
        • 写更新,后续读的延迟较小。
  • victim cache
    • L2 cache和memory之间的一个小cache
    • 全相联
    • 存放之前由于失效被替换的块
    • 仅在失效时替换时发挥作用
  • pseudo associate/column associate 伪相联/列相联cache

流水线/core

计分牌/score board

计分牌中,保存有一个计分牌。对于有个功能单元的处理器,计分牌将能尽早发 射的指令(功能单元空闲,源寄存器ready)。在写回段来检测目的操作数相关。

计分牌使得指令可以并行指行(在单条流水线,多功能单元情况下),并且是不 跳过一些指令执行。

tomasulo

tomasulo结合了计分牌和寄存器重命名技术。

  • 其中有两个表,一个表是保留站,一个表是寄存器状态(记录当前寄存器为哪条指令的目的操作数/结果)
  • CDB/公共数据总线
  • 寄存器
    • 寄存器被公共数据总线更新,或者是load/store操作,只有这两种方式。且 寄存器被CDB更新,只参考寄存器状态表。
  • tomasulo处理的指令数量与功能部件数量对应,保留站大小与保留站表的大小 实现相关。
  • tomasulo解决相关性(读后写,写后写,但不能解决写后读,写后读是处理器 的最根本矛盾),让能发射的指令都发射,之后就是在等待CDB数据。指令发射 数量的增加,这样便充分利用了功能部件。

分支预测

  • 即使有分支预测机制,还是会有分支延迟槽,因为再怎么也得到decode段才会 做分支预测。
  • 分支带来的提升=2个周期(跟据不同流水线实现而,不同,此为decode段到 excute段的长度)*分支指令比例*分支预测成功率。
  • 分支预测所带来的硬件开销是,分支预测硬件,分支预测失败flush指令开销。
  • 不同位的分支预测,带来的是不同的分支错误容忍度。分支预测是一个状态机, 一位的分支预测易变,预测永远与上一次的结果相同。二位的分支预测,相当 于一个栈,深度为二,如果栈空带表分支不成功的话,则栈不为空代表分支成 功,一次分支成功相当压栈,一次错误相当于pop出栈。必须要有连续的两次 成功或者不成功才能改变状态。
  • 分支指令有很多种,这些分支指令的记录,形成BTB,BTB中存有目标地址。
  • 位,2
  • 项,4096
  • 消除分支延迟槽的方法,BTC,BTC就是BTB中不仅有目的地址,还有目的地址 对应指令。
  • 不仅消除分支延迟槽,还消除本条分支指令,BTC中不仅存的是分支目标指令, 而且是已经译好的指令。

ROB,前瞻

tomasulo是用来处理数据相关的,但是遇到分支预测或异常会出现问题,因为分 支后的指令被提前执行并确认,而这些指令很可能由于分支预测错误而被flush。 此时需要复位这些结果,又由于tomasulo算法指令确认是乱序的,便很难定位 flush的指令。同样如果指令出现了异常,由于乱序确认,无法实现精确异常。

所以需要带ROB的tomasulo算法,顺序commit.

IO/bus

arm

coresight 400

a53

a53_trm.org

ARM体系结构概念

cortex-M3

v7m/v6m总结与对比