Verilog编程艺术(3)——第四部分 高级设计

Verilog编程艺术(3)

状态机设计(FSM)

状态机类型

状态机通常分为两种类型:Moore 和 Meadly。
对于Moore FSM,输出是当前状态的函数;
而对于Meadly FSM,输出则是当前状态和输入的函数。

状态机编码方式

FSM的状态编码通常分为两种:二进制(Binary) 和独热码(One-hot)。
在二进制编码的 FSM 中,用于状态编码的就差年起个数只需要满足能够把FSM的状态编码出来即可,即等于clog2(number_of_states),就是对状态数目取以2为底的对数,然后再向上取整。
在独热码编码的 FSM 中,每一个状态对应一个寄存器,而且在任意时刻只能有一个寄存器被置位,以表示当前状态(Hot状态)。
例如对于一个有16个状态的 FSM,二进制编码需要4个寄存器,而独热码需要16个寄存器;但是FPGA Vector推荐使用 One-hot FSM,因为在FPGA中寄存器资源丰富且One-hot FSM 较 Binary FSM运行得快。

Binary FSM

(1)FSM设计的最好方法是使用两个 always 块:一个用于时序状态寄存器;另一个用于组合状态逻辑,计算下一个状态(Next)和输出逻辑(Output logics)。
(2)重要的编码规则

  1.在模块内使用 localparam 定义状态编码,并且使用这些编码而不是使用这些编码的数值。
  2.在 localparam 之后声明 state 和 next 变量。
  3.在时序 always 块中使用非阻塞幅值。
  4.在组合 always 块中使用阻塞幅值。
  5.在组合 always 块中使用 always@(*) 语句,简化代码设计。
  6.在组合 always 块的上部,把默认值赋值给next和变量。在case语句内,只有把当输出赋值不是默认值时,输出赋值才需要做出改变。这样可以避免生成Latch,可以减少case语句中逻辑的数量,可以强调case语句中每个输出的变化。
  7.对于状态转换图中的每个转换(if、if-else或else),在组合 always 块都要有对应的if-else语句,要数目相等、逻辑一致。
  8.为了便于阅读和调试,所有的next赋值要对齐到同一列上,可以通过空格的方法实现。

(3)在always块敏感列表下,把默认值赋值给next是最有效的编码风格,然后在case语句中再把next更改为其他值。一般来说,next的默认赋值有以下三种。

  1.赋值为 x (Unkown),便于调试。
  2.赋值为当前的状态 state,可以减少代码的书写。
  3.赋值为一个预定的恢复值(Prederermined recovery),如IDLE。

One-hot FSM

独热码编码FSM是高效的,小且快。其使用反向case的编码方法,就是在case的头部使用case(1’b1)语句,每个case item则是一个用于判断true或false的表达式。
独热码编码FSM最关键的要点是localparam不是表示状态的编码,而是表示状态向量的索引。注意,对于state和next向量,case对 One-hot状态的比较和赋值都是针对1-bit的。

寄存器输出

在 FSM 设计中使用寄存器输出可以保证输出没有毛刺,而且通过把模块的输入和输出约束标准化,可以得到更好的综合结果。
在两个always块中,加入第3个always时序块来实现寄存器输出,就是在时序有效沿处依据next的值,产生输出赋值。


可配置设计

可配置模块的设计方法如下

  1.使用 parameter 和 'define。
  2.使用for语句生成多条语句。
  3.使用generate、for、if等语句生成多条语句和多个实例化。
  4.通过工具或脚本生成配置参数。
  5.通过工具或脚本直接生成Verilog代码。

注意:书中这部分的例子很有价值,值得阅读和复现。


ABM设计

在设计BusMatrix(高效的片上总线架构)的时候,需要考虑下面的一些特点。

  1.输入输出端口的数目会产生变化,例如增加1个master,减少2个slave。
  2.每个master对这些slave都有不同的访问权限,而且在设计期间master对slave的访问矩阵会随时发生变化。
  3.当多个master同时访问同一个slave时,那么这些master就有优先级的关系,优先级高的master先执行。

注:在设计系统是这些变化随时会发生,当有变化时,我们应该马上产生新的BusMatrix。
另外,也要考虑把这个BusMatrix生成系统做成IP,这样可以方便维护和移植。


可测性设计(DFT)

可测性包括两个方面:一是可控制性(Controllability),即使为了检测处故障和缺陷,能否方便地对集成电路施加测试向量;另一个是可观性(Observablity),就是能否容易地对集成电路查看测试结果。

内部扫描

