HDL Compiler:full_case综合指令的使用

发布时间:2026/10/26 1:18:21
HDL Compiler:full_case综合指令的使用 相关阅读HDL Compilerhttps://blog.csdn.net/weixin_45791458/category_12893238.html?spm1001.2014.3001.5482综合指令(Synthesis Directives)是一些特殊注释用于影响综合工具如何处理RTL代码这些注释会被综合工具识别但会被其他工具如仿真器忽略。关于综合指令相关概念的更多介绍可以参考下面的博客。HDL Compiler综合指令https://chenzhang.blog.csdn.net/article/details/148695750在阅读本文之前建议先学习case语句的使用如下面这篇博客所示。Verilog基础case类语句(case、casex和casez)https://chenzhang.blog.csdn.net/article/details/130125464在学习full_case综合指令前首先来看一下什么是完整(full)和不完整的case语句。完整的case语句完整的case语句指的是每个可能的case expression的取值都有case item与之匹配或者存在default项。一般来说如果case语句完整则不会综合出锁存器。例1展示了一个完整的case语句case item的四种取值覆盖了sel信号的四种取值图1是例1的综合结果。// 例1 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: y 1b0; endcase endmodule图1 例1的综合结果例2展示了一个完整的case语句case item的四种取值覆盖了sel信号的四种取值但信号没有在所有case分支进行赋值因此会综合出锁存器图2是例2的综合结果。// 例2 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: ; endcase endmodule图2 例2的综合结果不完整的case语句不完整的case语句指的是不是每个可能的case expression的取值都有case item与之匹配且不存在default项。一般来说如果case语句不完整可能综合出锁存器。例3展示了一个不完整的case语句case item的三种取值没有覆盖sel信号的四种取值例3的综合结果与例2相同。// 例3 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; endcase endmodule例4展示了一个不完整的case语句但由于在always结构的开头对所有信号赋了初值不会综合出锁存器如图3所示。// 例4 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) begin y 1b0; case (sel) 2b00: y a; 2b01: y b; 2b10: y c; endcase end endmodule图3 例4的综合结果实际上例4的综合结果相当于一个如例5所示的完整的case语句。// 例5 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: y 1b0; endcase endmodulefull_case综合指令full_case综合指令的语法如下所示。case(***) //synopsys full_case ***:*** ***:*** endcase每个full_case指令会导致其指定的case语句被认为是完整的如果case语句本不完整那些未覆盖的分支中信号将被视为不关心此时该分支的综合结果由综合工具决定对于例6综合工具选择将输出连接到输入c图4是例6的综合结果。// 例6 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) //synopsys full_case case (sel) 2b00: y a; 2b01: y b; 2b10: y c; endcase endmodule图4 例6的综合结果实际上例6的综合结果相当于一个如例7所示的完整的case语句。// 例7 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: y 1bx; endcase endmodule如果读者熟悉显式赋x带来的问题就一定知道为什么建议谨慎使用full_case综合指令它们都会造成前后仿真的不一致对于显式赋x而言仿真时结果为x但综合后结果取决于综合工具但绝不会是x对于使用full_case综合指令仿真时表现为锁存器但综合后结果不会出现锁存器。例8展示在一个反向case语句中使用full_case指令图5是例8的综合结果如果不使用full_case综合指令当current_state为4b0000时不会进入任何case分支这会导致综合结果出现锁存器。// 例8 module one_hot_fsm (current_state, next_state); input [3:0] current_state; output [3:0] next_state; reg [3:0] next_state; parameter STATE1 4b0001; parameter STATE2 4b0010; parameter STATE3 4b0100; parameter STATE4 4b1000; always (*) case (1) // synopsys full_case current_state[0]: next_state STATE1; current_state[1]: next_state STATE2; current_state[2]: next_state STATE3; current_state[3]: next_state STATE4; endcase endmodule图5 例8的综合结果写在最后full_case综合指令不仅针对case语句起作用对于casex和casez语句也是如此不过此时语句是否完整需要考虑x值和z值的影响。如果读者非常明白full_case指令的工作机制且明确自己的意图那么可以使用它。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询