"//synopsys full_case parallel_case"综合指令的用法

case语句介绍

在Verilog里,一段case语句包括

case()   //casez,casex
 (表达式)
endcase        

case语句是一种多分支选择语句,if-ese语句只有两个分支可以选择,但是case可以直接处理多分支语句。
如图1
在这里插入图片描述

case item statement

case语句其他部分比较简单,书上都有,对case item statement介绍一下。
它是有多个Verilog条件表达式组成,如果条件匹配,则执行这条语句。如果有多条语句要被执行,则Case item statement部分需要在Begin和end之间。

case (cnt)
            3'd0: begin 
               y <= a;
            end // 2'd0:
            3'd1: begin 
                y <= b;
            end // 2'd1:
            3'd2: begin 
                y <= c;
            end // 2'd2:
            3'd3: begin
                y <= d;
            end // 2'd3:
            3'd4: begin 
                if( e > f ) begin
                    y <= g;
                end else if ( a > b ) begin 
                    y <= 3'd0;
                end
            end // 2'd6:
        endcase // cnt

case default

Default是一个可以写也可以不写的语句,如果没有匹配的条件,则会执行default。
Cllifford认为不管需不需要,添加一个default语句是很好的编码风格,否则会自动生产锁存器。

Casez&Casex

附上Casez和Casex的真值表
在这里插入图片描述
casex和casez是case的特殊情况,用来处理过程中不必考虑的情况(don’t care condition)。casez用来处理不用考虑高阻值,casex表示不用考虑高阻值和不定值。
指南:使用Verilog casez语句编写可合成模型时要谨慎[2]。
不要使用Verilog casex语句。

编码风格指南:使用“不关心”对case语句进行编码时,使用casez statemet并使用“?” 在案例项中使用字符而不是“z”字符来表示“不关心”位。

full_case parallel_case简介

parallel case

在写RTL的时候,常常会用到CASE语句,但是case语句实际综合后,产生的逻辑变化比较多,parallel_case和full_case主要就是用来控制综合器把case语句综合成什么硬件逻辑。
首先说说parallel_cata。
例子一:

case (CASE_SIGNAL)
begin
 CASE1: A = B;
 CASE2: A = C;
  default:   A = D;
end
endcase

在这个case语句中,如果没有parallel_case的限制,case的条件是有优先级的,CASE1的优先级最高,CASE2次之,default最后。产生这样的优先级,是要用相应的硬件产生的。但是有些设计中,case语句不需要优先级,不同的case不会同时产生,那么综合器生成的优先级逻辑就是冗余的了。为了去除这些冗余逻辑,就用

case (CASE_SIGNL) // synopsys parallel_case

来告诉综合器,不需要产生优先级逻辑,而缩小了硬件的规模。但产生的副作用是,设计者要保证CASE1和CASE2不会同时发生,否则A会被赋予一个不确定的值。

编码优先编码器
parallel case语句推断优先级编码器。使用case语句对优先级编码器进行编码是一种糟糕的编码实践。最好使用if-else-if语句对优先级编码器进行编码。
准则:使用if-else-if语句对所有优先级编码器进行编码。
当典型设计被编码为if-else-if语句时,它更容易识别优先级编码器。
准则:item statement可用于创建表格编码并行逻辑。
当类似真值表的结构使Verilog代码更简洁和可读时,建议使用case语句进行编码。
指南:检查所有综合工具案例陈述报告[5]。
指南:只要综合工具报告案例陈述not parallel(每当综合工具报告“并行”为“parallel_case”时),就更改上述编码指南中概述的case item statement。
查阅<<“full_case parallel_case”, the Evil Twins of Verilog Synthesis>>
尽管可以从案例陈述中推断出优先级良好的编码器,但遵循上述编码准则将有助于防止预合成和后合成模拟之间的错误和不匹配。

full case

case (CASE_SIGNAL)
begin
  CASE1: A = B;
  CASE2: A = C;
end
endcase

在例子二中,没有default的选项,综合器会产生一个latch,因为CASE都不成立时,A要保持上一次的值。然而通常设计者是不希望产生这个latch的。这时候,使用

case (CASE_SIGNL) // synopsys full_case

来告诉综合器,所有的CASE已经覆盖,不需要自动产生latch。
但产生的副作用是,设计者要保证只会有CASE1和CASE2,不会有CASE3的出现,否则A会是一个不确定的值。

注:陈佩蕙的代码规范中,建议不要使用这两种综合指令。
注:写case的时候 千万要写 default,即使你条件写满了 也要写default,避免产生latch

引导语句

Synopsys提供了引导语句,设计者可以使用这些引导语句控制DC综合的对象。
在设计代码中,引导语句“// synopsys translate_off”后直到“// synopsys translate_on”之间的语句被DC忽略。下面的例子给出了这两个引导语句的用法。

// synopsys_translate_off
integer i;
initial begin
for(i=0; i<MEM_DEPTH;i=i+1) begin
mem[i] = 8’h00;
end
end
// synopsys_translate_on