内部扫描通过在设计中插入扫描链(Scan chain),检测芯片内短路、开路、连线和器件延迟等缺陷。内部扫描可以减少芯片的测试成本,是目前最理想的结构故障测试手段。
内部扫描既可以自动生成测试向量(Automatic Test Pattern Generation,ATPG),也可以预测测试故障覆盖率(Fault coverage)。这样设计者就可以创建高度可测的设计,同时又不需要花费大量的工程精力和测试时间。EDA工具能够自动地为设计插入内部扫描,如Synopsys的DFT Compiler。EDAI具也能够自动地为内部扫描生成测试向量,如Synopsys的TMAX。
内部扫描要求每个时序单元(F1ip-fo即)处于可控制和可测试的状态。只有这样才能把它替换成应的扫描单元,才能保证测试故障覆盖率。为了保证电路中的每个时序单元都符合要求,在插入链之前要做设计规则检查(Design Rule Check,DRC),为了可控制和可观测,内部扫描把设计中的时序单元替换为可串行移位的时序单元,这样就在规很少的写引脚(I/O)情况下增强了内部单元的可控制性和可观测性。

支持扫描的时序单元被串接到一起,形成一条或多条串行移位寄存器,称为扫描链。扫描链中的时序单元是扫描可控的和扫描可观测的。
扫描可控是指时序单元可以被串行移位入一个指定值,ATPG工具认为扫描可控的单元是pseudo-primary inputs。
扫描可观测是指时序单元的值可以被串行移出并被观测到,ATPG工具认为扫描可观测的单元是pseudo-primary outputs。
内部扫描会使芯片的面积和功耗有稍微的增加,会使性能有一些稍微的降低,但是DFTCompiler会努力减少这些影响。
内部扫描通过把复杂的时序逻辑分割成隔离的组合单元块(full-scan设计)或半隔离的组合单元快(Partial-scan设计),简化测试向量的生成。在full-scan设计中,所有的时序单元都被替换成可串行移位的时序单元,那些不能被扫描的时序单元则被当做黑盒子。

在做内部扫描测试的时候,一般也做IDDQ测试。IDDQ测试的原理就是检测CMOS电路静态时的漏电流(Leakage current),电路正常时静态电流非常小(nA级),电路存在缺陷时(如栅氧短路或金属线短接)静态电流就大得多。如果用DDQ方法测出某一电路的电流超常,那么就意味着此电路可能存在缺陷。DDQ测试并不能代替功能测试,一般只作为辅助性测试。DDQ测试也有其不足之处,一是需要选择合适的测量手段,二是对于深亚微米技术,由于亚阈值元件的增加,静态电流已经高得不可区分。

我们在设计功能逻辑RTL的时候,就要考虑到内部扫描测试,要为它们添加旁路(Bypass)逻辑和停止逻辑,这样就可以在综合和STA的时候考虑到这些电路对时序和面积的影响。

  1.要能控制所有寄存器的时钟和异步复位,所以要把时钟和复位信号旁路连接到外部引脚上。
  2.要让Hard Macro进入停止状态。例如,让RAM和ROM的CEN处于无效状态,让PLL、CODEC和USB PHY等处于停止状态。这样在测量IDDQ时,IDDQ才能准确地反映芯片的静态电流。
  3.不要把时钟信号当做触发器的输入信号使用,不要让三态总线出现冲突。

内建自测

内建自测就是BIST(Built–in Self Test),在设计的芯片中加入一些额外的自测试电路,测试时只需要从外部施加必要的控制信号,运行内建的自测试硬件和软件,检查被测电路的缺陷和故障。和内部扫描不同的是,内建自测的测试向量一般是由内部自动生成的,而不是从外部输入的。内建自测可以简化测试步骤,而且无需昂贵的测试仪器和ATE设备,但它也增加了芯片的面积和设计的。
BIST常用于内存(Memory)的测试。

边界扫描

边界扫描就是BSD(Boundary Scan Design),是为了解决PCB上芯片间互连测试而由JTAG(Jiont Testable Action Group)提出的一个解决方案。l990年正式被EEE采纳成为一个标准,即EEE1149.1,该标准规定了边界扫描的测试端口、测试结构和操作指令。
边界扫描的基本原理是在器件内部的核心逻辑与I/O引脚之间插入边界扫描单元,它在芯片正常工作时是“透明”的,不影响电路板的正常工作。边界扫描单元以串行方式连接成扫描链,通过扫描输入端将测试矢量以串行扫描的方式输入,对相应的引脚状态进行设定,实现测试矢量的加载;通过扫描输出端将系统的测试响应串行输出,进行数据分析与处理,完成电路系统的故障诊断及定位。BSD生成工具主要有Mentor Graphics BSD Archit和Synopsys BSD Compiler等。


参考

[1] 《Verilog 编程艺术》 魏家明 编著
[2] 个人博客地址

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值