对于这样的组合逻辑电路 always@(X) case(X) X1: X2: …… endcase 如果分支项包含变量X的所有取值情况,并且互相不重复,那么这样的情况,其实没有必要使用综合指令。

(一)“//synthesis parallel_case” 有一些书在介绍case语句时(例如《verilog HDL综合实用教程》)说“case语句的verilog HDL语义表明了选取case分支的优先顺序。case表达式首先与第一个分支项进行比较,依次类推……”但在Quartus中的实验表明, 当分支项包含变量X的所有取值情况,并且互相不重复时,case语句的各个分支选项的优先级是一样的,并且这时对case使用综合指令“//synthesis parallel_case”也不会起作用。 若某两个分支选项相互重叠,这时,case所暗含的优先级顺序就起作用了,在前面的分支项优先级高,并用在编译时Quartus会出现这样的警告: Warning (10935): Verilog HDL Casex/Casez warning at ddd.v(380): casex/casez item expression overlaps with a previous casex/casez item expression 提醒你说分支项重叠了。 在这种情况下,若不使用“//synthesis parallel_case”指令,则重叠的分支项,将会按照“前面的分支项优先级高”的原则被综合。 若使用“//synthesis parallel_case”指令,则我们可以划分几个子集:A1(属于X1,但不属于其它),A2(属于X2,但不属于其它),依此类推,对子集A1,严格按照X1:下的语句执行,对子集A2,严格按照X2:下的语句执行,依此类推。对于其它不能划到任何子集的情况,即重叠部分,则被视为不可能出现的情况,或者说的不关心的情况,对于这种情况,怎么综合有利于简化电路就怎么综合。 所以“//synthesis parallel_case”在这里对于简化电路就很有用了,只要设计者确定重叠的情况不会出现,就可以利用这条指令来简化电路。 这时Quartus会给出警告: Warning (10935): Verilog HDL Casex/Casez warning at Verilog1.v(15): casex/casez item expression overlaps with a previous casex/casez item expression Warning (10935): Verilog HDL Casex/Casez warning at Verilog1.v(16): casex/casez item expression overlaps with a previous casex/casez item expression Warning (10209): Verilog HDL Case Statement warning at Verilog1.v(13): honored parallel_case synthesis attribute - differences between design synthesis and simulation may occur

(二)“//synthesis full_case” 在以上的组合逻辑电路中,如果分支项没有包含所有的情况,则会综合成触发器,那么你可以用default来避免这种情况,对于不关心的情况,随便赋一个值就好了,但是这种随意的赋值付出的代价就是逻辑资源。若用 “//synthesis full_case”则,综合器会自动对没列出的情况赋值,并且它赋的值有利于减少逻辑资源的消耗。至于原因嘛,我觉得可以用化简卡诺图的例子来说明,对于我们不关心的情况,就给它一个X好了,在化简的时候它既可以作为0,又可以作为1.显然比你给它一个0或者1要好点。这就是我们为什么要用“//synthesis full_case”的原因。

转至论坛你的位置:EETOP 赛灵思(Xilinx) 社区 >> 论坛 >> 交流讨论 >> 查看帖子

verilog中if else和case语句有什么区别?

发布: 2013-4-26 13:45 | 作者: MohanGrace | 来源: EETOP 赛灵思(Xilinx) 社区

有次电面被问到的。。不知道怎么回答呃 或者他们在综合的时候有什么区别吗?

qiudanyi1 (2013-4-26 14:02:26)

我认为if else当级数比较多的时候判断会比较慢,顺序一层一层往下判断,而case语句就不曾在这种问题,不知道我回答的对不对啊

yushuiyang1986 (2013-4-26 14:45:12)

串行和并行,以及优先级的问题

MohanGrace (2013-4-26 14:47:41)

回复 3# yushuiyang1986 麻烦能不能说的稍微详细一点呢?

Timme (2013-4-26 15:11:07)

case和if-else都是串行执行的,唯一的不同是case是可综合的四态对比.if-else要么是二态对比,要么是不可综合的四态对比.

HADIST (2013-7-13 10:53:28)

回复 5# Timme 能详细解释一下吗?我觉得是一样的啊,都是含有优先级的判断,综合出来的电路也是一样的吧?好像如果在case语句那添加//synopsys parallel_case 就不一样了?

落日余晖 (2013-7-13 12:46:47)

我认为是case语句做判断时是同时对所有的case情况同时做对比判断,是并行执行,而if else 是顺序执行先判断完if语句,在判断else语句。

HADIST (2013-7-13 14:15:45)

回复 7# 落日余晖 if else和case语句都是有优先级的!case语句也是先判断写才前面的情况是否满足,前面的满足了就直接跳出case了吧。

HADIST (2013-7-13 15:23:38)