综合编码风格

Sunburst设计假设:为综合工具提供与设计功能相关的不同信息通常是一种糟糕的编码实践。
无论何时将“full_case”或“parallel_case”指令添加到Verilog源代码中,都可能会向合成工具提供有关给予模拟器的设计的更多信息。
指南:通常,不要将“full_case parallel_case”指令与任何Verilogcase statements一起使用。
指南:上述指南有例外情况,但如果您计划在Verilog代码中添加“full_case parallel_case”指令,需要更好地了解自己在做什么。
指南:不要在Verilog代码中为所有item statement’添加“full_case parallel_case”
指南:仅使用full_case parallel_case来优化onehot FSM设计。

使用full_case指令出现latch的情况

“full_case”指令仅从item statement中删除缺失item的锁存。综合器推断锁存器的最常用方法之一是从单个case语句中分配多个输出,但忽略为每个case项分配所有输出。即使将“full_case”指令添加到这种类型的case语句也不会消除锁存器。
如下图

在这里插入图片描述
消除锁存器的最简单方法是在执行case语句之前,对灵敏度列表的所有输出进行初始默认值赋值,如例9所示。
在这里插入图片描述

Synopsys警告

当通过design_analyzer或dc_shell读取Verilog文件时,当“full_case”指令与不完整的case语句一起使用时,Synopsys会发出警告(请参阅Synopsys“full_case”说明)。
示例10显示了带有“full_case”指令的非完整case语句。 图17显示了“full_case”指令与非完整case语句一起使用时报告的警告。
在这里插入图片描述
在这里插入图片描述
图17中的警告实际上是在说“注意!full_case指令可能会起作用并导致您的设计中断!” 不幸的是,在运行综合脚本时很容易错过这个警告,并且设计可能会受到“full_case”指令的不利影响。
类似地,当由design_analyzer或dc_shell读取Verilog文件时,当“parallel_case”指令与不是“并行”的case语句一起使用时,Synopsys会发出警告。 (参见4.4节中的Synopsys“parallel_case”描述)。
例11显示了带有“parallel_case”指令的非并行case语句。 图18显示了“parallel_case”指令与非并行case语句一起使用时报告的警告。
在这里插入图片描述
图18中的警告实际上是在说“注意!parallel_case指令可能会起作用并导致您的设计中断!” 不幸的是,这个警告,比如“full_case”警告,在运行综合脚本时也很容易被忽略,并且设计可能会受到“parallel_case”指令的不利影响。

实际设计Full case 问题

在例12中使用enable的2到4解码器使用在不使用任何综合指令的情况下编码的case语句。 最终的设计是一个由3输入,门和逆变器构成的解码器。 没有推断出锁存器,因为在case语句之前所有输出都被赋予了默认赋值。 对于该示例,预合成和后合成设计和模拟匹配。
在这里插入图片描述
在这里插入图片描述
在例13中使用enable的2到4解码器使用带有“full_case”综合指令的case语句。 由于这个综合指令,使能输入(en)在合成期间被优化掉并留作悬空输入。 模块code4a和code4b的预综合结果与模块代码4a的综合后结果相匹配,但与模块代码4b [2]的综合后结果不一致。
在这里插入图片描述
在这里插入图片描述

实际设计Parallel case问题

一位顾问分享了将“parallel_case”添加到Verilog代码中的经验,该代码用于大型ASIC设计,以消除杂散优先级编码器并推断出更小更快的设计。 Verilog case 语句被编码为优先级编码器,所有RTL模拟都能正常工作。 遗憾的是,没有优先级编码器的门级设计无法正常工作,并且门级仿真没有发现问题。

总结

指南:使用Verilog casez语句编写可综合模型时要谨慎[2]。
指南:不要将casex用于可综合代码[2]。
指南:通常,不要将“full_case parallel_case”指令与所有Verilog case语句一起使用。
指南:上述指南有例外情况,但如果您计划在Verilog代码中添加“full_case parallel_case”指令,需要更好地了解自己在做什么。
准则:使用if-else-if语句对所有优先级编码器进行编码。当典型设计工程师被编码为if-else-if语句时,它更容易识别优先级编码器。
指南:当类似真值表的结构使Verilog代码更简洁和可读时,建议使用case语句进行编码。
指南:检查所有综合工具案例陈述报告[5]。
指南:只要综合工具报告案例陈述不平行(每当综合工具报告“并行”为“parallel_case”时),就更改上述编码指南中概述的案例陈述代码。
指南:仅使用full_case parallel_case来优化onehot FSM设计。
编码风格指南:使用“不关心”对case语句进行编码时,使用casez语句并使用“?”在案例项中使用字符而不是“z”字符来表示“不关心”位。
指南:教育(或解雇)任何通常在其Verilog代码中为所有案例陈述添加“full_case parallel_case”的员工或顾问。
结论:“full_case”和“parallel_case”指令在工作时最危险!编写完整和并行的case语句比使用指令来弥补不良编码实践更好。

  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值