第7章 RTL设计原则及技巧
第7章 RTL设计原则及技巧

7.2.2 流水线操作
图 7–2 串行多任务示意图 流水线操作,在每个组合逻辑块之间加入寄存器簇,所有的寄存 器采用一个公共的时钟信号来驱动,一旦时钟的有效沿到来,寄 存器就会把前一阶段所得出来的结果输出下一级组合逻辑块,否 则就一直等待。 当流水线刚开始加载的时候,数据会有一个等待时间,因此第一 个数据从输入到输出所经历的时间和非流水线操作的时间几乎相 等,第一个时间时产生的任务a1从开始到结束用时与有没有采用 流水线操作没有关系。
7.1.4同步原则
同步化设计,就是核心逻辑采用触发器来实现,电路的主要信号 都使用触发器来触动,尽量采用同一个时钟域的时钟进行驱动。 同步原则的好处在于它不仅可以很好的避免毛刺的产生,而且有 利于器件的移植,而最重要的是它可以产生较好的静态时延分析 报告。 进行同步设计的关键就是认真了解和掌握并且设计好整个系统的 时钟域的划分。
图 7–5 未采用资源共享的RTL线路图
图 7–6 未采用资源共享的资源利用报告
图 7–7 采用资源共享的R用报告
7.2.4逻辑复用操作
逻辑复用操作跟资源共享操作是一个相反过程。 逻辑复用是通过增加面积来改善时序条件的优化手段。 逻辑复用最常用的场合就是调整信号的扇出。 资源共享操作中的实现方法一就是一个逻辑复用的逆操作。 香农扩展定律则可以清楚地表明怎样把一个逻辑组合来实现逻辑 复用、提高频率。而卡诺图化简则相当于香农扩展的逆操作,相 当于资源共享操作。
7.1.3系统原则
CPLD/FPGA本身就一个系统的集合,需要以系统的眼光来看待和 设计CPLD/FPGA,以最优的设计方案来实现。 FPGA速度快、内部寄存器资源和布局布线丰富,因此适合于那些 实时性要求很高、频率又要快、寄存器消耗多的功能模块设计; 另外现在很多FPGA都内嵌DSP模块,因此适合于嵌入式DSP设计 。对于那些速度要求不是很高的功能模块,或者组合逻辑要求相 对丰富、输入输出管脚要求比较多的功能单元,则可以采用CPLD 来完成。 系统原则其实就是自顶向下的方式的具体化。CPLD/FPGA设计工 程师只有清楚了这些系统级的定义和规范才能开始芯片选型、具 体的逻辑模块的划分以及子模块的RTL设计。
《FPGA入门教程》看书随笔——RTL设计

《FPGA入门教程》看书随笔——RTL设计1、使用verilog进行RTL设计一般可归纳为3种基本的描述方式:(1)数据流描述:采用assign连续赋值语句(2)行为描述:使用always语句或initial语句块的过程赋值语句(3)结构化描述:实例化已有的功能模块或原语,即平常所说的元件例化和IP core.过程赋值语句包括非阻塞过程赋值、阻塞过程赋值和连续过程赋值。
2、RTL级设计时需注意的问题(1)凡是在always或initial语句中赋值的变量,一定是reg类型变量;凡是在assign语句中赋值的变量,一定是wire类型变量、(2)定义存储器:reg[3:0] MEMAORY[0:7];地址为0~7,每个存储单元都是4bit;(3)由于硬件是并行工作的,在Verilog语言的module中,所有描述语句(包括连续辅助语句assign、行为语句块always和initial 语句块以及模块实例化)都是并发执行的。
(4)使用完备的if...else语句,使用个条件完备的case语句并设置default操作。
以防止产生锁存器latch,因为锁存器对毛刺敏感(5)严禁设计组合逻辑反馈环路,它最容易引起振荡、毛刺、时序违规等问题。
(6)不要在两个或两个以上的语句块(always或initial)中对同一个信号赋值3、阻塞赋值与非阻塞赋值(1)阻塞赋值的操作符号为“=”。
它的含义是在计算等式右侧表达式值及完成其赋值时不会被其他的verilog 语句打断,就是说,在当前赋值没有完成之前,它阻塞了其他 verilog 语句的执行。
(2)非阻塞赋值的操作符为“<>在实际使用中,应该遵循的原则是:(1)在时序逻辑中,使用非阻塞赋值(2)在组合逻辑中,使用阻塞赋值(3)在同一个always块中,不要混合使用阻塞赋值和非阻塞赋值(4)在同一个always块中,如果既有组合逻辑又有时序逻辑,使用非阻塞赋值(5)always模块的敏感表为电平敏感信号时,使用阻塞赋值(6)不要使用#0时延进行赋值(7)不要在阻塞赋值中使用时延语句(8)在行为级描述中,如语句间是顺序执行的关系,使用阻塞赋值4、哪些是不可综合的代码(1)对于一些抽象的行为描述代码是不可综合的。
fpga知识汇集-编写可综合代码(rtl)需要注意的规则总结

