700 likes | 915 Views
VLSI 系统设计. 第六章 可综合电路设计. 天津大学计算机科学与技术学院 计算机工程系 魏继增. 1. 2. 3. 4. 5. 6. 可综合的电路设计. 逻辑综合的概念、流程及举例. 可综合组合逻辑电路的建模. 可综合时序逻辑电路的建模. 可综合状态机的建模技巧. 可综合逻辑电路建模优化技巧 / 语法结构. 使用 Design Compiler 进行逻辑电路综合. 逻辑综合的概念、流程及举例. 逻辑综合的概念 逻辑综合的流程 逻辑综合流程举例 常见的层次划分方法. C 语言 VS. Verilog.
E N D
VLSI系统设计 第六章 可综合电路设计 天津大学计算机科学与技术学院 计算机工程系 魏继增
1 2 3 4 5 6 可综合的电路设计 逻辑综合的概念、流程及举例 可综合组合逻辑电路的建模 可综合时序逻辑电路的建模 可综合状态机的建模技巧 可综合逻辑电路建模优化技巧/语法结构 使用Design Compiler进行逻辑电路综合
逻辑综合的概念、流程及举例 • 逻辑综合的概念 • 逻辑综合的流程 • 逻辑综合流程举例 • 常见的层次划分方法
C语言 VS. Verilog • C语言的代码是一行一行执行的,顺序结构。 • Verilog是硬件描述语言,语句同时进行,并行结构。 • C语言 逻辑功能 • Verilog 物理电路 注:Verilog语法结构更加复杂,更加严谨,规则更多
HDL抽象层次 行为级算法级(behavioral) 寄存器传输级(RTL) 逻辑电路 门级(Gate Level) 开关级(Switch Level) HDL在每个抽象层次上的描述都能转化为实际的逻辑电路吗?
逻辑综合的基本概念 • 逻辑综合是在标准单元库和特定的设计约束的基础上,把设计的高层次描述转换成优化的门级网表的过程。 • 标准单元库(工艺库)可以包含基本门电路单元,如与门、或门等,也可以包含宏单元,如加法器、触发器等,由Foundry工厂提供。 • 设计约束主要包括时序、面积、功耗、可测性等。 • 通俗地讲,逻辑综合就是将采用Verilog HDL描述的硬件模型转变为能用硬件电路实现的基本逻辑单元的连接的过程。 • 可综合Verilog是Verilog HDL的子集,对于不同的综合工具可综合子集也不同。 • RTL级建模
(自动)逻辑综合对于VLSI系统设计的影响 • 大幅降低了设计中出现错误的概率 • 从高层次设计到逻辑门的转换非常迅速,设计周期大幅缩短 • 模块重新设计所需的反复时间更短 • 逻辑综合工具在整体上优化了设计 • 逻辑综合工具允许进行与工艺无关的设计,加大了设计重用性
逻辑综合的概念、流程及举例 • 逻辑综合的概念 • 逻辑综合的流程 • 逻辑综合流程举例
逻辑综合的流程 逻辑综合 EDA工具支持 工艺无关 工艺相关
逻辑综合的流程 • 翻译:RTL描述被逻辑综合工具转换为一个未经优化的内部表示,不考虑面积、时序和功耗等约束。 • 逻辑优化:去除冗余逻辑,使用大量与工艺无关的布尔逻辑优化技术,产生优化后的内部表示。 • 工艺映射和优化:综合工具接受内部表示,使用工艺库中提供的单元,用逻辑门实现该内部表示,并根据设计约束进行相应的优化。
逻辑综合的流程 设计人员可控 工艺无关 工艺相关 设计人员可控 设计人员可控
工艺库 • 库单元是IC制造公司用做IC制造的基本构建模块,每个单元都有相应的特性描述: • 单元功能 • 单元的版图面积 • 单元的时序信息 • 单元的功耗信息 • 单元的I/O属性信息 • 库单元的集合称为工艺库,综合工具使用这些单元来实现设计。 • 常用工艺库:SMIC、TSMC、GSMC、INTEL、AMD
设计约束 • 时序:电路必须满足一定的时序和速度要求,可采用静态时序分析STA检查时序。 • 面积:最终的版图面积不能超过一定的限制。 • 功耗:电路功耗不能超过一定的界限。 • 三者之间的折中关系(一切系统设计的基础!) • 定义时钟,设计规则约束,输入输出延迟,环境约束条件等
设计约束——面积/时间 举个例子?
逻辑综合的概念、流程及举例 • 逻辑综合的概念 • 逻辑综合的流程 • 逻辑综合流程举例
逻辑综合的举例 设计描述 • 设计名称:magnitude_comparator • 设计输入:A和B,4位 • 如果A大于B,输出A_gt_B • 如果A小于B,输出A_lt_B • 如果A等于B,输出A_eq_B • 比较器尽可能快,为了提高速度可以牺牲面积
逻辑综合的举例 module magnitude_comparator(A_gt_B, A_lt_B, A_eq_B, clk, rst_b, A, B); input [3:0] A, B; input clk, rst_b; output A_gt_B, A_lt_B, A_eq_B; reg A_gt_B, A_lt_B, A_eq_B; always @(posedge clk) begin if (rst_b) A_gt_B <= 0; A_lt_B <= 0; A_eq_B <= 0; else begin if (A > B) A_gt_B <= 1; if (A < B) A_lt_B <= 1; if (A == B) A_eq_B <= 1; end end endmodule RTL描述:
逻辑综合的举例 工艺库:假设使用SMIC公司130ns工艺库 //typical_1v2c25工艺库中库单元描述 • OAI31XL {input1,input2,output,func., area, timing, cap, . . .} //(!((A0 | A1 | A2) & B0)) • NOR2BX1 //两输入或非门 • NAND2X1 //两输入与非门 • XNOR2X1 //两输入异或非门 • INVX1 //非门 • EDFFX2{. . .} //边沿触发的D触发器
逻辑综合的举例 设计约束:设计尽可能快,没有面积约束 • 综合脚本中给出约束条件:优化电路使其获得最快的运行速度。 时序约束: create_clock -name $clock_name -period [expr $clk_period] [get_ports $clock_name] 面积约束: set_max_area $area_desired(可以设置为“0”)
逻辑综合的举例 逻辑综合: • 逻辑综合工具读取RTL描述 • 逻辑综合工具读取工艺库和设计约束 • 映射和优化 • 生成优化的门级描述
逻辑综合的举例 优化后的门级描述:图形化描述和Verilog描述 Design Compiler综合结果
逻辑综合的举例 IC制造: • 验证门级网标的功能和时序 • 交付XXX公司 • XXX公司使用XXX_65工艺完成芯片版图 • 确保版图满足时序的要求 • 制做IC芯片 也可由设计者完成
逻辑综合的流程 可综合编码风格和规范是IC设计最重要的决定因素 设计人员可控 工艺无关 工艺相关 设计人员可控 设计人员可控
1 2 3 4 5 6 可综合的电路设计 逻辑综合的概念、流程及举例 可综合组合逻辑电路的建模 可综合时序逻辑电路的建模 可综合状态机的建模技巧 可综合逻辑电路建模优化技巧/语法结构 使用Design Compiler进行逻辑电路综合
连续赋值语句的综合 • 连续赋值语句的左端必须是线网类型(wire)的标量或向量,不能是寄存器类型(reg)的标量或向量。 • wire out; assign out = a & b; (正确) • reg out; assign out = a & b; (错误) • 连续赋值语句中不能出现延迟信息。 • wire out; assign #10 out = a & b; (错误) • 连续赋值语句通常可被综合为连线或多路选择器。
连续赋值语句综合举例——连线 module andor (a, b, c, out); input a, b, c; output out; assign out = (a & b) | c; endmodule
连续赋值语句综合举例——多路选择器 module mux (s, i0, i1, out); input i0, i1, s; output out; assign out = (s)? i0 : i1; endmodule
always块组合逻辑电路综合 • always块可以综合为组合逻辑电路、时序逻辑电路以及电平敏感的锁存器。 • 电平敏感+阻塞赋值组合逻辑电路 • 在always块中,所描述电路的所有输入信号(input)都必须在always @(电平敏感列表)中列出,如:always@(*) • 如果在赋值表达式右端引用了电平敏感列表中没有列出的信号,将会为该信号综合出锁存器。 • always块中赋值语句的左端必须是reg类型的变量,对于组合逻辑电路的描述,该变量被综合为连线。
always块举例——组合逻辑电路 module combin_logic (a, b, c, e); input a, b, c; output e; reg d, e; always @(a or b or c) begin d = a & b; e = c | d; end endmodule
always块举例——锁存器 module latch (a, b, c, e); input a, b, c; output e; reg d, e; always @(a or b) begin d = a & b; e = c | d; // 推导出锁存器 end endmodule 错误
if-else和case语句综合举例 • if-else和case语句都可综合出多路选择器。 • 完全互斥的case语句综合出并行多路选择器。 • 当if-else语句的分支完全互斥时,综合出并行多路选择器。 • 当if-else或case语句的分支不完全互斥时,综合出带优先级多路选择器。 • if-else或case语句的所有分支都必须有输出,否则将综合出锁存器。
if-else语句举例——并行多路选择器 module parallel_mux (a, b, sel, out); input a, b ,sel; output out; reg out; always @(a or b or sel) begin if (sel) out = a; else out = b; end endmodule 并行多路选择器
if-else语句举例——带优先级多路选择器 module prior_mux (a, b, c, sel, out); input a, b, c; input [1:0] sel; output out; reg out; always @(a or b or c or sel) begin if (sel==2’b00) out = a; else if (sel == 2’b01) out = b; else out = c; end endmodule
if-else语句举例——带优先级多路选择器 带优先级多路选择器
case语句举例——并行多路选择器 module parallel_mux_case (a, b, sel, out); input a, b; input sel; output out; reg out; always @(a or b or sel) begin case(sel) 1’b0: out = a; 1’b1: out = b; endcase end endmodule 并行多路选择器
if-else或case语句举例——锁存器 锁存器 module latch_case (a, b, sel, out); input a, b; input [1:0] sel; output out; reg out; always @(a or b or sel) begin case(sel) 2’b00: out = a; 2’b01: out = b; endcase end endmodule //synopsys full_case 综合指令 default:out = 1’b0 问题:除了列出的条件,不会再有其他条件出现,不要出现锁存器?
锁存器综合总结 • always电平敏感列表必须包含所有的输入。 • if-else或case语句中必须说明所有可能的条件分支。 • 锁存器和触发器实现的逻辑功能基本相同,都是暂存数据,但锁存器存在一些缺点,尽量避免使用。 • 没有时钟端,不受同步时钟的控制,无法实现同步操作。 • 毛刺敏感,很难保证输出没有毛刺产生。 • 会使静态时序分析变得复杂,可测性不好。 • FPGA器件中有大量的D触发器结构而没有锁存器这种现成的结构,使用锁存器会更耗资源。
loop语句的综合 • 在Verilog 语法中,一共有四种loop语句: • while • for • forever • Repeat • for语句使用的最多,也是一种典型的可以被综合的loop语句。 • for语句综合的基本原则就是将里面的所有语句进行展开。
loop语句的综合 module Demultiplexer (Address, Line); input [1:0] Address; output [3:0] Line; reg [3:0] Line; integer J; always @(Address) begin for(J = 3; J <= 0; J = J - 1) if (Address == J) Line[J] = 1; else Line[J] = 0; end endmodule
loop语句的综合 module Demultiplexer (Address, Line); input [1:0] Address; output [3:0] Line; reg [3:0] Line; always @(Address) begin if (Address == 3) Line[3] = 1; else Line[3] = 0; if (Address == 2) Line[2] = 1; else Line[2] = 0; if (Address == 1) Line[1] = 1; else Line[1] = 0; if (Address == 0) Line[0] = 1; else Line[0] = 0; end endmodule 注:不要在循环体内加入一些延时或面积较大的单元。
算术电路的综合 • 一般情况直接写算术运算符号即可,如+,-,×等。 • 若时序、面积无法到达设计约束,需要对算术电路进行单独优化设计。 • 借助综合工具提供的综合库,如Synopsys公司Design Compiler逻辑综合工具提供的DesignWare综合库。 • DesignWare是集成在DC综合环境中的可重用电路的集合,主要常用的算术运算符和逻辑运算符。 • 针对同种运算符,DesignWare可能提供不同的算法。
算术电路的综合 Z = A + B Ripple Carry Select fast Conditional Sum Synthesis DW Foundation Brent-Kung + Carry Look-Forward Carry Look-Ahead small DW Basics Ripple Carry
算术电路的综合 SUM = A * B + C * D + E + F + G A * B + + C + * E + SUM D F G Max_Delay = 1 MUL + 4 ADD SUM = (A * B) + ((C * D) + ((E + F) + G)) E + F + + G + SUM C * D A * B Max_Delay = 1 MUL + 3ADD
组合逻辑电路综合的注意事项 • 不可出现延迟描述。 • assign赋值语句的左边必须是wire类型的变量。 • always块赋值语句的左边必须是reg类型的变量。 • always电平敏感列表中必须包含所有的输入变量,否则将产生锁存器。always @(*) • if-else和case分支语句必须包含所有可能的分支,否则将产生锁存器。 • 避免组合反馈,即组合电路的设计中不能出现回路,否则造成电路的不稳定。 • 循环体内的运算不宜过复杂。
1 2 3 4 5 6 可综合的电路设计 逻辑综合的概念、流程及举例 可综合组合逻辑电路的建模 可综合时序逻辑电路的建模 可综合状态机的建模技巧 可综合逻辑电路建模优化技巧/语法结构 使用Design Compiler进行逻辑电路综合
always块时序逻辑电路综合 • 组合逻辑 + 寄存器组成 • 时钟敏感(沿触发) + 非阻塞式赋值 • 每个表示时序的always块只能由一个时钟沿触发。 • 置位或复位最好也由时钟沿触发(同步置位/复位)。
always块时序电路综合举例——寄存器 module dff (clk, data, out); input clk, data; output out; reg out; always @(posedge clk) begin out <= data; end endmodule 寄存器
值保持器建模总结 • 连线 • 触发器(边沿触发的存储元件) • 锁存器(电平触发的存储元件) 变量
值保持器建模总结 • Verilog HDL中的变量既可以是线网(wire)类型,也可以是寄存器(reg)类型。 • wire类型综合后映射成为硬件中的连线。 • 不要将reg类型的变量与实际电路中由边沿触发的触发器构成的硬件寄存器混淆。可被综合工具综合为连线、寄存器、锁存器。
always块时序电路综合举例——同步复位/置位 module dff_syn (clk, rst, set, data, out); input clk, rst, set, data; output out; reg out; always @(posedge clk) begin if (rst) out <= 0; else if (set) out <= 1; else out <= data; end endmodule 同步复位/置位寄存器