微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 位宽不匹配问题

位宽不匹配问题

时间:10-02 整理:3721RD 点击:
reg    [9:0]   a;
reg    [7:0]   b;

if(a == b + 1)  //如果 b = 255时,a与0相比较还是 与 9‘h10相比较?

这应该跟编译器是相关的,大多数时候会是与9'h100比较。
但这样写b+1的结果实际上在simulator里会是32bit的,这样比较其实也会把a扩展成32bit再比较,所以在写RTL的时候,最好把位宽都指定好了,不然遇到你指出这种情况就可能会出错,这种问题在SIM里会存在,FPGA不会存在。
另外,即使你使用a==b+1'b1也是这样,在比较的时候一定要注意比较器两端的信号位宽一定要相等。


在FPGA中不存在这种问题,意思是说quartus 等工具综合的时候会扩展成9’h100再与a相比吗?不知道DC综合后的结果会怎样呢?

DC中也不会出现这样的错误,工具一般会按照你指定的位宽合成register或做为连接register的wire,工具不可能知道你多出来线要连在哪里。但是很多simulator在仿真时会按扩展后的进行计算,这种情况下仿真会出现一些奇怪的错误,你可能会觉得工具错了,为什么8bit的register8'hff加1之后竟然不为8‘h0,这些错误也会出现在一些项目工程中,所以很多公司都会有这样的代码规范,加/减,比较等位宽要对齐。但a+1'b1除外,因为+1'b1是半加器,而8'h1就是全加器了,不过现在的工具一定会优化的,但怎么样写还是能看出你对电路的理解程度。


if(a == b + 1)  //当 b = 255时,我想要的是 与 9‘h100相比较。DC综合后是否也能得到我想要的结果呢?

可以wire [8:0] c= {1'b0, b} + 1'b1;
if(a[8:0]==c && !a[9])

综合的时候verilog会自动扩展位宽,但不要过分相信它。这样位宽不匹配的代码永远不要出现在代码里

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

if(a == b)
或if(a>b)
或if(b>a)
这些判断会不会有什么问题呢?

1、如果位宽不匹配,那么从低位开始匹配,并且工具会给出warning,告诉你位宽不匹配
2、最好按规范书写代码,否则出现问题,要负责任的



    尽量人为的控制语句执行的顺序!不要考验工具的能力!

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

网站地图

Top