fpga知识汇集-编写可综合代码(rtl)需要注意的规则总结编写可综合代码(RTL)是 FPGA 设计过程中的关键一步。
以下是一些需要注意的规则总结:1. 时钟和时序:在 RTL 设计中,时钟和时序是至关重要的。
确保所有触发器(寄存器)都连接到正确的时钟域,并遵循同步设计原则。
同时,确保时序满足目标平台的要求,以避免时序违规。
2. 信号命名:给变量和信号起有意义的名称,能够准确描述其功能和用途。
使用清晰、简洁的命名规范,以提高代码的可读性和维护性。
3. 可综合的语言特性:在编写 RTL 代码时,只使用可综合的语言特性。
这意味着避免使用仅在仿真环境下有效的语言特性或语法。
4. 避免复杂的逻辑:尽量保持代码简洁明了,避免使用过于复杂的逻辑。
使用层次化设计和模块化思想,将复杂的逻辑划分为相对独立的子模块,提高代码的可读性和可维护性。
5. 注释和文档:为代码添加详细的注释和文档,以解释代码实现的意图、功能和设计决策。
这有助于团队成员之间的共享和合作,并提供未来维护和修改代码的指导。
6. 避免设计异构:FPGA 设计中,使用不同类型、大小和速度的逻辑单元可能会导致布局和时序问题。
尽量避免设计异构,即使用相同类型和规格的逻辑单元。
7. 避免不确定行为:在 RTL 代码中,避免使用带有不确定行为的语言特性或操作符。
确保代码在所有情况下都能正确工作,并且不会产生意外的结果。
8. 编写可综合测试台:编写可综合的测试台,对 RTL 代码进行全面测试。
验证代码的正确性,并确保代码在不同环境和情况下都能正常运行。
9. 可重用性:设计代码时考虑到可重用性,使其可以在不同的项目和场景中复用。
将通用的功能和模块抽象出来,以便在需要时能够方便地重用。
10. 性能和资源优化:在编写 RTL 代码时,考虑到目标平台的资源和性能要求。
优化代码以减少资源占用和功耗,并提高系统的性能。
以上是编写可综合代码(RTL)需要注意的一些规则总结。
RTL级设计

2)禁止使用IF语句中的ELSE项。在用IF语句描述寄存器功能时,禁止采用 else项。下例这样的描述是应该禁止使用的。
process(clk) begin if (clk’event and clk=’1’) then y<=a; else y<=b; end if; end process;
3)寄存器描述中必须代入信号值 在寄存器描述中,禁止将变量值代入信号。如例所示。变量temp代入y是不 允许的。
R1E <= D00 or D10 or D11;
--Register 1
process (c) begin if c'event and c = '1' and R1E = '1' then R1 <= MUX_R1; end if; end process;
process (c) begin if c'event and c= '1' and D01 = '1' then R2 <= INP; end if; end process; R2TC <= 0-R2; MUX_ADD <= R2TC when D11 = '1' else
仿真波形结果
系统级算法模型并非不能综合,现在的EDA软件已经可综合一些简单 算法模型
INP[0:7]
C COM[0:1]
[0:7]
[0:7]
[1]
[0] [0:1]
R1_1_sqmuxa
lat
D[7:0] C
Q[7:0]
R2[0:7]
[0:7] 0
[0:7]
[0:7] 1
[0:7]
rtl设计标准 85 95

rtl设计标准 85 95RTL设计标准85-95随着科技的不断发展和应用领域的不断拓展,数字电子系统的设计变得越来越重要。
而在数字电子系统设计中,RTL(Register Transfer Level)设计是一种重要的设计方法。
本文将详细介绍RTL设计的标准和要求,重点探讨了RTL设计的85-95标准。
一、概述RTL设计作为数字电子系统设计的一种重要方法,用于将数字电路的功能描述转化为寄存器传输级的硬件描述语言(HDL)形式。
RTL 设计的主要任务是确定系统的功能、结构和性能参数,并将其转化为硬件描述语言的形式。
二、RTL设计的核心原则RTL设计依据的核心原则主要包括准确性、可靠性、高效性和可复用性。
1. 准确性:RTL设计应准确地反映系统的功能需求和性能要求,确保在实际系统中实现正确的操作和功能。
2. 可靠性:RTL设计应具备良好的稳定性和可靠性,能够在各种工作环境下正常运行,并保持一致的性能表现。
3. 高效性:RTL设计应具备高效的性能和资源利用率,尽可能地提高系统的运行速度和响应能力。
4. 可复用性:RTL设计应具备较好的可复用性,能够在不同的设计项目中进行重复利用,提高工程效率和减少设计周期。
三、RTL设计的标准和要求RTL设计的标准和要求主要包括语法规范、命名规则、时序要求和功能设计规范。
1. 语法规范:RTL设计应符合HDL的语法规范,包括正确的模块定义、信号声明、过程语句、并发语句等。
2. 命名规则:RTL设计应遵循统一的命名规则,包括模块命名、信号命名、常量命名等,便于代码的理解和维护。
3. 时序要求:RTL设计应满足系统的时序要求,包括时钟周期、数据传输延迟、同步信号等,确保系统的稳定和正确性。
4. 功能设计规范:RTL设计应按照系统的功能需求进行合理的功能设计,包括模块分解、信号连接、状态转移等,保证系统的功能完备性和正确性。
四、RTL设计的85-95标准RTL设计的85-95标准是针对RTL设计中的一系列问题和挑战提出的一套设计准则和规范,旨在提高RTL设计的质量和可维护性。
EDA技术及应用-VHDL版(第三版)(潭会生)第7章详解

