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] 个人博客地址

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

  1. 【资料分享】Verilog编程艺术.pdf

    本书深入地探讨了Verilog编程,分为七个部分:设计原则.语言特性.书写文档.高级设计.时钟和复位.验证之路.其他介绍.本书对这些部分做了重点的探讨:Verilog编码风格.Verilog-2001 ...

  2. 编程艺术第二十三~四章十一续:杨氏矩阵查找,倒排索引关键词Hash编码

    第二十三.四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践 作者:July.yansha.编程艺术室出品. 出处:结构之法算法之道. 前言 本文阐述两个问题,第二十三章是杨氏矩阵查找问题,第二 ...

  3. 编程艺术第二十三 四章 十一续 杨氏矩阵查找 倒排索引关键词Hash编码

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第二十三 ...

  4. Verilog 编程实验(6)-4位移位寄存器的设计与实现

    原理图: Implementation part: module ShiftRegister(q3,data_in,clk,clr);output[3:0] q3; input[3:0] data_i ...

  5. 《JSDOM编程艺术》笔记

    持续更新,gitHub地址 : https://github.com/ghCarol/demo/tree/master/Notes 目录 目录 正文 <JS&DOM编程艺术> 第四 ...

  6. DirectX5.0最新游戏编程指南 DirectDraw篇 四、DirectDraw高级特性 (转)

    DirectX5.0最新游戏编程指南 DirectDraw篇 四.DirectDraw高级特性 (转)[@more@] 四.DirectDraw高级特性 1.直接内存访问DMA   有些显示设备能够在 ...

  7. 程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法

    第三十四~三十五章:格子取数,完美洗牌算法 作者:July.caopengcs.绿色夹克衫.致谢:西芹_new,陈利人, Peiyush Jain,白石,zinking. 时间:二零一三年八月二十三日 ...

  8. Python基础十五:面向对象编程四:高级特性

    Python基础十五:面向对象编程四:高级特性 Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程 Author:yooongchun Em ...

  9. 程序员编程艺术第三十四 三十五章 格子取数问题,完美洗牌算法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十四 ...

最新文章

  1. 201406114331-黄智涛-OS 实验报告
  2. 浏览器获取文件MD5值
  3. (轉貼) ThinkPad鍵盤設計原理和哲學 (NB) (ThinkPad)
  4. Koa -- 基于 Node.js 平台的下一代 web 开发框架
  5. 2021牛客暑期多校训练营6
  6. 后勤管理系统_高校后勤设备报修管理系统_易报修系统高校后勤管理系统_免费高校后勤管理系统...
  7. HTTP Keep-Alive详解[转]
  8. 抖音品质建设 - iOS启动优化《原理篇》
  9. 好用的文本编辑器推荐
  10. 乔治华盛顿大学计算机科学专业,乔治华盛顿大学计算机专业简介
  11. [4G5G专题-38]:物理层- LTE/NR下行公共控制信道PDCCH与其承载的内容下行控制信息格式DCI
  12. android自定义组件属性,Android组合控件详解 自定义属性
  13. Rational Rose的讲解
  14. 从数据库得到的结果集存放到List集合中
  15. LaTex\TexStudio 数学矩阵
  16. vue2项目之async/await 处理 promis
  17. Mac 系统下Python多版本管理
  18. SQL Server 基本开发规范
  19. xilinx 7系列FPGA ibert笔记
  20. 静态路由完成DV协议路由过滤

热门文章

  1. 设备驱动的艺术之旅 - Watch Dog 的 NMI 应用场景
  2. mysql查询前五行_性能监控实战
  3. AutoRuns 12.03简体中文绿色单文件
  4. 北京交通大学计算机学院硕士导师,北京交通大学计算机与信息技术学院研究生导师:郎丛妍...
  5. Python中用pandas和openpyxl向Excel填入数据,不覆盖源数据和格式
  6. 高中计算机会考考试时间多久,高二会考一般什么时候考试
  7. 【原创】Scrum中Product Backlog和Sprint Backlog的区别
  8. I Love Palindrome String HDU - 6599 回文树+hash
  9. Vue父子组件互相通信实例
  10. 易基因项目集锦|易基因科技6篇SCI成果大公开,篇篇IF>5