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

  • case语句介绍
    • case item statement
    • case default
    • ==Casez&Casex==
  • full_case parallel_case简介
    • parallel case
    • full case
  • 引导语句
  • 综合编码风格
  • 使用full_case指令出现latch的情况
  • 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: beginy <= d;end // 2'd3:3'd4: begin if( e > f ) beginy <= g;end else if ( a > b ) begin y <= 3'd0;endend // 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)
beginCASE1: 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)
beginCASE1: 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语句比使用指令来弥补不良编码实践更好。

//synopsys full_case parallel_case综合指令的用法相关推荐

  1. DC综合的引导语句——synopsys translate_off/synopsys translate_on/parallel_case/full_case

    DC综合的引导语句--synopsys translate_off/synopsys translate_on/parallel_case/full_case 最近在读他人verilog代码中发现存在 ...

  2. linux入门(三)常见Linux指令及其用法

    一.上回说到说到Linux的shell指令运行的原理,这回我们来看看Linux中shell的权限管理,所谓的"权限"是指某一类人做某一件事的权利. 在shell中这一类人被分为了三 ...

  3. FreeMarker中assign指令的用法

    assign assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量, assign指令的用法有多种,包含创建或替换一个顶层变量,或者创建或替换多个变量等, 它的最简单的语法如 ...

  4. 几个预编译指令的用法

    *.几个预编译指令的用法 #        字符串化运算符,其主要效果是把参数的名字转换为字符串. Example: //1. *.h中定义 #defineSTRINGLIZE(ivalue)  #i ...

  5. linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...

    tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装, 安装 sudo apt install tree ...

  6. Vue.js自定义指令的用法与实例

    市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...

  7. 我的世界java版tp_神奇的tp指令 我的世界tp指令的用法

    神奇的tp指令 我的世界tp指令的用法.tp指令是每个玩服务器的玩家都要了解和掌握的一个指令,那下面游戏园小编就给大家详细的介绍一下在我的世界中tp指令要怎么使用吧!希望大家喜欢. 其实是运用到了指令 ...

  8. 并行计算:openMP(一)—— parallel,for,sections指令的用法

    一.简介 OpenMP介绍 在C/C++中,OpenMP可以通过使用预处理指令来让程序并行化.OpenMP指令使用的格式为: #pragma omp 指令 [子句[子句]-] 下面是一个最简单的Ope ...

  9. linux下tree指令的用法

    linux下tree指令的用法 (2010-04-20 23:23:48) 转载 标签: 杂谈 分类: linux学习笔记 首先来看tree的用法 tree 中文解释:tree 功能说明:以树状图列出 ...

最新文章

  1. 剑指offer:面试题20. 表示数值的字符串
  2. 紫书 习题7-14 UVa 307(暴搜+剪枝)
  3. Windows Management Instrumentation WMI Security Technology Learning
  4. IP地址,子网掩码、默认网关,DNS服务器是什么意思
  5. [MySQL] 事务的ACID特性
  6. jemter在linux上怎么安装_办公便签软件怎么下载?怎么在电脑桌面上下载安装一款办公便签软件...
  7. 修改Tomcat Connector运行模式,优化Tomcat运行性能
  8. c语言中函数指针用法,C语言函数指针的用法
  9. java docx4j_docx4j基本操作
  10. 二、图的遍历——深度优先遍历
  11. 选择部门-选择员工(js)
  12. SpringBoot上传xlsx并批量导入
  13. html中点击按钮闪现,vue使用v-if v-show页面闪烁,div闪现的解决方法
  14. 最完整的Android 安卓开发体系了解一下
  15. 如何解决电脑使用中任务栏“卡死”问题。
  16. 我的世界服务器创世神文件夹,我的世界服务器怎么给创世神权限的指令
  17. 2-Druid 系统框架
  18. excel表格怎么调整行高和列宽_Excel 表格技巧—一键调整行高列宽的方法
  19. 惯性导航原理(二)-平台式+捷联式+INS精度
  20. QUANT[10]量化交易——因子暴露度,因子收益与模型

热门文章

  1. 1.2 Architectural Fundamentals
  2. 2021电赛控制类预测【看了也不亏系列】
  3. 网站 服务器 和 空间大小,网站空间多大合适
  4. 计算机驱动安装的几个方法,安装驱动方法详解
  5. webshell批量寄生虫
  6. NLP-信息抽取-关系抽取-2016:Attention-BiLSTM实体关系分类器【基于双向LSTM及注意力机制的关系分类】【数据集:SemEval-2010 Task 8】
  7. wifi 联想小新_WiFi 6网卡?官方辟谣联想小新Air 14 2020只支持WiFi 5
  8. android icon hide,Android Launcher隐藏指定应用的启动图标
  9. Python做的眼睛护士
  10. 华三无线控制器配置本地转发