1 / 64

第四章 基于 Xilinx 芯片 Verilog 进阶设计

第四章 基于 Xilinx 芯片 Verilog 进阶设计. 面向硬件电路的设计方法 代码风格与可综合设计 通用代码风格 专用代码风格 企业代码风格 企业级大规模 FPGA 应用设计方法 原语的使用. 面向硬件电路的设计方法. 将具体功能形成硬件的 RTL 级模型 编写代码始终要考虑硬件如何实现 基于 FPGA 实现的 Verilog 设计特点 并行化 同步控制 实现代价. 面向硬件电路的设计方法. 硬件实现的并行化 从电路上来看: 只要芯片上电,所有逻辑就开始工作。 从代码上来看: 所有的描述语句之间是并行执行的;

angie
Télécharger la présentation

第四章 基于 Xilinx 芯片 Verilog 进阶设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 基于Xilinx芯片Verilog进阶设计 • 面向硬件电路的设计方法 • 代码风格与可综合设计 • 通用代码风格 • 专用代码风格 • 企业代码风格 • 企业级大规模FPGA应用设计方法 • 原语的使用

  2. 面向硬件电路的设计方法 • 将具体功能形成硬件的RTL级模型 • 编写代码始终要考虑硬件如何实现 • 基于FPGA实现的Verilog设计特点 • 并行化 • 同步控制 • 实现代价

  3. 面向硬件电路的设计方法 • 硬件实现的并行化 • 从电路上来看: • 只要芯片上电,所有逻辑就开始工作。 • 从代码上来看: • 所有的描述语句之间是并行执行的; • always语句在边沿触发条件下的行为描述均采用非阻塞赋值,并行执行; • 面向RTL级电路的电路设计易于实现流水操作; • 与一般高级语言的顺序代码为主的设计方法有本质的区别。

  4. 面向硬件电路的设计方法 时序延迟信号 reg a, a_d1, a_d2; always @ (posedge clk ornegedge rst) begin if (~rst) begin a_d1 <= #TP 0; a_d2 <= #TP 0; end else begin a_d1 <= #TP a; a_d2 <= #TP a_d1; end end

  5. 面向硬件电路的设计方法 • 基于全局时钟的同步设计 • 数据存储在FPGA的寄存器或存储器中,时钟可看作执行控制器; • 串行算法的执行可以按照时钟节拍的顺序进行控制,寄存器输出以及组合逻辑通常作为控制条件。 例如:采用计数器控制状态变化或数据处理过程。

  6. 面向硬件电路的设计方法 • 实现代价 • “面积”和“速度”的综合考虑: • “面积”指所占用的FPGA资源(FF和LUT); • “速度”指芯片稳定运行所达到的最高频率。 • “面积”和“速度”是一对矛盾,可相互转化: • “面积”优先:资源复用; • “速度”优先:冗余同构部件。 ISE 的Map选项: 优化策略可选择Area和Speed的优化策略

  7. 代码风格与可综合设计 • Verilog HDL语言本身的规范只面向仿真 • 不使用综合工具不支持的Verilog结构 • 除了wire、reg的多数数据类型 • 开关级原语 • deassign、wait等行为语句 • UDP和specify模块 …… • 遵循可综合设计原则 • 代码综合出预想的逻辑 • 行为描述的完整性

  8. 代码风格与可综合设计 • 同步电路设计 • 优点 • 容易使用寄存器的异步复位/置位端,以使整个电路有一个确定的初始状态; • 有效避免毛刺,提高可靠性; • 简化时序分析过程; • 减少对工作环境的依赖性,提高可移植性; • 原则 • 尽可能使用单时钟(全局时钟) • 尽可能使用单时钟沿触发(posedge clk) • 避免使用门控时钟(组合逻辑驱动的时钟) • 若使用分频时钟应当统一管理

  9. 代码风格与可综合设计 • 同步电路设计

  10. 代码风格与可综合设计 • 同步电路设计的模块划分 • 信息隐蔽、抽象: • 避免跨模块控制,边界清晰; • 端口明确: • 禁制多重功能和无用接口; • 时钟域区分: • 异步FIFO或双端口RAM实现多时钟域隔离; • 低频时钟域尽可能划分到一个模块中; • 资源优化: • 尽量使用厂商提供的原语 • 寄存器划分: • 模块的输出尽可能采用寄存器输出(reg型)

  11. 代码风格与可综合设计 • 代码风格(包括书写规范和描述方法) • 通用代码风格 • Verilog HDL语言规范,硬件无关,性能未必最优; • 专用代码风格 • 基于具体芯片的结构和资源,性能优化,移植性可能受影响。 “华为Verilog HDL设计规范” Sun公司 “Verilog Style and Coding Guidelines” “Actel HDL Coding Style Guider” 注重代码的硬件实现质量。 目标:功能正确,性能最优

  12. 通用代码风格 • 逻辑复用 • Synplify提供逻辑复用选项,但若要获得最佳的复用效果,在源代码设计中应采用显式的复用控制逻辑; • 节约面积。 • 逻辑复制 • Synplify提供最大扇出选项,如果扇出过大(驱动过多后续逻辑),需增加缓冲器提高驱动能力,但信号延迟增大; • 增加面积。

  13. 通用代码风格 • 逻辑结构 • 树状结构优于链式结构,缩短延迟级数。 • if语句和case语句使用原则 • if语句面积小,延迟大;case语句面积大,速度快。 • if适合对速度无特殊要求的场合;case适合高速编解码电路。 • if分支具有优先级,case分支无优先级。 • if不可嵌套技术过多,一般不超过3-4层。 • 兼顾面积和速度,if和case混合使用。

  14. 通用代码风格 • 关键路径信号处理 • 引起电路建立时间不足的信号路径成为关键路径 • 组合电路关键路径提取采用逻辑拆分方式,降低关键信号的组合延迟级数。 • 分析下面语句中b所经过的LUT级数。 assign y = a & b & c | d & e & b; assign t = a & c | d & e; assign y = b & t;

  15. 通用代码风格 • if和case不完整分支造成的意外锁存器 • 当always语句使用电平触发时有可能产生锁存器。 参见P106例3-12和例3-13 • 当always语句使用时钟沿触发时不会产生,此时只产生寄存器。

  16. 通用代码风格 • reg型信号只能在一个always语句中赋值 • 最常见的HDL行为描述建模错误之一 • 避免assign不确定语句 • assign signal_a = #4 ~signal_a; • #4被综合工具忽略掉

  17. 专用代码风格 • 时钟信号分配原则 • 使用全局时钟,通过BUFG驱动,时钟信号到达各个寄存器的延迟相同。 • 减少时钟信号种类 • 避免时钟毛刺信号(不使用门控时钟)

  18. 专用代码风格 • SRL16的使用 • SRL16是一种基于LUT的移位寄存器; • 可生成任意位宽和深度的移位寄存器; srl16_based_ram my_shift_ram ( .clk ( ), .d ( ), .q ( ) );

  19. 专用代码风格 • 触发器资源分配 • 尽量使用库中的触发器资源; • 状态机编码尽可能采用“独热码”(one-hot)。 (synplify综合工具可提供相关功能) • 反向信号 • 尽量使用符号~,而不使用not原语; • 不要尝试用多个反向器级联来增加需要的信号延迟; • 反向信号驱动多个负载可采用分散反向。 (综合工具可自动优化)

  20. 企业代码风格 • 1.基本书写规则 • 用有意义而有效的名字; • 用连贯的缩写; Clk Rst • 用最右边(左边)的字符下划线表示低电平有效,高电平有效的信号不得以下划线表示; Rst_ Trdy_ • 名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接 Packet_addr Data_in

  21. 企业代码风格 • 1.基本书写规则 • 全局信号名字中应包含信号来源的一些信息; • 同一信号在不同层次应保持一致性; • 自己定义的常数类型等用大写标识 parameter CYCLE = 100; • 避免使用保留字作为信号、模块名称; • 添加有意义的后缀使信号名更加明确。

  22. 企业代码风格 • 2.Module • 顶层模块应只是内部模块间的互连,除了内部的互连和模块的调用外尽量避免再做逻辑(如不能再出现对reg变量的always赋值,不能再用assign语句完成复杂逻辑); • 每一个模块应在开始处注明文件名功能描述引用模块设计者设计时间及版权信息(ISE生成模板); • 不要对input进行驱动, 在module 内不要存在没有驱动的信号,更不能在模块端口中出现没有驱动的输出信号,避免在仿真或综合时产生warning,干扰错误定位;(避免由于未驱动产生的x,z)

  23. 企业代码风格 • 2.Module • 每行应限制在80个字符以内以保持代码的清晰美观和层次感; • 模块实例名应采用”U_xx”命名,端口采用显式关联而非隐式关联; • 用一个时钟的上沿或下沿采样信号,不能混合使用; • 如果一定要使用时钟双沿,可使用180度相位时钟; • 在模块中增加注释; • Module 名要用大写标示,且应与文件名保持一致;

  24. 企业代码风格 • 2.Module • 严格芯片级模块的划分,只有顶层包括IO引脚; • 模块输出寄存器化,对所有模块的输出加以寄存,输出的驱动强度和输入的延迟可以预测,从而使得模块的综合过程更简单; • 将关键路径逻辑和非关键路径逻辑放在不同模块,实施不同的优化策略。

  25. 企业代码风格 • 3.线网与寄存器 • 一个reg变量只能在一个always语句中赋值; • 向量有效位顺序的定义一般是从大数到小数; • 模块输出端口,对线网和寄存器类型的要做声明; • 使用克综合的的线网和寄存器类型。

  26. 企业代码风格 • 4.表达式 • 用括号来表示执行的优先级,使优先级阅读更清晰; (注意不要造成额外的延迟) • 用一个函数(function)来代替表达式的多次重复,仿真中经常使用的一组描述可以写到一个任务(task)中;

  27. 企业代码风格 • 5. if语句 • 向量比较时比较的向量宽度要相等,不相等时建议采用显示扩展; • 每一个if 都应有一个else 和它相对应; • 应注意if ..else if ...else if ...else 的优先级; • 如果变量在if-else 或case 语句中做非完全赋值则应给变量一个缺省值。 (always语句的自身要求)

  28. 企业代码风格 • 6. case语句 • case语句通常综合成一级多路复用器,if-then-else则综合成优先编码的串接的多个多路复用器; • 所有的Case 应该有一个default case 允许空语句 Default : ;

  29. 企业代码风格 • 7.函数 • 在function的最后给function赋值; • 函数中避免使用全局变量,否则容易引起HDL行为级仿真和门级仿真的差异。 注意:函数与任务的调用均为静态调用

  30. 企业代码风格 • 8.赋值 • Verilog 支持两种赋值:过程赋值(procedural) 和连续赋值(continuous) ,过程赋值用于过程代码(initial, always, task or function)中给reg和integer变量time\realtime、real赋值,而连续赋值一般给wire变量赋值; (reg型与wire型赋值问题) • always @(敏感表敏感表要完整如果不完整将会引起仿真和综合结果不一致; (电平触发的意外锁存器问题)

  31. 企业代码风格 • 8.赋值 • force/release 仅用于debug,对寄存器和线网均有用; • 避免使用Disable • assign/deassign 仅用于仿真加速仅对寄存器有用; (可综合设计问题) • 对任何reg赋值用非阻塞赋值代替阻塞赋值, reg 的非阻塞赋值要加单位延迟,但异步复位可加可不加。 (reg赋值问题,仿真赋值延迟问题)

  32. 企业代码风格 • 9.组合逻辑与时序逻辑 • 如果一个事件持续几个时钟周期设计时就用时序逻辑代替组合逻辑; • 内部总线不要悬空,在default状态要把它上拉或下拉。

  33. 企业代码风格 • 10.宏与参数 • 为了保持代码的可读性常用 `define做常数声明; • 把`define放在一个独立的文件中; • 参数parameter 必须在一个模块中定义,不要传替参数到模块; • 如果希望宏的作用域仅在一个模块中就用参数来代替。

  34. 企业代码风格 • 11.注释 • 对更新的内容更新要做注释; • 在语法块的结尾做标记; • 每一个模块都应在模块开始处做模块级的注释; • 在模块端口列表中出现的端口信号都应做简要的功能描述。

  35. 企业代码风格 • 12.有限状态机(FSM) • VerilogHDL描述状态机时由parameter分配好状态; • 组合逻辑和时序逻辑分开用不同的进程: • 组合逻辑包括状态译码和输出; • 时序逻辑则是状态寄存器的切换; • 必须包括对所有状态都处理不能出现无法处理的状态使状态机失控; • Mealy机的状态和输入有关,而Moore机的状态转换和输入无关。 (Mealy机使用的较多)

  36. 企业代码风格 • 13.testbench • 在testbench中避免使用绝对的时间,如#20,#15或#(CYC+15)等,应该在文件前面使用parameter定义一些常量,使得时间的定义象#(CYC+OFF0)的形式,便于修改; • 观测结果可以输出到波形文件或数据文件 ; • 对大的设计的顶层仿真一般不要对所有信号跟踪波形文件会很大仿真时间延长可以有选择的观测一些信号;

  37. 企业代码风格:常见代码问题 • 在for-loop中包括不变的表达式浪费运算时间 for (i=0;i<4;i=i+1) begin Sig1 = Sig2; DataOut[i] = DataIn[i]; end for-loop中第一条语句始终不变,浪费运算时间。 (注意,这是仿真代码)

  38. 企业代码风格:常见代码问题 • 资源共享问题 条件算子中不存在资源共享,如 z = (cond) ? (a + b) : (c + d); 必须使用两个加法器; 而等效的条件if-then-else语句则可以资源共享如 if (Cond) z = a + b; else z = c + d; 只要加法器的输入端复用,就可以实现加法器的共享,使用一个加法器实现

  39. 企业代码风格:常见代码问题 • 由于组合逻辑位置不同而引起过多的触发器综合 • 组合逻辑单独使用一个 电平触发的always语句, 寄存器减少一个。 注:(1)需根据具体需要 (2)少用always描述 组合逻辑

  40. 企业代码风格:常见代码问题 • 谨慎使用异步逻辑 • 避免门控时钟 always @ (posedge GATED_Clk or posedge Rst) begin if (Rst) Z <= #u_dly 1'b0; else ……

  41. 企业代码风格:常见代码问题 • 对组合逻辑的描述有多种方式,其综合结果等效 • 选择简洁描述 • 选择意义明确描述

  42. 企业代码风格:常见代码问题 • 考虑综合的执行时间 • 通常会推荐将模块划分得越小越好,事实上要从实际的设计目标面积和时序要求出发; • 从代码设计讲500~5000行的长度是合适的; • 选择合适的约束条件,过分的约束将导致漫长的综合时间。

  43. 企业代码风格:常见代码问题 • 避免点到点的例外(Point-to-point exception) • 从一个寄存器的输出到另一个寄存器的输入的路径不能在一个周期内完成; • 多周期路径就是其典型情况;避免使用多周期路径如果确实要用应将它放在单独一个模块并且在代码中加以注释。 (比如计数器的高位) • 避免伪路径 (False path) • 静态时序分析STA 认为是时序失败而设计者认为是正确的路径,通常会人为忽略这些warning, 但如果数量较多时就可能将其他真正的问题错过了。

  44. 企业代码风格:常见代码问题 • 避免使用Latch • 避免使用门控时钟 • 避免使用内部产生的时钟 • 避免使用内部复位信号 • 如果确实要使用内部时钟、门控时钟或内部的复位信号,将这些信号的产生放在顶层的一个独立模块,这样所有的子模块分别使用单一的时钟和复位信号; • 一般情况下内部门控时钟可以用同步置数替代。

  45. 企业级大规模FPGA应用设计方法 • 芯片级应用系统 • “面积”与“速度”综合因素,“速度优先”逐渐占主导; • 大规模FPGA应用设计流程 • 模块划分(总体方案):确定关键电路时序和模块间接口时序; “时序是事先设计出来的,而不是事后测出来的” • 具体电路设计 (详细设计):先画出每个模块的原理结构,后画出其工作原理时序图,在工作原理时序图的指导下进行具体电路设计 “先时序后电路”

  46. 企业级大规模FPGA应用设计方法 • 大规模FPGA应用设计流程 • 设计验证仿真(测试方案): • 软件验证 • RTL级功能仿真(功能验证) RTL级仿真是所有验证环节中最重要的一环 • 静态时序分析 (时序调整) 满足时许约束的时序微调 • 时序仿真 一定程度需要,不宜过多 • 硬件验证(单板验证)

  47. 企业级大规模FPGA应用设计方法 • 可靠性与规范性一般原则 根据日本电子行业的统计,产品不可靠的原因中,设计占80%, 元器件占15%, 制造工艺占5% • ’遵循统一的设计规范; • 同步电路比异步电路可靠并且容易实现; • 增加代码可读性,方便设计交流和代码检查; • 增加代码的可移植性(类似软IP ),方便经验技术交流,加快设计进度。

  48. 企业级大规模FPGA应用设计方法 • 对工程师的要求 • 扎实的专业知识; • 同步电路设计方法及异步电路处理技巧; • 掌握硬件描述语言如VHDL或Verilog语言; • 熟悉各种先进的EDA设计工具,如综合工具、仿真工具、静态时序分析工具及相关厂家的设计流程等。

  49. 原语的使用 • 原语(Primitive) • 针对器件特征开发的常用模块名称; • 可靠做Xilinx为用户提供的“库函数”; • 可以在代码中直接例化使用。 注意: (1)原语的使用要注意具体芯片; (2)通常采用参数化设计; (3)语言模板(Language Templates)中 提供使用说明。

  50. 原语的使用 • 语言模板 • ISE菜单Edit->Language Templates UCF Verilog

More Related