微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > case语句不同写法综合结果请教

case语句不同写法综合结果请教

时间:10-02 整理:3721RD 点击:

最近对case语句一些问题不明白,查了些资料,感觉也说的不太清楚,所以请教大家:
1.第一种写法:
reg [1:0] a;
always@(posedge[/email] clk)
case(a)
2'b00: b <= ..;
2'b01: b <= ..;
2'b10: b <= ..;
2'b11: b <= ..;
endcase
2.第二种写法:
reg [1:0] a;
always@(posedge[/email] clk)
case(a)  /* synthesis full_case */
2'b00: b <= ..;
2'b01: b <= ..;
2'b10: b <= ..;
2'b11: b <= ..;
endcase
3.第三种写法:
reg [1:0] a;
always@(posedge[/email] clk)
case(a)
2'b00: b <= ..;
2'b01: b <= ..;
2'b10: b <= ..;
2'b11: b <= ..;
default:;
endcase
我的问题是:
1.第一种写法中,因为没有写入default语句,很多资料上说“可能”会引入锁存器,有的资料又说组合逻辑才会引入锁存器,时序逻辑的话会引入移位寄存器,实际上case的分支语句中已经覆盖了a所能取到的值,请问到底综合出来到底是什么结构?
2.第二种写法中加入了full_case综合指令,资料上说这个时候综合工具会避免产生锁存器,如果a出现分支语句以外的其他情况时,b的值不关心,这个不关心怎么理解?假如我把2'b11: b <= ..;这句去掉,那么当a=2'b11时,b的值是不是说可能为1也可能为0?
3.经常见到第三种这样的写法,想请问从综合结果的角度考虑,这种写法和第一种,第二种写法有什么区别?
有没有人愿意一起探讨,谢谢大家!

时序逻辑中case不全不会引入锁存器,综合器会默认default为啊a《=a。
即使是组合逻辑,第一种写法也不会引入锁存器,因为你的case已经达到了所有的branch。第三种写法综合工具会有warning说default branch无法到达。不过也没关系的
只有在组合逻辑的case中才会有full case不满足引入latch的情况出现

synthesis full_case 最好不要用,可能会造成综合和仿真不一致。如果你不了解它的具体工作原理的话

谢谢楼上2位  请问一下第三种写法和前两种有啥区别吗?

第三种设置了default也就是如果你的case不满的情况下,你设置的其他的branch为一个共同的赋值,且这个赋值是你任意设置的。第一种case不满的情况下,其他的branch都执行a<=a的语句。

哦 另外再请问下 是不是在时序逻辑中
不管是if语句没有写全else 还是case不写全default
都不会产生锁存器?
锁存器只在组合逻辑才出现?

正解,时序逻辑的写法,DC不会出LATCH。但是写的实在太烂的,可能会报仿真综合不一致的warning

我想FPGA的综合应该也差不多吧
谢谢tppxp !

FPGA综合不太清楚啊~,因为FPGA不带latch资源,所以在组合逻辑里case不全产生什么效果就不知道了,你可以自己去试试

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top