数字IC系统RTL实现ppt课件.ppt
《数字IC系统RTL实现ppt课件.ppt》由会员分享,可在线阅读,更多相关《数字IC系统RTL实现ppt课件.ppt(170页珍藏版)》请在三一办公上搜索。
1、第三章数字IC系统的逻辑设计RTL实现,3.1 RTL设计基础3.2 RTL设计指南(Verilog),3.1RTL设计基础3.1.1同步电路设计要求RTL设计都采用同步电路设计方式。 了解同步电路设计要求, 是进行RTL设计的第一步。 图3.1给出了一个同步电路的示例。,图 3.1同步电路示例,组合逻辑实现设计所需的功能。 例如, 图中的组合逻辑可能是乘法、 编码器等复杂的逻辑。 寄存器用于暂存数据, 它由时钟控制, 只有当时钟进行有效跳变时, 才将新的数据锁存起来, 否则数据一直保持原值。 时钟相当于同步电路中的“指挥”。 对于图3.1所示的例子, 假设该电路都采用时钟的上升沿进行锁存,
2、时钟周期为8 ns。 从0时刻开始, 时钟变为高电平。,第一个寄存器中, 经过很短的时间(例如0.2 ns)到达Ri的Q端, 再从Q端送到组合逻辑的输入, 跟其他的信号一起进行逻辑操作。 这种逻辑操作必须在规定的时间内完成(满足时钟周期的要求)。 假设组合逻辑的结果在4 ns后稳定下来,则在4.2 ns这一时刻,Rf输入端的数据会稳定下来。 这时候电路暂时“静止下来”。 然后到8 ns这一时刻, 第二个时钟沿到来, 组合逻辑的输出被第二个寄存器锁存, 与此同时, 新的数据会被送到第一个寄存器。 这个过程会一直持续下去。,由此可见, 在图3.1所示的电路中, 时钟保证了电路能按照需要动作, 而不
3、是杂乱无章地各行其是。 下面先简单介绍一下时钟。 时钟一般由晶振产生, 或者由外部输入, 如果需要, 还需要用锁相环进行倍频、 移相等操作。 实际的时钟不可能是理想的, 也就是说, 时钟不可能一直保持同一频率, 时钟边沿不可以“直上直下”。 设计者要根据芯片的要求对时钟提出要求, 并根据时钟规范进行设计。,例如, 假设需要将时钟域A中的数据传递到时钟域B。 数据由clka生成, 被clkb采样。 clka与clkb是异步时钟, 周期都是10 ns, 时钟频率最大为210-4。 这时候我们需要设计一个异步FIFO。 这个FIFO的写入时钟为clka, 读出时钟为clkb。 假设每次传送的最大包为
4、10 KB, FIFO宽度为8位, 那么这个FIFO的深度应该是多少呢?考虑最坏情形, 时钟clka与clkb最大相差为410-4。,FIFO的读指针与写指针至少要相差: 410-410 K4。 这样, FIFO的深度至少为8字节。 接下来, 我们对时序电路中最关键的组成部分寄存器进行说明。 一个寄存器的结构如图3.2所示。,图 3.2寄存器的结构,图 3.3寄存器的功能示意图,寄存器的功能如图3.3所示。,由图3.3可知, 该寄存器在时钟的跳变沿锁存数据, 然后数据会一直保持, 直到下一个跳变沿。 寄存器要正常工作, 必须保证D端数据的变化与时钟的有效沿不能距离太近, 否则可能会锁存错误的数
5、据。 在综合库中, 规定了数据变化端跟时钟跳变沿最短的时间要求, 称为建立时间约束与保持时间约束。建立时间与保持时间是时序电路设计中最重要的两个概念。 建立时间规定, 在时钟沿到达前的某段时间内, 数据必须稳定; 保持时间定义了在时钟沿之后的某段时间之后, 数据才能发生变化。 图3.4给出了建立时间与保持时间的示例。,图 3.4建立时间与保持时间,一般来说, 设计中路径的延时过大, 超出设计要求, 会引起建立时间的违例。 如果设计中时钟树做得不够好, 时钟偏移(skew)过大, 则会引起保持时间违例。 对于一个寄存器来说, 除了数据端与时钟端有时序要求, 异步复位端与时钟端之间也有时序要求。
6、假设一个寄存器是异步复位的, 复位信号低电平有效。 当复位信号为低电平时, 寄存器被初始化。,当复位信号跳高时, 寄存器在时钟跳变沿锁存新的数据。 如果异步复位信号跳高的时刻距离时钟有效沿太近, 那么寄存器可能继续保持复位状态, 也可能会锁存新数据, 这样, 就可能发生锁存错误。 因此, 有必要定义时钟有效沿与异步复位无效沿之间的时序要求, 这就是recovery/removal的时序要求, 如图3.5所示。,图 3.5 recovery/removal,寄存器中建立时间/保持时间、 recovery/removal的时序要求, 对设计的最大组合逻辑延时、 时钟树的构造、 复位树的构造都提出了
7、要求。 复位树、 时钟树一般由后端工具进行处理。 对RTL设计者来说, 最需关注的是建立时间的问题。 设计中的时序违例通过静态时序分析工具可以检查出来。 本书第7章对静态时序分析进行了说明, 这里不再详述。 ,3.1.2RTL设计步骤如何进行RTL设计?RTL设计并非仅仅编写代码那么简单。 在RTL设计前, 要进行如下工作: (1) 仔细阅读设计规范, 了解设计的要求, 例如芯片的I/O采用何种标准, 有多少PIN脚, 采用何种封装形式, 时序要求是多少, 是否需要与其他已有的产品兼容等, 规范越清楚越好。 ,(2) 了解芯片中是否用到其他IP, 这些IP是否满足功能与性能的要求, 这些IP是
8、否经过了验证, 如何与这些IP进行接口, 这些IP是软核还是硬核。(3) 了解芯片是否需要与其他产品进行兼容, 包括与其他厂商的芯片进行兼容, 是否与以前的产品兼容。 兼容性会影响到芯片的功能、 寄存器设置、 PIN脚分配等。 (4)了解流片所用的工艺及综合库。 高水平的RTL设计者必然熟悉综合库, 知道综合库中各单元能够提供怎样的性能, 从而了解在设计中的一个路径上, 最多可以放多少逻辑。,例如, 一个设计要求能运行在时钟频率100 MHz, 而所用的综合库中一个二输入与非门的延迟大约为0. 2 ns, 则一条路径上差不多可以放50个与非门。 有了这种知识, 设计者可以写出更为合理的代码。
9、特别是对于数据通路设计, 对综合库的了解是很有必要的。 (5)了解芯片的外部接口。 例如, 与模拟部分接口是怎么样的, 接口信号的确切含义是什么, 系统是否有PCI或AGP之类的高速接口, 这些接口需要自己来实现还是由IP来实现。,(6) 了解芯片的时钟。 要了解芯片中有多少个时钟, 每个时钟的用途是什么, 这些时钟来自锁相环还是由其他芯片提供, 这些时钟有无相位关系, 频率是多少以及时钟的偏差有多大, 芯片中是否有分频时钟。(7) 了解芯片对功耗的要求, 以决定是否采用低功耗设计技术, 以及采用何种低功耗设计技术。 低功耗设计技术的基本思想是尽量减少设计中的节点的翻转, 例如可以采用并行计算
10、来降低时钟频率、 时钟门控(针对模块或寄存器阵列), 等等。 我们将在第9章对低功耗设计技术进行详述。 ,(8) 了解芯片对可测性的要求。 设计者要了解芯片是采用全扫描还是部分扫描, 是否采用内建自测试的方式, 是否需要JTAG, 这些对RTL设计都有影响。 例如, 扫描链的测试覆盖率受限于RTL设计风格。 我们将在第6章讲述可测性设计的内容。 在进行RTL设计时, 要进行如下工作: (1) 首先划分好设计的结构。 通常来说, 一个设计可以大致分为如下几个部分: I/O Pad、 时钟生成电路、 复位电路、 JTAG电路、 内核, 如图3.6所示。,图 3.6芯片的划分示意图,当然, 芯片划分
11、跟具体设计有关, 要根据实际情况选择合适的划分方法, 不可一概而论。 (2) 要与项目组的其他成员进行有效的沟通。 要与市场人员进行交流以确定产品的功能; 要与其他设计者交流以确定设计的命名规则、 模块划分、 各模块的接口, 等等。 能否进行有效的沟通是一个项目能否成功的关键。 (3) 为项目建立统一的目录结构。 项目的所有成员都在该目录下进行设计。 (4) 统一进行版本控制。 相信每个完成过较大设计的人都能体会版本控制的重要性。 ,在本书附录中对版本控制软件CVS进行了介绍。 (5) 进行合理的模块划分。 要考虑到逻辑功能、 设计目标、 时序方面的要求, 尽量将功能相关的模块放在一起, 以减
12、少各模块间的相关性, 方便以后的综合及布局布线。 按功能划分可以保证设计具有清晰的结构, 并有利于分配给不同成员完成。 (6) 建立统一的验证平台。 同一项目组的不同成员最好使用统一的测试验证框架, 然后分别施加自己的激励。 如果RTL设计开始前已完成了系统设计, 则可以利用系统设计的模型作为RTL设计验证的基准。 测试平台最好在项目初期就建立好。,(7) 考虑芯片的调试方案。 在第一次流片回来后, 需要对芯片进行调试。 由于现在的IC系统规模较大, 功能复杂, 容易出错, 因此调试方案的制定就非常关键。 在设计初期就应该考虑好调试方案。 为了便于定位错误, 设计者应将主要的功能模块分开进行测
13、试。 例如, 对于一个通信芯片, 要能够分别调试模拟部分、 数字信号处理部分和MAC部分。 在大型的设计中, 引脚总是非常宝贵的, 设计者要精心设计引脚的复用方案, 确定这些引脚在正常工作模块、 调试、 DFT时各有什么功能。 引脚分配方案要以文档的形式给出。 ,(8) 给出设计文档。 很遗憾, 在许多项目中都没有做到这一点。 人们往往等到项目结束后, 才开始写设计文档。 (9) 在写每个模块时, 最好能给出框图, 一图胜千言。 ,3.1.3复位策略在RTL设计中, 是采用同步复位的方式还是异步复位的方式?这种争论由来已久, 本节将对这个问题进行阐述。 在IC系统中, 复位的目的是为了将芯片强
14、制到一个已知的状态。 同步复位与异步复位都能达到这个目的。 两者的差别在于: 同步复位需要时钟有效沿到达时才能起作用, 而异步复位不需要。 ,图 3.7同步复位示例,在同步复步方式, 复位信号与数据进行组合操作, 作为寄存器的D端输入, 如图3.7所示。 实现同步复位寄存器的代码如下: module reg-syn (q1, d, clk, rst-n);output q1;input d, clk, rst-n;reg q1;always (posedge clk)if (!rst-n) q1 = 1b0;else q1 = d;endmodule,同步复位的优点在于: 在采用基于周期的仿真
15、器的场合(利用开发算法时), 采用同步复位要比采用异步复位简单许多。 寄存器可以滤掉复位上的毛刺。 同步复位的缺点是: 需要时钟, 在某些场合这会带来不便。 例如, 假如设计中包含三态总线, 总线上接着许多寄存器。 当上电后, 晶振还未起振, 或者锁相环还未稳定, 这时候没有时钟, 所以复位还没有起作用则总线上就可能发生冲突, 产生短路。 只有增加上电复位电路才能解决这个问题。 ,采用同步复位, 复位成为路径中组合逻辑的一部分。 由于复位的负载比较大(设计中寄存器数目较多), 因此会使复位树的延迟比较大, 从而导致在路径上的延迟较大。说明:上电复位电路中包括一个门限比较电路。 当电平超过某一电
16、平时, 会给出复位信号。 实现异步复位寄存器的代码如下: module async-resetFF (q, d, clk, rst-n);output q;input d, clk, rst-n;reg q;,always (posedge clk or negedge rst-n)if (!rst-n) q = 1b0;else q = d;endmodule 异步复位的优点是无需时钟, 且复位延时不会影响到路径延时。 异步复位的缺点是: 复位上的毛刺不能被由它复位的寄存器过滤, 必须采用其他的方法来消除; 复位的无效沿与时钟之间存在时序要求(recovery/removal)。 ,如果能够
17、将同步复位与异步复位的优点结合起来, 则显然是最佳的方案。 图3.8给出了一种方案, 即有效沿异步、 无效沿同步的复位方式。,图 3.8复位方案,在这种方案中, 复位信号由同步器生成。 复位同步器由两个寄存器组成, 其组成方式如图3.8所示。 外部的异步复位信号(来自PAD)接到同步器的异步复位端。 第一个寄存器的数据端接高电平(针对低电平有效的复位信号); 第二个寄存器的数据端接第一个寄存器的Q端。同步器的输出(即第二个寄存器的输出)作为生成的复位信号, 经过复位树接到各个寄存器上。,该电路的原理是: 当复位信号有效时(低电平), 两个同步器都为低, 因此同步器的输出立即变低, 而不管此时是
18、否存在时钟。 而当复位信号变高后, 经过时钟跳变沿后, 才能将高电平锁存到同步器的输出, 也就是说, 同步器的输出的无效沿与时钟是同步的。 这样, 就避免了recovery/removal问题。 复位同步器的波形如图3.9所示。 ,图 3.9复位同步器的波形,实现复位同步器的RTL代码如下: module async-resetFFstyle2 (rst-n, clk, asyncrst-n);output rst-n;input clk, asyncrst-n;reg rst-n, rff1;always (posedge clk or negedge asyncrst-n)if (!asy
19、ncrst-n) rst-n, rff1 = 2b0;else rst-n, rff1 = rff1, 1b1;endmodule,在上述方式中, 复位信号的毛刺仍然无法消除。 为了去掉毛刺, 通常先将由PAD得到的复位信号送到去毛刺电路。 下面给出一种实现方法: / filtering glitch of resetalways (posedge clk-i )glbl-rst-dly3, glbl-rst-dly2, glbl-rst-dly1 = glbl-rst-dly2, glbl-rst-dly1, rst-n-hw;always (posedge clk-i)glbl-rst-n
20、-noglitch= glbl-rst-dly3 | glbl-rst-dly2 |glbl-rst-dly1;,3.1.4状态机的设计在生成复杂的控制逻辑时, 普遍采用状态机的方式。 掌握良好的状态机书写规范, 是对RTL设计者最基本的要求。 图3.10给出了状态机的基本结构。,图 3.10状态机的基本结构,写状态机代码时, 可以采用单进程的方式(用一个always进程), 也可以采用双进程的方式(即采用两个always进程, 一个用于生成图3.10中的next, 一个用于生成图3.10中的state)。 一般而言, 用双进程状态机, 结构更为清晰, 因此在实际应用中应尽量采用这种方式。 图
21、3.11给出了一个状态机的状态转换图。 ,图 3.11状态转换图,针对如图3.11所示的状态转换图, 下面给出双进程状态机的写法。 module fsm1 (ds, rd, go, ws, clk, rst-n); output ds, rd; input go, ws; input clk, rst-n; reg ds, rd; parameter 1:0 IDLE=2b00, READ=2b01, DLY=2b10, DONE=2b11;,reg 1:0 state, next;always (posedge clk or negedge rst-n) if (!rst-n) state
22、= IDLE; else state = next;always (state or go or ws) begin next=2bx; ds=1b0; rd=1b0; case (state) IDLE: if (go) next=READ; else next=IDLE;,READ: begin rd=1b1; next=DLY; end DLY: begin rd=1b1; if (ws) next=READ; else next=DONE; end DONE: begin ds=1b1; next=IDLE; end endcase endendmodule,注意:程序中用黑色字体标出
23、的一句代码“next=2bx”。 加入这种语句, 是为了便于发现设计中的错误。 如果设计者在写描述机时, 没有将可能的状态遍历完整, 则next可能会进入x状态, 通过仿真可以很容易发现这个问题。 在上面所述的状态机中, 输出信号由组合逻辑输出。 为了保证设计的健壮性(消除输出的毛刺), 方便时序分析、 综合及布局布线, 通常需要将状态机的输出用寄存器锁存。 图3.12给出了这种状态机的示意图。,图 3.12状态机示意图(输出锁存),下面给出这种状态机(输出锁存)的代码实现:module fsm1b (ds, rd, go, ws, clk, rst-n); output ds, rd; in
24、put go, ws; input clk, rst-n; reg ds, rd; parameter 1:0 IDLE=2b00, READ=2b01, DLY=2b10, DONE=2b11;,reg 1:0 state, next;always (posedge clk or negedge rst-n) if (!rst-n) state = IDLE; else state = next; always (state or go or ws) begin next=2bx; case (state) IDLE: if (go) next=READ; else next=IDLE; R
25、EAD: next=DLY; DLY: if (ws) next=READ;,else next=DONE; DONE: next=IDLE; endcase endalways (posedge clk or negedge rst-n) if (!rst-n) begin ds = 1b0; rd = 1b0; end else begin ds = 1b0; rd = 1b0;,case (state) IDLE: if (go) rd = 1b1; READ: rd = 1b1; DLY: if (ws) rd = 1b1; else ds = 1b1; endcase endendm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 IC 系统 RTL 实现 ppt 课件

链接地址:https://www.31ppt.com/p-1341534.html