第7章 EDA技术实验
CLK CLR ENA
CNT10
CLK
U0
CLR
ENA
CQ[3..0] CO
DOUT[3..0] S0
CNT10
CLK
U1
CLR
ENA
CQ[3..0] CO
DOUT[7..4] S1
CNT10
CLK CLR ENA
U2 CQ[3..0] CO
DOUT[11..8] S2
CNT10 U3
第7章 EDA技术实验
ห้องสมุดไป่ตู้验证清零功能
验证使能有效
验证计数功能
预计可能结果
图7.2 CNT10仿真输入设置及可能结果估计图
第7章 EDA技术实验
4) 管脚锁定文件 根据图7.1所示的CNT9999电路原理图,本设计实体的 输入有时钟信号CLK、清零信号CLR和计数使能信号ENA, 输出为DOUT[15..0],据此可选择实验电路结构图NO.0,对 应实验模式0。 根据图7.5所示的实验电路结构图NO.0和图7.1确定引脚 的锁定。选用EPM7128S-PL84芯片,其引脚锁定过程如表 7.1所示,其中CLK接CLOCK2,CLR接键3,ENA接键4, 计数结果DOUT[3..0]、DOUT[7..4]、DOUT[11..8]、 DOUT[15..12]经外部译码器译码后,分别在数码管1、数码 管2、数码管3、数码管4上显示。
第7章 EDA技术实验
3.实验要求 (1) 画出系统的原理框图,说明系统中各主要组成部分 的功能。 (2) 编写各个VHDL源程序。 (3) 根据系统的功能,选好测试用例,画出测试输入信 号波形或编好测试程序。 (4) 根据选用的EDA实验开发装置编好用于硬件验证的 管脚锁定表格或文件。 (5) 记录系统仿真、逻辑综合及硬件验证结果。 (6) 记录实验过程中出现的问题及解决办法。
项目设计实验(RTL设计)

Bus Master: “PCI Initiator”, Bus Slave: “PCI Target” Burst Data Phases continue until Initiator deasserts ‘Frame#’ 64MHz, 64 bit Versions available Supports 5V and 3.3V operation Bus Signal Integrity guaranteed with special PCI-IO pads (slew limited) Only 4 Slots allowed, Extensions only with PCI-toPCI Bridge
Project文件:IP软核
Ram:软核中的存储器 的仿真模型 Rtl:pci软核的rtl级设计 Testbench:pci软核的 仿真用激励文件
项目设计相关文档
主要内容参考我的PPT TE原来的PPT文档 TE说明文档 TE相关IP的说明文档 相关接口协议的说明文档,例如PCI
rtl设计标准 85 95

rtl设计标准 85 95在进行RTL(Register Transfer Level)设计时,遵循一定的标准对于确保设计质量和效率至关重要。
本文将介绍RTL设计标准的要点,包括其定义、优势以及实施过程中需要注意的事项。
1. RTL设计标准的定义RTL设计是一种硬件设计方法,其中包含了数据流以及寄存器之间的传输、逻辑操作等。
RTL设计标准则是对于RTL设计过程中需要遵循的一系列规范和准则的总称。
遵循RTL设计标准可以提高设计可读性、可维护性和可复用性,同时减少设计错误和不必要的优化。
2. RTL设计标准的优势(1)可读性:遵循RTL设计标准可以使设计代码更易于阅读和理解。
合理的命名规范、模块化设计和层次化结构有助于他人理解设计意图,并方便进行代码的复用和维护。
(2)可维护性:合理的设计标准可以使设计代码更容易维护和修改。
使用清晰的注释、规范的代码风格以及模块化设计,有助于提高代码的可维护性。
(3)可复用性:遵循标准化的RTL设计规范有助于提高代码的可复用性。
可以将通用模块进行抽象,形成可重用的代码库,提高设计效率和降低开发时间成本。
(4)错误减少: 遵循RTL设计标准可以减少设计错误的发生。
规范的设计流程和准确的代码标准有助于发现和纠正潜在的设计问题。
3. 实施RTL设计标准的注意事项(1)代码风格:合理的代码风格对于可读性和可维护性至关重要。
应该制定统一的代码格式,包括缩进、命名规范、注释等方面。
同时,应避免使用硬编码,使用参数化的方式来提高设计的灵活性。
(2)模块化设计:模块化是RTL设计的关键。
设计应该将功能分解为独立的模块,使得每个模块只处理一种特定的任务。
模块之间应该通过明确的接口进行交互,确保模块的独立性和可重用性。
(3)时序约束:时序约束对于设计的时序分析和时序优化非常重要。
应该在设计开始之前明确定义时序约束,包括时钟频率、时序关系等,以确保设计能够满足时序要求。
(4)仿真验证:仿真验证是确保设计正确性的重要手段。
EDA第七章-状态机设计全

7.1 一般有限状态机的设计
7.1.3 一般有限状态机的设计
1. 说明部分 2. 主控时序进程
ARCHITECTURE ...IS TYPE FSM_ST IS (s0,s1,s2,s3); SIGNAL current_state, next_state:
FSM_ST; ...
clk reset state_inputs
7.1 一般有限状态机的设计
7.1.1 用户自定义数据类型定义语句
TYPE语句用法如下:
TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型 ; 或 TYPE 数据类型名 IS 数据类型定义 ;
以下列出了两种不同的定义方式:
TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_LOGIC ; TYPE week IS (sun,mon,tue,wed,thu,fri,sat) ;
COM:PROCESS(current_state, state_Inputs)
接下页
接上页
BEGIN CASE current_state IS WHEN s0 => comb_outputs<= 5; IF state_inputs = "00" THEN next_state<=s0; ELSE next_state<=s1; END IF; WHEN s1 => comb_outputs<= 8; IF state_inputs = "00" THEN next_state<=s1; ELSE next_state<=s2; END IF; WHEN s2 => comb_outputs<= 12; IF state_inputs = "11" THEN next_state <= s0; ELSE next_state <= s3; END IF; WHEN s3 => comb_outputs <= 14; IF state_inputs = "11" THEN next_state <= s3; ELSE next_state <= s0; END IF; END case;
RTL级设计