回复 9# chen851112 都是串行的啊,都有优先级。

gygyg (2013-7-13 16:12:20)

case应该是并行的

tiangua (2013-7-13 20:07:03)

优先级不一样。

wxwxw (2013-7-14 09:02:30)

case在仿真的时候比if-else效率更高一点,另外,case语句在fpga的编译的时候更高效一点

txwm8905 (2013-7-14 19:07:13)

回复 10# HADIST case是并行的,而且case的每个判断条件是不能冲突的

HADIST (2013-7-14 20:26:54)

回复 14# txwm8905 不知道你是从哪看来的,你可以看一下verilog HDL综合 使用教程,孙海平译的2.14.5节,有明确指出。

Timme (2013-7-14 20:50:23)

QUOTE:

回复 txwm8905 不知道你是从哪看来的,你可以看一下verilog HDL综合 使用教程,孙海平译的2.14.5 ... HADIST 发表于 2013-7-14 20:26

你引用这些山寨教材有什么说服力,EDA先锋工作室的FPGA教材还说case是并行的呢。 Verilog 2001标准(IEEE 1364-2001)第132页:

CODE:

The case item expressions shall be evaluated and compared in the exact order in which they are given.指出了case是串行有优先级。又:

CODE:

Apart from syntax, the case statement differs from the multiway if-else-if construct in two important ways: a) The conditional expressions in the if-else-if construct are more general than comparing one expression with several others, as in the case statement. b) The case statement provides a definitive result when there are x and z values in an expression.a)是废话。b)指出了case是四态对比。除此之外和if-else没有差别。 又,根据ARM的“Verilog X Bugs”(http://www.arm.com/files/pdf/Verilog_X_Bugs.pdf) 第7页:

CODE:

Important things to note about case statements are listed below (which may help to dispel a few myths): · a Verilog case statement is priority encoded (just like a nested if expression) · the case-expression is effectively compared to the case-item with a triple -equal (===) case-equality重复了以上说明。 这种1+1=2级别的东西是真心不想在这里啰嗦。。。标准不读,paper不看,只会道听途说,真是。。。

HADIST (2013-7-14 21:31:56)

回复 16# Timme 贝尔实验室的巴斯克写的书咋山寨了啊。。。比夏宇闻的权威多了吧。。。。

加油99 (2013-7-14 22:09:25)

Altera QuartusII中,使用parallel_case综合属性,可以让case语句综合成没有优先级的并行case逻辑。对于case, casex, casez都一样的。 语句需要这样写(注释部分很重要): case (sel) // synthesis parallel_case ...... 所以,一些资料中认为case是一定无优先级是不准确的。 以下是QuartusII 11.0 Help中“parallel_case”的关键字帮助的摘录: -------------------------------------------------------------------------------- parallel_case Verilog HDL Synthesis Attribute -------------------------------------------------------------------------------- A Verilog HDL synthesis attribute that directs Analysis & Synthesis to implement parallel logic rather than a priority scheme for all case item expressions in a Verilog Design File (.v) Case Statement. ......

neoitachi (2013-7-15 12:20:29)

其实要看具体环境,要是FPGA的话其实就是综合成查找表,if-else和case在有些情况下综合出来的电路时一样的。两者没有绝对优势,要看具体想怎么用。看RTL的话就是串行mux和并行MUX的区别,没有谁快谁慢的区别,如果两者跑的时钟是一样的话速度都是一样的。if-else有优先级,写在前面的条件的电路会靠近后级电路,这样优先将信号传入后级,前级即使满足条件也被后级给屏蔽了,建议可以写几个简单的case和else-if电路综合后看RTL图就能看出来区别了。

Timme (2013-7-16 22:35:02)

[i=s] 本帖最后由 Timme 于 2013-7-16 23:56 编辑 引经据典一大通,不如用Synplify 2013来试试综合结果吧。 相信理解不了if-else和case区别的人(不考虑验证,就是完全没有区别),抓破脑袋都看不懂这个综合结果。。。 (1)用if-else写一个并行MUX

CODE:

module parallel_if(input a,b,c,input [2:0] sel,output reg y); always@(*) if(sel==3'b001) y=a; else if(sel==3'b010) y=b; else if(sel==3'b100) y=c; else y=1'bx; endmoduleRTL图,怎么样,用if-else也可以写出并行MUX吧?

parallel_if.png

(2)用case写一个串行MUX

CODE:

module serial_case(input a,b,c,input [2:0] sel,output reg y); always@(*) case(1'b1) sel[0]:y=a; sel[1]:y=b; sel[2]:y=c; default:y=1'bx; endcase endmoduleRTL图,怎么样,用case也可以写出串行MUX吧?

PS:添加parallel_case属性就可以综合成第一个图的结果,见证奇迹的时刻喔 不信的,请自行用Synplify 2013试验。(用Precision Synthesis也可以,但用Quartus/XST可能看不到上面的结果,因为这两个例子对综合工具的Elaborate能力要求较高。。。是不是也应该把这个例子加入QoR Benchmark)

jium007 (2013-7-17 15:51:56)

QUOTE:

引经据典一大通,不如用Synplify 2013来试试综合结果吧。 相信理解不了if-else和case区别的人(不考虑验 ... Timme 发表于 2013-7-16 22:35

Verilog中关于case语句的优先级相关推荐

  1. mysql能用case嵌套sql吗,关于sqlserver中查询语句中嵌套case语句使用方法

    ryxxlong的博客 Sql server 中的 CASE 语句文章, 链接 http://ryxxlong.iteye.com/blog/531221 写的比较详细,具体内容如下,主要用于自己以后 ...

  2. java break在switch_java中switch case语句需要加入break的原因解析

    java中switch case语句需要加入break的原因解析 java 中使用switch case语句需要加入break 做了具体的实例分析,及编译源码,在源码中分析应该如何使用,大家可以参考下 ...

  3. (64)FPGA面试题-在Verilog中,$display语句可以使用哪些不同的选项?

    1.1 FPGA面试题-在Verilog中,$display语句可以使用哪些不同的选项? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-在Verilog ...

  4. sql语句中case_SQL中的CASE语句

    sql语句中case The case statement in SQL returns a value on a specified condition. We can use a Case sta ...

  5. 在Orderby子句中使用CASE 语句

    CASE 语句可以在SELECT 子句和ORDER BY 子句中使用 CASE语句分为两种Case Simple Expression and Case Search Expression Case ...

  6. mysql 中 case语句吗_Mysql中的Case语句

    1.Case基本初识 case语句是mysql中的一个条件语句,可以在字段中使用case语句进行复杂的筛选以及构造新的字段.下面通过两个leetcode例子来详细解读case语句的功能: 1.1 Le ...

  7. sql语句中的case语句

    sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中,其语法格 ...

  8. verilog 中if....else语句以及case语句详细理解

    1.if else: (1)if(表达式)语句: (2)if(表达式) 语句一else语句二 (3)if(表达式1) 语句一:else if(表达式2) 语句2:else if(表达式3) 语句3:e ...

  9. Verilog中if- else if语句和case语句用法:

    一.if语句: 1.两种情况 if(条件语句)begin-- end else begin-- end 2.多种情况 if(条件语句)begin-- end else if(条件语句)begin-- ...

最新文章

  1. 提升思辨能力和判断力
  2. AngularJS鼠标进入划出事件
  3. ZABBIX安装官方指南
  4. [MATLAB学习笔记]clf清空图窗1013(1)
  5. ExtJs4学习(七)MVC中的Store
  6. .NET Core开发实战(第17课:为选项数据添加验证:避免错误配置的应用接收用户流量)--学习笔记...
  7. columnproperty server sql_获取SQL Server表字段的各种属性
  8. C语言学习趣事_你不知道的C语言应用
  9. 无论是cisco还是华三的书上对于子网划分有个问题需要解释
  10. 我为什么喜欢Go语言
  11. 【操作系统】请求调页
  12. 解决Keras 与 Tensorflow 版本之间的兼容性问题,导入keras报错:module 'tensorflow.python.keras.backend' has no attribute
  13. 数据库中复合主键与联合主键
  14. 计算机驱动伺服的程序,伺服调试软件V-ASSISTANT始终找不到驱动-工业支持中心-西门子中国...
  15. 用R语言实现信息度量
  16. CSS 基础3(内边距、外边距、边距模型)
  17. ios 网速监控_iOS 监测网络状态
  18. 站内信“数据库设计思路”
  19. MOSFET开关管的结构以及在MATLAB中的连接
  20. 颠覆平庸 在技术上持续精进

热门文章

  1. 2021年春季学期-信号与系统-第五次作业参考答案-第六小题
  2. 时雨月五| AI机器学习实战の电磁导航智能车中神经网络应用的问题与思考
  3. 快速下载Centos7:Centos镜像地址(阿里云镜像)
  4. 查看 mysql 占用的内存大小_mysql查看数据库和表的占用空间大小
  5. 国服被ban咋看_王者荣耀:赵云不会玩?完美详细攻略教学,看完助你轻松上王者...
  6. plantuml 依赖_使用PlantUML绘制类图
  7. 静态方法与非静态方法的区别_程序员必看之ThinkPHP5中model与Db的区别
  8. linux ppp拨号 socket,请问GPRS模块ppp拨号不成功是什么原因
  9. lingo 嵌套@for或嵌套@sum
  10. “No module named ‘vtk.util‘;‘vtk‘ is not a package”问题完美解决