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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6011|回复: 9

[讨论] 位宽不匹配问题

[复制链接]
发表于 2012-8-20 20:40:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
reg    [9:0]   a;
reg    [7:0]   b;


if(a == b + 1)  //如果 b = 255时,a与0相比较还是 与 9‘h10相比较?
发表于 2012-8-20 21:12:38 | 显示全部楼层
这应该跟编译器是相关的,大多数时候会是与9'h100比较。
但这样写b+1的结果实际上在simulator里会是32bit的,这样比较其实也会把a扩展成32bit再比较,所以在写RTL的时候,最好把位宽都指定好了,不然遇到你指出这种情况就可能会出错,这种问题在SIM里会存在,FPGA不会存在。
另外,即使你使用a==b+1'b1也是这样,在比较的时候一定要注意比较器两端的信号位宽一定要相等。
 楼主| 发表于 2012-8-20 21:19:47 | 显示全部楼层
回复 2# vongy
在FPGA中不存在这种问题,意思是说quartus 等工具综合的时候会扩展成9’h100再与a相比吗?不知道DC综合后的结果会怎样呢?
发表于 2012-8-20 21:33:31 | 显示全部楼层
DC中也不会出现这样的错误,工具一般会按照你指定的位宽合成register或做为连接register的wire,工具不可能知道你多出来线要连在哪里。但是很多simulator在仿真时会按扩展后的进行计算,这种情况下仿真会出现一些奇怪的错误,你可能会觉得工具错了,为什么8bit的register8'hff加1之后竟然不为8‘h0,这些错误也会出现在一些项目工程中,所以很多公司都会有这样的代码规范,加/减,比较等位宽要对齐。但a+1'b1除外,因为+1'b1是半加器,而8'h1就是全加器了,不过现在的工具一定会优化的,但怎么样写还是能看出你对电路的理解程度。
 楼主| 发表于 2012-8-20 21:46:22 | 显示全部楼层
回复 4# vongy

if(a == b + 1)  //当 b = 255时,我想要的是 与 9‘h100相比较。DC综合后是否也能得到我想要的结果呢?
发表于 2012-8-21 08:59:17 | 显示全部楼层
可以wire [8:0] c= {1'b0, b} + 1'b1;
if(a[8:0]==c && !a[9])
发表于 2012-8-21 09:14:14 | 显示全部楼层
综合的时候verilog会自动扩展位宽,但不要过分相信它。这样位宽不匹配的代码永远不要出现在代码里
 楼主| 发表于 2012-8-25 18:50:18 | 显示全部楼层
reg    [9:0]   a;
reg    [7:0]   b;


if(a == b)

或if(a>b)

或if(b>a)

这些判断会不会有什么问题呢?
发表于 2012-8-27 09:23:55 | 显示全部楼层
1、如果位宽不匹配,那么从低位开始匹配,并且工具会给出warning,告诉你位宽不匹配
2、最好按规范书写代码,否则出现问题,要负责任的
发表于 2012-9-9 01:29:12 | 显示全部楼层
回复 1# dp_memc


    尽量人为的控制语句执行的顺序!不要考验工具的能力!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-14 00:11 , Processed in 0.031120 second(s), 8 queries , Gzip On, Redis On.

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