在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: MohanGrace

[求助] verilog中if else和case语句有什么区别?

[复制链接]
发表于 2013-7-13 20:07:03 | 显示全部楼层
优先级不一样。
发表于 2013-7-14 09:02:30 | 显示全部楼层
case在仿真的时候比if-else效率更高一点,另外,case语句在fpga的编译的时候更高效一点
发表于 2013-7-14 19:07:13 | 显示全部楼层
回复 10# HADIST


   case是并行的,而且case的每个判断条件是不能冲突的
发表于 2013-7-14 20:26:54 | 显示全部楼层
回复 14# txwm8905


   不知道你是从哪看来的,你可以看一下verilog HDL综合 使用教程,孙海平译的2.14.5节,有明确指出。
发表于 2013-7-14 20:50:23 | 显示全部楼层




你引用这些山寨教材有什么说服力,EDA先锋工作室的FPGA教材还说case是并行的呢。


Verilog 2001标准(IEEE 1364-2001)第132页:





  1. The case item expressions shall be evaluated and compared in the exact order in which they are given.


复制代码


指出了case是串行有优先级。又:





  1. Apart from syntax, the case statement differs from the multiway if-else-if construct in two important ways:
  2. 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.
  3. 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页:





  1. Important things to note about case statements are listed below (which may help to dispel a few myths):
  2. · a Verilog case statement is priority encoded (just like a nested if expression)
  3. · the case-expression is effectively compared to the case-item with a triple -equal (===) case-equality


复制代码


重复了以上说明。

这种1+1=2级别的东西是真心不想在这里啰嗦。。。标准不读,paper不看,只会道听途说,真是。。。
发表于 2013-7-14 21:31:56 | 显示全部楼层
回复 16# Timme


   贝尔实验室的巴斯克写的书咋山寨了啊。。。比夏宇闻的权威多了吧。。。。
发表于 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.
......
发表于 2013-7-15 12:20:29 | 显示全部楼层
其实要看具体环境,要是FPGA的话其实就是综合成查找表,if-else和case在有些情况下综合出来的电路时一样的。两者没有绝对优势,要看具体想怎么用。看RTL的话就是串行mux和并行MUX的区别,没有谁快谁慢的区别,如果两者跑的时钟是一样的话速度都是一样的。if-else有优先级,写在前面的条件的电路会靠近后级电路,这样优先将信号传入后级,前级即使满足条件也被后级给屏蔽了,建议可以写几个简单的case和else-if电路综合后看RTL图就能看出来区别了。
发表于 2013-7-16 22:35:02 | 显示全部楼层
本帖最后由 Timme 于 2013-7-16 23:56 编辑

引经据典一大通,不如用Synplify 2013来试试综合结果吧。

相信理解不了if-else和case区别的人(不考虑验证,就是完全没有区别),抓破脑袋都看不懂这个综合结果。。。


(1)用if-else写一个并行MUX





  1. module parallel_if(input a,b,c,input [2:0] sel,output reg y);
  2. always@(*)
  3.   if(sel==3'b001)
  4.     y=a;
  5.   else if(sel==3'b010)
  6.     y=b;
  7.   else if(sel==3'b100)
  8.     y=c;
  9.   else
  10.     y=1'bx;
  11. endmodule


复制代码


RTL图,怎么样,用if-else也可以写出并行MUX吧?
parallel_if.png

(2)用case写一个串行MUX





  1. module serial_case(input a,b,c,input [2:0] sel,output reg y);
  2. always@(*)
  3.   case(1'b1)
  4.     sel[0]:y=a;
  5.     sel[1]:y=b;
  6.     sel[2]:y=c;
  7.     default:y=1'bx;
  8.   endcase
  9. endmodule


复制代码


RTL图,怎么样,用case也可以写出串行MUX吧?
serial_case.png


PS:添加parallel_case属性就可以综合成第一个图的结果,见证奇迹的时刻喔


不信的,请自行用Synplify 2013试验。(用Precision Synthesis也可以,但用Quartus/XST可能看不到上面的结果,因为这两个例子对综合工具的Elaborate能力要求较高。。。是不是也应该把这个例子加入QoR Benchmark)
发表于 2013-7-17 15:51:56 | 显示全部楼层


引经据典一大通,不如用Synplify 2013来试试综合结果吧。

相信理解不了if-else和case区别的人(不考虑验 ...
Timme 发表于 2013-7-16 22:35




    具体还是和代码怎么写的有关系,如果是one_hot的编码方式,会综合成并行电路,就前面的if_else
例子一样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 23:58 , Processed in 0.022074 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表