ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Verilog HDL 学习笔记(十四)| 第14章 使用Verilog HDL进行逻辑综合

Verilog HDL 学习笔记(十四)| 第14章 使用Verilog HDL进行逻辑综合 14.1 什么是逻辑综合一、逻辑综合的正式定义逻辑综合Logic Synthesis是在标准单元库工艺库和特定的设计约束时序、面积、功耗等的基础上把数字设计的高层次描述Verilog/VHDL代码自动转换为优化的门级网表的过程。一句话理解逻辑综合就是把你写的assign out a b;变成实际电路中一个真实的与门把你写的always (posedge clk) q d;变成一个真实的D触发器。二、为什么需要逻辑综合在逻辑综合工具出现之前设计者需要手工将高层次设计转换为门级电路——画逻辑图、选择门、连线不仅耗时而且容易出错。逻辑综合带来的革命性变化传统方式逻辑综合方式设计者在纸上画逻辑图设计者用Verilog写RTL代码手动选择逻辑门综合工具自动选择最优门手动优化电路综合工具自动优化耗时数周甚至数月数小时内完成逻辑综合把硬件描述语言推到了数字设计技术的最前沿。设计者可以把精力集中在体系结构设计和高层次描述上而把繁琐的门级实现交给工具。三、逻辑综合的输入与输出┌─────────────────────────────────────────────────────────────────────────────┐ │ 逻辑综合的输入与输出 │ │ │ │ ┌─────────────┐ │ │ │ Verilog RTL │──────────────────────────────────────────┐ │ │ │ 代码 │ │ │ │ └─────────────┘ │ │ │ ▼ │ │ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ ┌─────────────┐ │ │ │ 设计约束 │──▶│ 逻辑综合工具 │──▶│ 优化的门级 │ │ 综合报告 │ │ │ │(时序/面积/ │ │ (Design │ │ 网表 │ │ (面积/时序/ │ │ │ │ 功耗) │ │ Compiler等) │ │ │ │ 功耗报告) │ │ │ └─────────────┘ └──────────────┘ └──────────────┘ └─────────────┘ │ │ │ │ │ ┌─────────────┐ │ │ │ │ 标准单元库 │─────────────────────────────────────────┘ │ │ │ (工艺库) │ │ │ └─────────────┘ │ └─────────────────────────────────────────────────────────────────────────────┘输入说明Verilog RTL代码设计者编写的、可综合的RTL级描述标准单元库工艺库目标工艺厂提供的基本单元集合与门、或门、触发器、加法器等设计约束时序要求时钟频率、面积限制、功耗限制等输出说明优化的门级网表由标准单元库中的单元组成的电路连接描述综合报告面积报告、时序报告、功耗报告等14.2 逻辑综合的完整流程逻辑综合通常分为四个主要步骤第一步RTL描述设计者用Verilog在寄存器传输级RTL描述电路的功能。RTL是逻辑综合的标准输入格式。术语RTL表示一种HDL风格它结合了数据流和行为结构。第6章数据流建模和第7章行为级建模的知识在这里汇合。第二步翻译Translation综合工具将RTL描述转换成一个未经优化的内部中间表示。这个过程不考虑面积、时序、功耗等设计约束仅完成简单的内部资源分配中间表示的数据格式由综合工具内部定义用户无需了解第三步逻辑优化Logic Optimization综合工具对中间表示进行布尔逻辑优化删除冗余逻辑。删除重复的逻辑合并相同的子表达式简化布尔函数产生优化后的内部表示第四步工艺映射和优化Technology Mapping and Optimization这是最关键的一步。综合工具使用目标工艺库标准单元库中提供的逻辑单元将优化后的内部表示映射到具体的工艺单元必须满足时序、面积和功耗等设计约束如果不能满足约束需要返回修改RTL描述或调整约束什么是标准单元库标准单元库是目标工艺厂提供的基本构件模块集合包含与门、或门、非门、触发器、锁存器、加法器、多路选择器等单元。每个单元都包含功能描述、版图面积、时序信息、功耗信息。不同工艺厂、不同工艺节点的库各不相同。14.3 可综合与不可综合的Verilog结构这是本章最重要的内容不是所有Verilog语法都能被综合工具接受。许多语法仅用于仿真不能被转换成硬件电路。一、可综合的Verilog结构类别可综合的结构说明数据类型wire、reg、integer部分、parameter基本数据类型模块实例化模块实例引用、门级原语实例引用and、or、not等连续赋值assign组合逻辑描述过程块always (posedge/negedge ...)时序逻辑always (*)或always (敏感列表)组合逻辑条件语句if-else、case、casez选择逻辑循环语句for有明确边界重复结构操作符算术、逻辑、关系、按位、拼接等各种运算always (*)是组合逻辑的最佳实践敏感列表自动包含所有输入信号避免因遗漏信号导致仿真与综合不匹配。二、不可综合的Verilog结构类别不可综合的结构原因/替代方案延迟控制#delay延迟是仿真概念硬件中没有等待初始化块initial硬件没有只执行一次的概念用复位信号替代无限循环while、forever无时钟控制可能导致组合反馈事件控制(event)、命名事件、wait事件是仿真概念系统任务$display、$monitor、$finish等仅用于仿真调试并行块fork-join仅用于仿真部分工具支持有限综合过程连续赋值assign/deassign、force/release不可综合UDP用户自定义原语部分工具不支持三、⚠️ 特别注意事项高频错误1.initial块不可综合// ❌ 不可综合initial块不能转换成硬件 initial begin q 1b0; end // ✅ 可综合用复位信号替代 always (posedge clk or posedge reset) begin if (reset) q 1b0; else q d; end2.#delay会被综合工具忽略// ❌ #10 在综合时被忽略 assign #10 out a b; // ✅ 无延迟的综合描述 assign out a b;3. 循环语句必须有明确的循环边界// ❌ 不可综合循环次数不确定 while (i 16) begin // ... end // ✅ 可综合for循环有明确边界 for (i 0; i 16; i i 1) begin // ... endfor循环在综合时会展开——循环16次就会生成16份相同的硬件电路。循环次数越大生成的电路面积越大。4. 必须显式指定位宽// ⚠️ 不推荐未指定位宽可能生成庞大电路 reg a; // ✅ 推荐显式指定位宽 reg [7:0] a;定义未指定宽度的变量可能产生庞大的门级网表因为综合工具可能根据变量定义生成不必要的逻辑。14.4 可综合的编码风格黄金法则法则一时序逻辑用always (posedge clk) 非阻塞赋值// ✅ 正确的时序逻辑写法 always (posedge clk or posedge reset) begin if (reset) q 1b0; // 非阻塞赋值 else q d; // 非阻塞赋值 end法则二组合逻辑用always (*) 阻塞赋值// ✅ 正确的组合逻辑写法 always (*) begin if (sel) y a; // 阻塞赋值 else y b; end法则三不要在同一个always块中混用阻塞和非阻塞赋值// ❌ 错误混用阻塞和非阻塞 always (posedge clk) begin a b; // 阻塞 c d; // 非阻塞混用 end // ✅ 正确时序逻辑全部用非阻塞 always (posedge clk) begin a b; c d; end法则四所有reg类型变量都要有明确的复位值// ❌ 错误没有复位值上电状态未知 always (posedge clk) begin q d; end // ✅ 正确有复位值 always (posedge clk or posedge reset) begin if (reset) q 1b0; else q d; end法则五避免生成锁存器Latch锁存器是组合逻辑的陷阱——当case或if-else没有覆盖所有分支时综合工具会推断出锁存器。// ❌ 错误缺少else分支 → 推断出锁存器 always (*) begin if (sel) y a; // 缺少elsesel0时y保持原值 → 锁存器 end // ✅ 正确所有分支都有赋值 always (*) begin if (sel) y a; else y b; end // ✅ 正确case有default always (*) begin case (sel) 2b00: y a; 2b01: y b; 2b10: y c; default: y 1b0; // 覆盖所有情况 endcase end14.5 设计约束Design Constraints设计约束是综合工具的指导方针告诉工具你想要的电路是什么样的。一、三大核心约束约束类型说明权衡关系时序约束时钟频率、建立/保持时间要求优化时序 → 面积增大、功耗增加面积约束芯片面积限制优化面积 → 速度下降功耗约束功耗限制优化功耗 → 可能影响时序三者之间存在制约关系为了优化时序可能需要增加硬件资源 → 面积增大、功耗增加为了减小面积又必须在速度上妥协。设计者需要综合权衡。二、常见的时序约束约束说明示例时钟周期规定电路的最高工作频率create_clock -period 10 [get_ports clk]输入延迟输入信号相对于时钟的到达时间set_input_delay -clock clk 2 [get_ports din]输出延迟输出信号相对于时钟的稳定时间set_output_delay -clock clk 3 [get_ports dout]虚假路径不需要时序检查的路径set_false_path -from [get_pins u1/Q]多周期路径需要多个时钟周期的路径set_multicycle_path -setup 2 -from [get_pins u1/Q]14.6 门级网表的验证综合完成后生成的门级网表必须经过验证才能进入下一步布局布线。一、功能验证Functional Verification目的验证门级网表的逻辑功能是否与RTL描述一致。方法对门级网表运行与RTL相同的测试向量比较两者的输出是否一致可以使用形式化验证Formal Verification工具进行数学证明二、时序验证Timing Verification目的验证门级网表是否满足时序约束时钟频率、建立/保持时间等。方法静态时序分析STA穷举所有路径计算最大延迟时序仿真使用时序信息含延迟的门级仿真静态时序分析STA比时序仿真更高效STA可以穷举所有路径而时序仿真只能覆盖部分测试向量。
返回列表