改进的case语句
SystemVerilog为case、casex和casez的判断提供了专门的unique和priority修饰符。这些修饰需放在关键字case、casex和casez前面。
unique case(<case_expression>)...//条件选项
endcasepriority case(<case_expression>)...//条件选项
endcase
1、unique case条件判断
unique case语句指定
- 只有一个条件选项与条件表达式匹配
- 必须有一个条件选项与条件表达式匹配
unique case可以并行求值
修饰符unique允许设计者显示指定条件选项的顺序并不重要,允许并行求值。软件工具可以优化掉推断出的选项顺序优先级。unique修饰符还指定了条件选项匹配。
always_combunique case(opcode)2'b00:y=a+b;2'b01:y=a-b;2'b10:y=a*b;2'b11:y=a/b;
endcase
unique条件检查
一个unique case不能有重叠的条件
当case、casex和casez语句被指定为unique时,软件工具必须在语法上进一步检查以保证每个条件选项都是相斥的。如果在运行时有多个条件选项与条件表达式相匹配,则工具会报告发生了运行错误。
logic[2:0] request;
always_combcasez(request) //设计应该一次只产生一个请求3'b1??:slave1_gant=1;3'b?1?:slave2_gant=1;3'b??1:slave3_gant=1;endcase
unique修饰符表示了设计者是否想让条件选项同时为真。当加入了修饰符unique后,只要条件语句执行并且条件表达式与多个条件选项匹配的情况发生,所有软件工具包括仿真器都会产生警告。
logic [2:0] request;
always_combunique casez(select) //设计应该每次只产生一个grant3'b1??:slave1_gant=1;3'b?1?:slave2_gant=1;3'b??1:slave3_gant=1;endcase
条件选择表不完整检查
unique case必须指明所有条件
当指定case、casex和casez语句为unique时,如果所有的条件选项都不能和条件表达式匹配,也没有缺省条件时,软件工具会报告运行期警告。
logic[2:0] opcode;//3位矢量
always_compunique case(opcode)3'b000:y=a+b;3'b001:y=a-b;3'b010:y=a*b;3'b100:y=a/b;endcase
虽然unique主要是在运行期检查有且只有一个条件选项为真,但如果条件选项都是常数表达式,软件工具可能会在编译期对唯一条件表达式选项的重叠发出警告。像综合编译器和代码检测器这样没有动态运行期的工具只能对选项重叠进行静态检查。
always_comb和unique case都有助于保证过程块用组合逻辑实现。但unique case进行的检查和always_comb进行的检查是不一样的,不过这两种结构都是有助于保证复杂的过程块能综合为期望的逻辑。
unique case是在运行时进行检测,保证每次出现的条件表达式的值只与一个条件选项匹配,这样对每次出现的表达式的值都只能执行条件句的一个分支。运行期检测的优点是只会对在仿真中出现的实际数据作错误检查。缺点是错误检查的质量取决于测试向量的完整性。