Learning Path
浏览 开发笔记 相关教程与章节。
社区笔记、经验文章、测验题库与零散教程入口。
教程
1237
关键词:时钟源,时钟偏移,时钟抖动,时钟转换时间,时钟延时,时钟树,双边沿时钟 几乎稍微复杂的数字设计都离不开时钟。时钟也是所有时序逻辑建立的基础。前面介绍建立时间和保持时间时也涉及过时钟偏移的概念。下面将总结下时钟的相关知识,以便更好的进行数字设计。 时钟源 根据时钟源在数字设计模块中位置的不同,可以将时钟源分为外部时钟源和内部时钟源。 外部时钟源: RC/LC 振荡电路:利用正反馈或负反馈电路产生周期性变化时钟信号。此类时钟源电路..
不经意间看到几年前自己写的 FGPA 设计,代码风格勉强说的过去,但是逻辑设计方面的安全隐患比比皆是。许多初学者编写 Verilog 代码,基本都是按照 C 语言的思维和风格去设计,造成了很多不规范的共性问题。 本节主要总结一些不规范且危险的 Verilog 设计。主要针对可综合的数字设计,testbench 是仿真程序,一般情况下要求不是很严格。 代码规范要讲述的内容与编码风格是不一样的。编码风格只是建议,设计者可以不按照本教程编..
良好的编码风格,有助于代码的阅读、调试和修改。虽然 Verilog 代码可以在保证语法正确的前提下任意编写,但是潦草的编码风格往往是一锤子买卖。有时回看自己编写的代码,既看不出信号的意义,也不了解模块的功能,还得从逻辑上一步步分析,就会消耗大量的时间和精力去消化,严重影响设计进度。 为了不让别人或自己由衷的感叹出:这特喵的是哪个“小傻宝”写的代码!下面对编码风格进行一定意义上的建议。 关于命名 信号变量、模块等一定要使用有意义的名字,且..
关键词: 分布延迟, 集总延迟, 路径延迟 之前大部分仿真都是验证数字电路功能的正确性,信号传输都是理想的,没有延迟。但是实际逻辑元器件和它们之间的传输路径都会存在延迟。因此,必须检查设计中的延迟是否满足实际电路的时序约束要求。可以用时序仿真的方法来检查时序(timing),即在仿真时向元件或路径中加入和实际相符的延迟信息,并进行相关计算来确定时序是否满足。 静态时序分析 (Static Timing Analysis, STA),也是..
关键词:$display, $write, $strobe, $monitor Verilog 中主要用以下 4 种系统任务来显示(打印)调试信息:$display, $write, $strobe, $monitor。 $display $display 使用方法和 C 语言中的 printf 函数非常类似,可以直接打印字符串,也可以在字符串中指定变量的格式对相关变量进行打印。例如: $display('This is a ..
信号从快时钟域传输到慢时钟域来时,需要根据信号的特点来进行同步处理。对于单 bit 信号,一般可按电平信号和脉冲信号来区分。 电平信号同步 同步逻辑设计中,电平信号是指长时间保持不变的信号。保持不变的时间限定是相对于慢时钟而言的。只要快时钟的信号保持高电平或低电平的时间足够长,以至于能被慢时钟在满足时序约束的条件下采集到,就可以认为该信号为电平信号。 既然电平信号能够被安全的采集到,所以从快时钟域到慢时钟域的电平信号也采用延迟打拍的方..
FIFO(First In First Out)是异步数据传输时经常使用的存储器。该存储器的特点是数据先进先出(后进后出)。其实,多位宽数据的异步传输问题,无论是从快时钟到慢时钟域,还是从慢时钟到快时钟域,都可以使用 FIFO 处理。 FIFO 原理 工作流程 复位之后,在写时钟和状态信号的控制下,数据写入 FIFO 中。RAM 的写地址从 0 开始,每写一次数据写地址指针加一,指向下一个存储单元。当 FIFO 写满后,数据将不能再写..
Verilog 提供了很多可以对文件进行操作的系统任务。经常使用的系统任务主要包括: 文件开、闭:$fopen, $fclose, $ferror 文件写入:$fdisplay, $fwrite, $fstrobe, $fmonitor 字符串写入:$sformat, $swrite 文件读取:$fgetc, $fgets, $fscanf, $fread 文件定位:$fseek, $ftell, $feof, $frewind 存储..
关键词: 门延迟, D 触发器 门延迟类型 前两节中所介绍的门级电路都是没有延迟的,实际门级电路都是有延迟的。 Verilog 中允许用户使用门延迟,来定义输入到其输出信号的传输延迟。 门延迟类型主要有以下 3 种。 上升延迟 在门的输入发生变化时,门的输出从 0,x,z 变化为 1 所需要的转变时间,称为上升延迟。 下降延迟 在门的输入发生变化时,门的输出从 1,x,z 变化为 0 所需要的转变时间,称为下降延迟。 ..
关键词:三态门, 上下拉, 选择器 门级建模,是使用基本的逻辑单元,例如与门,与非门等,进行更低级抽象层次上的设计。与行为级建模相比,门级建模更注重硬件的实现方法,即通过连接一些基本门电路去实现多种逻辑功能。虽然行为级建模最后也会被综合成基本的门级电路网络,但对于复杂的设计来说,行为级建模的效率远远高于门级建模。所以目前 Verilog 大多数用于描述数字设计的行为级层次(RTL),一般只注重设计实现的算法或流程,而不用特别关心具体的硬..
Verilog 主要用于数字电路设计的描述,但不是所有的描述方式都可以被综合成实际的硬件电路。例如一些用于仿真验证的关键字,属于仿真验证语言,只能在仿真时使用,不能被综合成电路,如系统任务 $dsiplay, initial 语句等。所以使用 Verilog 设计数字电路时,一定要注意电路的可综合性。testbench 可以随心所欲,只要能构造出需要的仿真激励条件即可。 可综合与不可综合结构 所有综合工具都支持的结构 结构类型关键字描..
关键词:MOS, CMOS, 双向开关, PAD 开关级建模是比门级建模更为低级抽象层次上的设计。在极少数情况下,设计者可能会选择使用晶体管作为设计的底层模块。随着电路设计复杂度及相关先进工具的出现,以开关为基础的数字设计慢慢步入黄昏。目前,Verilog 仅仅提供了用逻辑值 0、1、x、z 作为相关驱动强度的数字设计能力,因此,Verilog 中晶体管也仅被当做导通或截止的开关。 MOS 开关 MOS 开关有 2 种,用如下关键字声..
本教程经常有提及综合这个词语。或者说有些逻辑不能综合成实际电路,或者说有些逻辑设计综合后的电路会有一些安全隐患。本章就简单介绍下逻辑综合的相关知识,仅从理论层次和普遍认知的角度来阐述。待那个懵懂求知少年变成中年秃顶大叔,再来介绍逻辑综合的具体实践。好像也没有多少时日了(手动狗头)。 基本概念 综合,就是在标准单元库和特定的设计约束基础上,把数字设计的高层次描述转换为优化的门级网表的过程。标准单元库对应工艺库,可以包含简单的与门、非门等..
关键词:开关功耗,内部功耗,静态功耗 功耗影响 便携性 功耗越低,同等电量下电子产品工作时间越长,便携性设备的电池容量和体积设计的困难度也会降低。例如,手机越做越薄,性能还不受影响,就是因为低功耗设计发挥了至关重要的作用。 性能 功耗越大,耗能越多,产生的热量越多,各器件的工作性能就会受到影响。例如,手机使用时间较长时,会感觉手机发热,而且各应用软件也会出现卡顿的现象。 成本 不考虑低功耗设计时,一个功能的实现方法可能较为繁琐,实现的..
编写代码前,在系统与架构层次上制定完善低功耗方案,可以节省 50% 以上的功耗。此类低功耗设计和代码描述基本没有关系,往往由系统和架构人员进行设计。此类人员需要较丰富的硬件经验,能对系统有一个良好的整体把握。方案制定后,再交予功能设计人员(例如 IC 前端设计、FPGA 工程师等)实现。 多电压技术 一般来说,电压越低,功耗越低,但是性能往往会越差。综合功耗与性能的考虑,可以对不同的模块采用不同的电压设计。 多电压技术主要有 3 种:..
仿真控制:$finish, $stop 系统任务调用格式任务描述退出仿真$finish( type ) ;结束仿真,参数 type 可选择退出仿真时是否打印信息type=0: 直接退出不打印type=1: 打印仿真时间和该语句所在的位置行信息type=2: 打印仿真时间、位置、存储器和 CPU 时间的使用情况暂停仿真$stop( type ) ;暂停仿真,用法格式与 $finish 相同 $finish 与 $stop 都有让仿真停止..
进行数字设计时,经常会遇到特殊的情况,Verilog 中的任务和函数已经不能满足仿真需求,需要自定义一些系统任务和函数。编程语言接口(PLI, Program Language Interface)提供了一套接口子程序,用于访问设计内部的数据结构,并可以提取仿真环境信息。用户可以调用这些子程序,自定义系统任务和系统函数,与设计内部数据以及 Verilog 仿真器环境进行交互。 PLI 功能 通俗来讲,Verilog PLI 提供了一套..
随机数 Verilog 中使用系统任务 $random(seed) 产生随机数,seed 为随机数种子。 seed 值不同,产生的随机数也不同。如果 seed 相同,产生的随机数也是一样的。 可以为 seed 赋初值,也可以忽略 seed 选项,seed 默认初始值为 0。 不使用 seed 选项和指定 seed 并对其修改来调用 $random 的代码如下所示: 实例 [mycode4 type='verilog'..
关键词 :定点数, 浮点数, $realtobits, $bitstoreal 本节主要介绍实数与整数间相互转换的函数:$realtobits, $bitstoreal,同时说明下 real 型 (同 C 语言中的 double float)变量是怎么用多位宽的二进制码表示的。 二进制表示小数 二进制表示小数 十进制整数用二进制来表示时,需要进行数据除以 2 然后取余的操作。 小数部分用二进制来表示时恰好相反,需要进行数据乘以 2 然..
关键词: 同步复位, 异步复位 为确保系统上电后有一个明确、稳定的初始状态,或系统运行状态紊乱时可以恢复到正常的初始状态,数字系统设计中一定要有复位电路模块。复位电路异常可能会导致整个系统的功能异常,所以在一定程度上,复位电路的重要性也不亚于时钟电路。 复位电路可分类为同步复位和异步复位。 同步复位 同步复位是指复位信号在时钟有效边沿到来时有效。如果没有时钟,无论复位信号怎样变化,电路也不执行复位操作。 同步复位的典型代码描述如下: ..
下表显示了在数字设计的各个层次上可减少功耗的百分比。RTL 级之后,功耗的减少量已经非常有限。 设计层次改善程度系统级50% ~ 90%RTL 级20% ~ 50%门级10% ~ 15%晶体管级5% ~ 10%版图级< 5% 作为一个编写 Verilog 的伪码农,系统级减少功耗的工作也可参与一些,但重点应该放在 RTL 级来减少功耗。 下面就分 2 节来介绍从 RTL 级来减少功耗的常用方法。 并行与流水 对于一个功能..
门控时钟 通常情况下,时钟树由大量的缓冲器和反相器组成。而时钟信号为设计中翻转率最高的信号,时钟树的功耗可高达整个设计功耗 30%。加入门控时钟(clock gating)电路,可减少时钟树的开关行为,能节省开关功耗。同时,时钟引脚开关行为的减少,寄存器的内部功耗也会减少。所以,采用门控时钟,可以有效地降低功耗。 实现原理 通俗来讲,当模块或触发器不工作时,将时钟关闭而不影响正常功能的逻辑,可以称之为门控时钟逻辑。此时时钟并不是一直存在..
关键词: 延迟反标注, SDF 延迟反标注是设计者根据单元库工艺、门级网表、版图中的电容电阻等信息,借助数字设计工具将延迟信息标注到门级网表中的过程。利用延迟反标注后的网表,就可以进行精确的时序仿真,使仿真更接近实际工作的数字电路。 延迟反标注过程 前面教程中的仿真基本都是功能性的仿真。无论是进行 IC 设计还是 FPGA 开发,时序仿真都是必不可少的。《Verilog 教程》的《1.4 Verilog 设计方法》章节中也描述了完整的..
关键词: 建立时间, 保持时间 对于数字系统而言,建立时间(setup time)和保持时间(hold time)是数字电路时序的基础。数字电路系统的稳定性,基本取决于时序是否满足建立时间和保持时间。所以,这里用一整节的篇幅,来详细的说明建立时间和保持时间的概念。 基本概念 建立时间就是时钟触发事件来临之前,数据需要保持稳定的最小时间,以便数据能够被时钟正确的采样。 保持时间就是时钟触发事件来临之后,数据需要保持稳定的最小时间,以便数..