4、 verilog RTL编码风格
verilog描述的风格对最终设计有很大的影响。就逻辑综合而言,重要 的是考虑实际的硬件实现问题:在不牺牲高抽象层次优势的情况下, RTL描述应该尽可能地接近预期的结构。在设计抽象层次和控制逻辑综 合输出结构之间存在一个折中。下面列出的是班RTL设计中设计者应该 考虑的一些设计原则。
2)步骤2:决定操作执行的顺序。这一步通常被称为调度。
3)步骤3:将操作映射到硬件计算部件并决定结果的存放位置。这一步通常称 为分配。
4)步骤4:产生一个HDL数据流模型或结构模型来描述设计。
二、实例
下面采用一个实例说明如何把算法模型变换为寄存传输级数据流模型。某系统 由两个8bit寄存器Rl,R2和一个加法器组成。用一个2bit信号CON设定操作 指令。系统可完成的4种操作如下:
2.硬件的RTL模型的特点
① RTL模型中的信号代表了硬件中数据的实际移动方向以及电路的互连关系; ② RTL模型中的语句与实际寄存器的结构模型之间存在直接的映射关系; ③ RTL模型指定了寄存器级的电路元件之间的连接关系,从而隐藏了电路结
构; ④ RTL模型指定了存储单元的复用结构及总线; ⑤ RTL模型中明确指定了各个寄存器的驱动时钟; ⑥ RTL模型中通常不采用抽象的数据类型
3、寄存器RTL描述的限制
由RTL描述所生成的逻辑电路中,一般来说寄存器的个数和位置与RTL描述 的情况是一致的。但是,寄存器RTL描述不是任意的,而是有一定限制的。
明确的RTL级结构设计(数据流

Partitioning for Synthesis
Input Control Signals Clk Signals Control Path (FSM) Control Signals Output
Model Recommendations
a c b d + sel sel + 1 0 out a 1 b 0 + c 1 d 0 out
Partitioning for Synthesis
Objective Better Synthesis Results Faster Compile Runtimes Ability to Use Simple Strategy to meet Timing Constraints Optimal Design
Modeling Recommendations
如何保证HDL代码模拟的正确性? 对时序逻辑电路,受同一时钟控制的时序 块,最好置于同一个描述块中;
always @(posedge clk) y1=a; clk a b y1 y2 clk a b y1 y2
always @(posedge clk) if (y1==1’b1) y2=b; else y2=1’b0;
Partitioning for Synthesis
Guidelines
Register all output signals of the module
Separate modules that have different design goals Complete combinational logic paths in a single module, and specially avoid glue logic Considering resource sharing
rtl设计流程

rtl设计流程
RTL设计流程主要包括以下步骤:
1. 功能定义与模块划分:明确设计的功能需求,将整个设计划分为不同的模块。
2. 定义所有模块的接口:确定模块之间的输入输出关系,以及数据传输的方式。
3. 设计时钟域:根据设计的需要,定义不同的时钟域,并确定时钟域之间的同步关系。
4. 考虑设计的关键路径:分析设计的关键路径,确保设计的性能满足要求。
5. 顶层设计:根据模块划分的结果,进行顶层设计,确定各个模块的连接方式。
6. FSM(有限状态机)设计:根据设计的需求,设计状态机的状态转移图,并编写相应的状态机代码。
7. 时序逻辑设计:根据设计需求,编写时序逻辑代码,确保设计的时序正确。
8. 组合逻辑设计:根据设计需求,编写组合逻辑代码,实现所需的逻辑功能。
9. 代码优化:对设计的代码进行优化,提高设计的性能和可读性。
10. 仿真测试:对设计的代码进行仿真测试,验证设计的正确性和性能。
11. 综合与布局布线:将RTL代码综合成门级网表,并进行布局布线,生成最终的物理版图。
12. 验证与测试:对生成的物理版图进行验证和测试,确保设计的正确性和性能。
以上是RTL设计的基本流程,具体的设计过程可能会因不同的设计需求和设计工具而有所差异。
RTL概念与常用的RTL建模

RTL概念与常⽤的RTL建模RTL(Register transfer Level)级和综合(Synthesize)的概念在之前我们已经谈过,HDL语⾔有五个层次:系统级,⾏为级,RTL级,门级,晶体管级。
⽽我们主要也是在RTL级使⽤Verilog语⾔。
RTL正如它名字说的那样,主要描述的是寄存器到寄存器之间逻辑功能的实现,它不具体关⼼到底使⽤了多少逻辑门,因⽽⽐门级更为简单和⾼效。
RTL级的重要特点:可综合。
何谓综合?综合即将原理图或者HDL语⾔描述的电路转换成逻辑门的连接,门级⽹表。
RTL级的基本要素和设计步骤典型的RTL级的设计包含三个部分:时钟域描述,时序逻辑描述,组合逻辑描述。
较为推荐的设计步骤如下:1.功能定义与模块拆分2.定义所有模块接⼝3.设计时钟域:注意全局时钟资源⼏乎没有时钟偏斜(Clock Skew)但时延(Clock Delay)⼤,驱动能⼒强;第⼆全局时钟偏斜⼩,但时延⼩,驱动能⼒次之。
4.考虑设计中的关键路径:关键路径即时序要求最紧张的路径,主要由频率、建⽴时间(Tsetup)、保持时间(Thold)等制约,同时可以⽤pipeline或者逻辑复⽤等⽅法缓解。
5.顶层设计:推荐使⽤⾃顶向下的设计,这同模块规划是⼀致的。
6.FSM状态机:后续有专门介绍7.时序逻辑设计8.组合逻辑设计常⽤RTL级建模⾮阻塞赋值、阻塞赋值、连续赋值这⾥再次提到了这三个概念,可见其⾮常重要。
为了避免错误:推荐在组合逻辑电路中仅使⽤阻塞赋值,在时序逻辑设计中统⼀使⽤⾮阻塞赋值。
//cnt1================reg [3:0] cnt_out;always@(posedge clk)cnt_out <= cnt_out + 1;//cnt2================reg [3:0] cnt_out_plus;always@(cnt_out)cnt_out_plus = cnt_out +1;//cnt3================wire [3:0] cnt_out_plus;assign cnt_out_plus = cnt_out + 1;注意:在cnt2和cnt3中不能使⽤ cnt_out = cnt_out + 1;原因在于他们都是组合逻辑电路,这样写必然造成组合逻辑的闭环,可能产⽣竞争冒险,⽽时序逻辑在时钟控制下看似存在电⽓连接但是实际上不会连续赋值(即输出在输⼊改变⽴刻改变)。
学习vivadoHLS第7章例程中文版

学习vivado第7章Lab1——设计优化概述创建高质量RTL设计的一个关键部分是采用高层次综合拥有优化C代码的能力。
高层次综合经常尝试减少循环和函数的延迟。
在循环和函数中为了获得这种目的,高层次综合尝试执行尽可能多的并行操作。
在函数层,高层次综合经常尝试执行并行函数。
除了这些自动优化,指令用于:•并行执行多个任务,例如,相同的函数多次执行或相同的循环多次迭代。
采用流水线。
•调整数组(块RAM),,函数,循环和端口的物理实现用以提高数据的利用率和帮助数据流尽快通过设计。
•提供的数据相依性的信息,或缺少这些信息,从而可进行更多优化。
最终的优化技术是修改的C源代码,以删除非预期依赖关系的代码,这种代码可能限制了硬件的性能教程是由两个实验练习组成。
你可以在这些实验练习中用Analysis perspective来执行分析。
前提条件是完成了本教程的Design Analysis教程Lab1参照循环和函数流水线的使用来创建的设计能够在一个时钟处理一个样本。
这个实验包括一些例子,这些例子给您机会去分析两个通常引起不能满足性能要求导致设计失败的原因:循环依赖关系和数据流限制或瓶颈。
Lab2这个实验展示了怎么从lab1中修改代码来帮助克服一些在代码中无意识存在的内在的性能限制。
教程设计描述从xilinx网站下载教程设计文件,在教程设计中查看信息。
教程所用的设计文件在教程目录vivado_HLS_Tutorial\Design_Optimization你在实验练习中使用的样本设计是一个矩阵乘法功能。
设计目标是在每个时钟周期处理一个新的采样,实现的接口作为数据流传输接口。
Lab1:优化矩阵乘法器这个练习使用矩阵乘法器设计用以展示你如何全面优化设计重点是在循环设计上,设计的目标是用FIFO接口在每个时钟周期读一个样本,同时使用最少资源。
这个分析包括了在使用函数级优化的循环级优化方法的比较。
这个练习解释了用户分析界面视角的基本操作,还有你如何用这个界面来驱动设计优化。
如何保证RTL设计与综合后网表的一致性(一)

如何保证RTL设计与综合后网表的一致性(一)文章简介:在超大规模数字集成电路的设计中,我们使用逻辑综合工具来完成从RTL设计到门级网表的转化。
我们希望它综合出的门级网表与我们的RTL设计在逻辑和时序上完全一致。
但是某些书写风格和设计思路却会造成两者不一致的情况,降低我们的工作效率。
本文列举了三种RTL设计与综合后网表不一致的情况,并给出了解决方法.我们以Design Compiler为例,来说明设计RTL时应该注意的问题。
在仿真和调试时,我们使用了NC-V erilog和Debussy。
1.不完整的敏感量列表在下面的例子中,有一个always语句,它描述了一个或门,其中它的敏感量列表包含IN1和IN2。
/////////////////////////////////////////////////////////////////////////////module OR_GA TE_A (OUT_A, IN1, IN2);output OUT_A;input IN1, IN2;reg OUT_A;always @(IN1 or IN2)OUT_A = IN1 | IN2;endmodule/////////////////////////////////////////////////////////////////////////////再看下面的例子,敏感量列表只包含IN1。
/////////////////////////////////////////////////////////////////////////////module OR_GA TE_B (OUT_B, IN1, IN2);output OUT_B;input IN1, IN2;reg OUT_B;always @(IN1)OUT_B = IN1 | IN2;endmodule/////////////////////////////////////////////////////////////////////////////这两个例子有什么不同呢?我们看下面的波形:对比两个module的输出,可以看出:它们的输入相同,但是输出在22时刻却不同,这是因为OR_GA TE_B的敏感量列表只包含IN1,导致在22时刻虽然IN2发生了变化,却不能触发OUT_B重新求值。
SystemVerilog硬件设计及建模第7-8-9章

010Z 010Z
010X 010X
0101 010Z
010Z
未知 未知
未知
假 真
假 真
未知 真
真 真
未知 未知
未知 未知
真 假
真 假
未知 假
假 假
010X 未知
逻辑相等遇到Z或X,结果为未知,条件相等按位对0、1、X、Z进 行精确匹配,左右两操作数完全相同,则结果为真,反之为假!
MicroElectronics Center
HMEC
7.1.3 有无关通配符的相等操作符
Verilog中,数字中的逻辑X可以用字符X或x表示,逻辑Z可以用字 符z,Z或?表示,如:
语句 j = i ++ j = ++ i j = i -j = -- i 操作 后加 先加 后减 先减 描述 i的值赋给j,然后i加1 i加1, 然后i的值赋给j i的值赋给j,然后i减1 i减1, 然后i的值赋给j
while (i ++ < LIMIT) begin : loop1 …… //i最后的值为LIMIT end while (++ j < LIMIT) begin : loop2 ……//j最后的值为LIMIT - 1 end
MicroElectronics Center
HMEC
7.5 跳转语句
//disable在任务所有语句执行完成前提前从任务中返回
task add_up_to_mux( input [5 : 0] max, output [63 : 0] result); integer i begin result = 1; if (max == 0) disable add_up_to_mux; for ( i = 1; i <= 63; i = i + 1) begin result = result + result; if (i == max) disable add_up_to_max; end end endtask MicroElectronics Center
西安交大计算机组成原理—习题解答(第七章)汇编

BUS→A
BUS→B
BUS→C
B73 G
1D
8D
令: D →BUS = -T0 A →BUS = -T2 BUS→A = P1 BUS→B = P3
>=1
>=1
T1 T3 T0 T2
Copyright ©2012 Computer Organization Group. All rights reserved.
第七章 7.1
7.1 请分析CPU内部采用分散互连结构和单总线以及多总线结构的优 缺点。
答: 分散互连结构是在需要进行数据传输的部件间设置专用通路。该结构
的优势是部件间不存在传输通路的竞争问题,所以指令执行速度快。 单总线结构是将各部件都连接在单一的总线上。其优势是CPU结构紧
凑,但由于部件间争用总线造成指令执行速度慢。 双总线结构是在单总线结构的基础上增加了一条总线,使得ALU的两
T0时间完成D→总线; T1时间完成总线→A; T2时间完成A→总线; T3时间完成总线→B。
Copyright ©2012 Computer Organization Group. All rights reserved.
第七章 7.2
解: (1)采用三态输出的D型寄存器74LS374做A、B、C、
Copyright ©2012 Computer Organization Group. All rights reserved.
第七章 7.4
7.4 欲在7.3.4给出的目标指令集中增加一条立即数加法 指令addi rt,rs,imm16,若CPU采用单周期数据通路设 计方案,请问在7.5.1中给出的图7-19数据通路能否支 持该指令的执行?若不能,请问如何修改?并用指令周 期流程图描述该指令的完整执行过程。
设计复用的RTL指导原则

设计复用的RTL指导原则清华大学电子工程系微波与数字通信国家重点实验室CAD中心(内部文档)Hegh2003.12.30设计可复用的基本要求是RTL代码可移植。
通常的软件工程指导原则在RTL编码时也适用。
类似软件开发,基本的编码指导原则要求RTL代码简单、结构化和规则化。
这样的代码也易于综合和验证。
命名习惯:1、所有信号、端口和变量名称使用小写字母,常数名称、用户定义类型和参数使用大写字母。
2、命名应该有含义,应该解释变量的行为。
例如,复位信号使用“rst”、“clr”或“reset”、“clear”。
这些信号也应该遵守高/低电平有效习惯。
3、参数名应该短,因为总和工具在处理中须连接名称生成唯一的参数名,很长的名称会引起可读性问题。
4、使用“clk”或者“CLK”命名时钟线,或用它作为所有时钟信号的前缀。
例如,clk_show、clk_A。
另外,同一来源的所有时钟信号使用同一名称。
5、区分高电平有效信号和低电平有效信号,一个简单的方法是用“_h”表示高电平有效信号,用“_l”表示低电平有效信号。
6、当申明多位变量时应使用统一的位顺序,或者从低到高,或者从高到低。
例如VHDL中用7 downto 0,Verilog中用[7:0]。
如果用0作为最低端的位,那么所有多位变量应该是(n-1)到0的形式。
这些一致性避免了当多位变量连接时的编码错误。
7、国成块应使用一个有意义的标志名。
同样,标志名不能太长,也不要重复命名。
例如给一个过程和一个信号起同研的名字会造成混乱。
如果用VHDL设计,记住IEEE标准1076.4对库单元顶层端口声明的命名习惯提供的某些限制。
特别是,0级符合中有一些对port/generic类型的命名规则,以便仿真器以一种统一的方式处理SDF反标注。
编码的一般指导原则1、使用简单结构和时钟方案。
代码的结构应该一致。
规则的划分方案使各个模块规模大致相等,以实现一致性。
设计的划分应该使一个单独模块所有逻辑使用同一时钟或者复位信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.2. RTL设计的主要技巧
硬件原则、面积与速度原则、系统原则以及同步原则是代码设计 的灵魂。
7.2.1乒乓操作
乒乓操作是有效处理高速数据流的方式之一,其基本思想就是一 种以面积换取速度。
图 7–1 乒乓操作示意图
乒乓操作必须保证数据采样通路之间对数据采样是互斥的,也就 是说在同一时刻有且只有一个数据缓冲模块对输入的数据流进行 采用,因此在输入选择模块和数据缓冲模块之间需要有一个握手 信号,同样数据处理模块和数据流输出选择单元之间也是互斥的 。当一个模块在对输入数据进行采样的时候,另外一个模块就对 数据处理单元进行数据输出,然后不停地有序地切换,就好像打 乒乓球一样,一来一往,这就是所谓的乒乓操作。 乒乓操作要求两个缓冲模块和数据处理模块的大小必须一致,驱 动时钟的频率必须相等,且相位差固定,否则将出现有些路径数 据拥堵、有些路径空闲的状况
图 7–10 同步复位逻辑电路图
图 7–11 异步逻辑复位图
图 7–12 同步复位异步释放RTL线路图
7.3 组合逻辑设计
7.3.1 锁存器
除非有必要,不建议在组合逻辑设计中使用锁存器。一是锁存器 的使用有可能会出现潜在的竞争冒险;二是综合工具对组合逻辑 的优化和综合仅仅会对每一个输入可能的值赋给输出一个值,这 就意味着事件控制表达式必须对每一个输入都敏感,每一条活动 的路径都必须给每个输入赋予一个值。 观察例5~例9锁存器产生的条件及解决方法,具体请参考源代码 设计
7.2.2 流水线操作
图 7–2 串行多任务示意图 流水线操作,在每个组合逻辑块之间加入寄存器簇,所有的寄存 器采用一个公共的时钟信号来驱动,一旦时钟的有效沿到来,寄 存器就会把前一阶段所得出来的结果输出下一级组合逻辑块,否 则就一直等待。 当流水线刚开始加载的时候,数据会有一个等待时间,因此第一 个数据从输入到输出所经历的时间和非流水线操作的时间几乎相 等,第一个时间时产生的任务a1从开始到结束用时与有没有采用 流水线操作没有关系。
图 7–3 流水线操作示意图
图 7–4 通用流水线操作示意图
7.2.3资源共享操作
资源共享操作,又称之为时分复用,就是使一个功能模块来实现 几个操作。资源共享操作是在保证速度的前提下来实现面积最小 的一种操作方式。 观察例 7–1 采用资源共享的RTL代码设计,具体设计请参考代码 资源共享操作适合于有选择器的结构。目前的综合工具都具有资 源共享选项,只要选择它就可以自动进行资源共享优化操作。然 而代码毕竟是最基础的,它最能体现设计者思想,同时综合工具 的优化能力毕竟有限,因此如果需要采用资源共享设计,最好在 代码设计中完成。
7.1.4同步原则
同步化设计,就是核心逻辑采用触发器来实现,电路的主要信号 都使用触发器来触动,尽量采用同一个时钟域的时钟进行驱动。 同步原则的好处在于它不仅可以很好的避免毛刺的产生,而且有 利于器件的移植,而最重要的是它可以产生较好的静态时延分析 报告。 进行同步设计的关键就是认真了解和掌握并且设计好整个系统的 时钟域的划分。
7.2.5 串并转换操作
串并转换是数据流处理常用的一个手段,也是面积与速度互相转 换思想的直接体现。 串行信号转化成并行信号相当于逻辑复制,并行信号转化成串行 信号则相当于在节省逻辑资源,节省了芯片的面积。 串并转换有许多种方式:高速的SERDES, DRAM FIFO SERDES DRAM、FIFO、代码 等 从某种层面来说,乒乓操作就是一种特殊的串并转换操作过程 在创建RTL代码时了解综合工具是怎样运行是比较重要的。
7.3.3脉冲产生信号经过不同的路径产生不 同的延时而产生脉冲序列,这样充分利用了逻辑缓冲的器件延时 和布线延时,但是组合逻辑器件本身由于温度、电压等关系会造 成延时的不确定,同时PCB布线方式不一样,同样会造成延时的 不一致,因此这样的脉冲产生电路的延时性和稳定性都很差,并 且这样的脉冲产生电路也容易造成竞争冒险。
7.3.2 组合逻辑反馈环路
组合逻辑反馈环路是数字同步逻辑设计中的一个大忌,它不仅有 可能造成信号振荡,产生毛刺,还会经常引起时序违例,不能很 好地进行时序分析,进而引起系统的不稳定。
图 7–13 组合逻辑负反馈示意图
要避免组合逻辑反馈回路的出现,可以在图7-13中的组合逻辑部 门增加一级触发器,或者直接更改设计。
图 7–14 组合逻辑脉冲产生电路示意图
在CPLD/FPGA中,图7-15是典型的脉冲产生电路方案之一——利 用时序逻辑电路来实现。
图 7–15 正确的脉冲产生电路
7.4 时序逻辑设计
7.4.1 门控时钟
门控时钟,是为了减少功耗而对时钟采取的一种组合逻辑设计。 通过屏蔽时钟信号而使相关的时钟所驱动的整个逻辑不再发生翻 转,从而节省功耗。但是由于门控时钟电路不同于同步电路,当 时钟通过 “门” 时有可能会产生毛刺,并污染时钟的斜率,增 大时钟的抖动。因此在同步设计中尽量避免使用门控时钟。
图 7–5 未采用资源共享的RTL线路图
图 7–6 未采用资源共享的资源利用报告
图 7–7 采用资源共享的RTL线路图
图 7–8 采用资源共享的资源利用报告
7.2.4逻辑复用操作
逻辑复用操作跟资源共享操作是一个相反过程。 逻辑复用是通过增加面积来改善时序条件的优化手段。 逻辑复用最常用的场合就是调整信号的扇出。 资源共享操作中的实现方法一就是一个逻辑复用的逆操作。 香农扩展定律则可以清楚地表明怎样把一个逻辑组合来实现逻辑 复用、提高频率。而卡诺图化简则相当于香农扩展的逆操作,相 当于资源共享操作。
7.4.2 异步计数器
异步计数器,也叫做行波计数器。它利用时钟驱动一组寄存器的 第一个时钟管脚,然后利用第一个时钟的输出驱动第二个寄存器 的时钟管脚,级联而下。它可以节省芯片的资源,但是不能很好 地进行静态时延控制,从而带来许多的时序问题,因此不建议采 用。
7.4.3 次级时钟的产生
最简单的方式就是通过组合逻辑来进行分频,但是容易产生毛刺 ,而毛刺的产生必然会引起系统的错误反映或者亚稳态的产生, 为了防止毛刺的产生或者过滤毛刺,解决方案之一就是插入寄存 器。 建议使用PLL/DLL来产生次级时钟,这样可以实现时钟约束,确 保时钟的质量,目前所有的FPGA以及最新的高端CPLD里面都内 置有PLL/DLL硬件模块,可以自由调用,但是传统的CPLD以及最 新的低端CPLD里面没有PLL/DLL模块,因此时序约束要求严格的 系统,不建议采用传统的或者最新的低端CPLD进行设计。
module async_rst(clk, rst_, d, q); input clk,rst_,d; output reg q; reg rst_reg_; always @(posedge clk) //同步化 //同步化 rst_reg_ <= rst_; always @(posedge clk negedge rst_reg_)//异步复位 begin if(!rst_reg_) q <= 1'b0; else q <= d; end endmodule
reg [n-1:0] par_temp; par_temp = {par_temp[n-2:0],ser_in}; or par_temp={ser_in,par_temp[n-1,1]};
7.2.6 异步时钟域数据同步化操 作
CPLD/FPGA设计的重点就是怎样划分不同的时钟域以及怎样在不 同的时钟域之间进行数据传度,也就是怎样在异步时钟域中实现 数据的同步化操作。 同步设计之于异步设计,在逻辑综合和时序分析,特别是静态延 时分析方面有着较大的优势。 在多时钟域设计时,数据的跨时钟操作经常会引起建立时间和保 持时间违例,这也就成了设计中的一大难点。 异步时钟有几大表现形式:同频异相、异频同相和异频异相。 不管是采用哪种方式进行异步时钟域数据同步,都不推荐采用增 加缓冲和采用时钟双沿采样来进行 最好的方式来处理异步时钟域数据同步化的问题就是采用DRAM 或者FIFO来进行时钟域隔离,用上级随路时钟信号写入数据,用 下级时钟读出数据。采用这种方式需要设置告警信号来提醒不能 出现DRAM或者FIFO数据溢出
典型的同频异相的解决方案,它采用后级时钟对前级数据采用两 次,这样可以减少亚稳态的传播,并有效地减少毛刺。
图 7–9 异步时钟域数据同步化操作
7.2.7 复位操作
在硬件系统中,有两种复位模式:同步复位和异步复位。 同步复位是指所有的复位操作都是在时钟的作用下进行,即使复位信号 有效,如果没有时钟的有效沿触发就不能进行复位;而异步复位的复位 信号与时钟信号没有关系。 观察例7-2、例7-3同步复位、同步复位的设计,具体请参考相关代码。 7-2 7-3 同步复位的always语句中的敏感变量表达式并不包含复位变量,复位变 量出现在条件表达式中,这样只有在时钟的作用下才能检测到复位信号 。 同步复位好处在于不论是复位信号还是数据信号,都由时钟信号控制。 纯同步复位也有缺点:一是复位信号因为被当成数据信号来看待,在设 计中需指出复位信号的脉宽等参数;二是从系统层面来说,如果复位信 号用来复位整个触发器链,第二级甚至更后的触发器,它就成了一个普 通的数据信号
与同步复位不同,异步复位信号不仅出现在always语句中的条件 判断表达式中,同时也出现在敏感事件表达式中——只要复位信 号有效,而不用管时钟信号就可以实现复位。 因为异步复位、置位的D触发器是目前绝大多数CPLD/FPGA中所 固有的结构,所以只要满足基本的复位到输出的时序要求,就可 以实现复位 异步复位一是有可能会产生亚稳态的状态,二是就是时序约束不 好实现,三是综合和布局布线软件不好生成静态时延分析报告。 比较好的方式之一就是对复位信号进行同步化后采用异步复位, 其基本程序代码如下所示。
7.1.2 面积与速度原则
面积就是设计所要消耗的逻辑资源——对于FPGA来说,采用触发 器和LUT来衡量;对于CPLD来说,则采用宏单元来衡量 速度则是指在现有的芯片上能够实现的最大频率 面积和速度是个矛盾体 ,需要在面积和速度之间做个权衡。 必须保证速度的前提下来实现最小的面积,或者在规定的面积之 内实现最大的时序裕量。 面积与速度的地位是不相等的,速度的优先级别要比面积高。当 两者冲突的时候,速度优先。 从工业设计来看,面积和速度直接反映的就是成本和性能。 从性能方面来考虑,设计的速度越快,时间裕量就愈大,这也就 意味着CPLD/FPGA设计的健壮性就越强。